Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp16701pxb; Wed, 30 Mar 2022 21:34:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy3h3dEBJetOybBMlercvxpL9GE7vtWSEL9iqG3T6sRdNkqcnh/bGe9/LYx6yldCKnAygH3 X-Received: by 2002:a17:90b:1d02:b0:1c7:1802:c00e with SMTP id on2-20020a17090b1d0200b001c71802c00emr3849855pjb.99.1648701278117; Wed, 30 Mar 2022 21:34:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648701278; cv=none; d=google.com; s=arc-20160816; b=kBpUoR0DgTWj9yx1BcMGoRiRwMgXoiOdwXX3X349zr3IP6p4NkW3BVgwoJegQPGWzy GcyYUvCe3IJLv/RHZjF9WKG9BttyNLfdBn1qXBPdwOkIijfHp1dm6eO5plFm7QSZm47p 1ie9o4ITljzMGIDxtfxXeiJb72tW/oAxUryI+bxBLc1q1rT+4nO9b48p7sl0KWdTEShQ kx8U0wBq4m2wXye6s0ia/38/96jp+Cw0nlqnMjnqIMwQOvnypePPFarbrZfBra+XZ9u3 gYJDvqK8HSQfRk97ei+2i4FMf4iJUMnkHXhriivioubm9ng4wDH1Q1tf49UlWYj5a0Cv uXow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3aQe3Rn8cAu/kbYbEIrA7i9Vbl/9oL3E/G2oi6M5Qc0=; b=Uxv/EnlYspwGJkoB1gw3JxGCR0zeP2Df8Sc8PB2+7Oez3QLgH1gM4OlnYvzZQrGMqn CzESZD+RORLU/vbOIhhMYZwGZdSbq+DkM/dM4Ahn58Gr8n0Op+LjDWbp0yhQWBSiQAsf QT6oihebQNj9cc6piEH53ICido3wC+lHAcEzQgeND6DpAnXoCqykLFkjeVBkOUq02gkJ rKDe3yEF9kLt+5IcicnAW8yAlTHvCbx4bUtPsOINyxx5dP5MJioCXO0Q9723uTvkt9PX 9QGblk6G24wiEevCsVNSBi7l0lUwaUAIMipUU9IhXiLhl741zg4gDz9Bn/Uag/hV7xLN BgnA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (bad format) header.i=@dorminy.me header.s=mail header.b=Rn+gCgUJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=dorminy.me Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id g9-20020a170902c98900b00153b2d165c2si20396267plc.458.2022.03.30.21.34.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 21:34:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=neutral (bad format) header.i=@dorminy.me header.s=mail header.b=Rn+gCgUJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=dorminy.me Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 271C211862A; Wed, 30 Mar 2022 20:27:54 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348944AbiC3QqS (ORCPT + 99 others); Wed, 30 Mar 2022 12:46:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36216 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348916AbiC3QqG (ORCPT ); Wed, 30 Mar 2022 12:46:06 -0400 Received: from box.fidei.email (box.fidei.email [IPv6:2605:2700:0:2:a800:ff:feba:dc44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D94C71D7639; Wed, 30 Mar 2022 09:44:20 -0700 (PDT) Received: from authenticated-user (box.fidei.email [71.19.144.250]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by box.fidei.email (Postfix) with ESMTPSA id BB99680505; Wed, 30 Mar 2022 12:44:19 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=dorminy.me; s=mail; t=1648658660; bh=2vDZxqOwL/Uguo0MetysoT9MQskq4w66hKhbgUWx4og=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Rn+gCgUJHYnJ6pCRofwXqyQz3swpxn7noQEe3+0hH1LkMbrG+XvFVzC5D7f07BYvD AfgTpZMFnIZ7ScM3MuMXwQtZGa3MoYU5qOVAA6NEQUAFR2Eyagc4aFYuzpg/kRabp6 N53wUyWHbvjdw1it1W3DLoopUnHCFSl5piMgdwFoLX0BVvTfSaAvy4np5Cm7EfoXZv 6wLUH0oILhDsd62mIQIkGJbnAa6jU+2JVGCY3NdKJD/5NUMUnNcFt334KHLXawc2xS g65TSbNQobORSO8nxioGjhqvj7frTguZIafak1KFOni7/QC+MNmwRUWsrfdWqbxF9e ZzjtrSJyWDIKg== From: Sweet Tea Dorminy To: Chris Mason , Josef Bacik , David Sterba , Nick Terrell , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, kernel-team@fb.com Cc: Sweet Tea Dorminy , Nikolay Borisov Subject: [PATCH v2 2/2] btrfs: allocate page arrays using bulk page allocator Date: Wed, 30 Mar 2022 12:44:07 -0400 Message-Id: <4a0be376555602a8ee07b3cb58add0efcce3abd5.1648658236.git.sweettea-kernel@dorminy.me> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org While calling alloc_page() in a loop is an effective way to populate an array of pages, the kernel provides a method to allocate pages in bulk. alloc_pages_bulk_array() populates the NULL slots in a page array, trying to grab more than one page at a time. Unfortunately, it doesn't guarantee allocating all slots in the array, but it's easy to call it in a loop and return an error if no progress occurs. Similar code can be found in xfs/xfs_buf.c:xfs_buf_alloc_pages(). Signed-off-by: Sweet Tea Dorminy Reviewed-by: Nikolay Borisov --- Changes in v2: - Moved from ctree.c to extent_io.c --- fs/btrfs/extent_io.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 5700fcc23271..52abad421ba1 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3144,17 +3144,24 @@ static void end_bio_extent_readpage(struct bio *bio) */ int btrfs_alloc_page_array(unsigned long nr_pages, struct page **page_array) { - int i; - for (i = 0; i < nr_pages; i++) { - struct page *page; - if (page_array[i]) + long allocated = 0; + for (;;) { + long last = allocated; + + allocated = alloc_pages_bulk_array(GFP_NOFS, nr_pages, + page_array); + if (allocated == nr_pages) + return 0; + + if (allocated != last) continue; - page = alloc_page(GFP_NOFS); - if (!page) - return -ENOMEM; - page_array[i] = page; + /* + * During this iteration, no page could be allocated, even + * though alloc_pages_bulk_array() falls back to alloc_page() + * if it could not bulk-allocate. So we must be out of memory. + */ + return -ENOMEM; } - return 0; } /* -- 2.35.1