Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp5629855pxb; Mon, 28 Mar 2022 15:12:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwZDlS55jgMrpFKEVIDxMBlUM2O5wwjMqow9MA22qDYjl+69vRcmuuyaoQM3FuGdVqdodGP X-Received: by 2002:a05:6808:1302:b0:2da:8684:7bc4 with SMTP id y2-20020a056808130200b002da86847bc4mr719681oiv.23.1648505538192; Mon, 28 Mar 2022 15:12:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648505538; cv=none; d=google.com; s=arc-20160816; b=pSZCoYVsMtC7V7ZnRkckfsmvPjOF9ueQlDe7uksq5wyS9vMPxp7C8GcV7TOOU9D752 LXLKInMbNlmlfc82BAotWKm/GvQinU59ojtVaUs/JNKPzTvsjWNj1dsFvQ2qWPmWRDra kEXZdesu1UolAf/jKcXayx5lhPI1NjyXwC2va0GgF4zoCMGIwL8jv6W33sbP5XiAow/g TOHS1O6bwny0h4955n/cagCQMUnx4vs2ApwSGzqmDb1+uYZn0WwRffdu3Yey1VT3/jTF 5RmVBsAv46iJY7XHFXny0iU0/5gKHz1DBHET+/z6Ypp6PyQf7cW+wSWxXuE5gi3tq5aP 8kAw== 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=dbs+Oef6ffYhzDpU7TQBTJua8kT3Zy/quJG0s7fk9IQ=; b=t66M4v4VCFU+HOVm2a9VjBavpC8moJY7R6wfTs/uqlA+M5HjF9AIqJ4rpAaOgOsiXD tS0oU2t7Gzps7/vSJP51A8arww4uxwngvv42IcvVxPMS+HFLpPNzE7sHJdbadhEuZCUU bCOR5r0uxBc6MHp3/gzJPNN6qU9Ihpzo/adQ89+56hREYhkQ4o/7ykY+vh2i9kPzDtCn 8L3hvk/qqLPRHou8Upp0d+sDMQYkfKD8DoNkSPExyWGwVPz4B1x0+QlA4JnpRfeMFZst 7GybTR+C5Z4OsXYSAiuvsGWv4v+SS25bMtZ5aWAzMCEeg4tN+77pWKh/n1p0ty/AM4fd toIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (bad format) header.i=@dorminy.me header.s=mail header.b=hsDCL2Tl; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 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. [23.128.96.19]) by mx.google.com with ESMTPS id y21-20020a9d6355000000b005cb2fc137a4si10962602otk.32.2022.03.28.15.12.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:12:18 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=neutral (bad format) header.i=@dorminy.me header.s=mail header.b=hsDCL2Tl; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 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 9310216AA71; Mon, 28 Mar 2022 14:32:07 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344384AbiC1UQX (ORCPT + 99 others); Mon, 28 Mar 2022 16:16:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344337AbiC1UQT (ORCPT ); Mon, 28 Mar 2022 16:16:19 -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 8527D27170; Mon, 28 Mar 2022 13:14:36 -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 F291D806B7; Mon, 28 Mar 2022 16:14:35 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=dorminy.me; s=mail; t=1648498476; bh=2bUR5RKViaX8SfbfpxT73b8DjBpuhwRa7cVPxAtx/6w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hsDCL2Tl8mA9FyUPuqPxAWP5cVNeY0rH39m8oVf6XV0DTWycWgBl319eBc75KsY17 v5UsddxghGXwIVRUYWL+3XfL7Rt+01E5bouWImkd5DIhNoHquffIH5mXThxVOENGPL SlptkK2XFMg1mJNaIjaiS2mIc+j3pFcSfvzAcCfZex7jO8Bjh1q97Q50TwydLWjtnW s4+gMkXWFvrDfFBc1RZLW6tlJQj4qrcSzPbfYLkVnIPRKEE36WmWa0ER+4RK1qJFQ1 TJcbkAmwR/3cTa9n+uUyjqq1N479s/NvaaRTGNn3Pqe6OWjZKEanFn18Vi5mCmzcsE 85C1zMNzs3DWw== 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 Subject: [PATCH 2/2] btrfs: Allocate page arrays using bulk page allocator. Date: Mon, 28 Mar 2022 16:14:28 -0400 Message-Id: <9cbd861d3b302e19b990848ea747d2ea91d01aed.1648497027.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 --- fs/btrfs/ctree.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 4e81e75c8e7c..37711a66e726 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -102,17 +102,24 @@ void btrfs_free_path(struct btrfs_path *p) */ 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