From patchwork Wed Dec 18 02:26:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 13912928 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C415AE77184 for ; Wed, 18 Dec 2024 02:26:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 395736B008A; Tue, 17 Dec 2024 21:26:35 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 047946B0095; Tue, 17 Dec 2024 21:26:34 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CE4716B008A; Tue, 17 Dec 2024 21:26:34 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 956C56B008C for ; Tue, 17 Dec 2024 21:26:34 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 3CB08C0B17 for ; Wed, 18 Dec 2024 02:26:34 +0000 (UTC) X-FDA: 82906490184.26.F74C678 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf10.hostedemail.com (Postfix) with ESMTP id DD59DC000A for ; Wed, 18 Dec 2024 02:26:18 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=rOCE0qvP; spf=none (imf10.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1734488771; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZbUYX9Sq5KIho4Fukut+jcN4YUtrDSxc8GT+CZTyNJI=; b=AjLMNmu5UEZBl2JK2O4bdZswdzIPThTHzsmHOusFvscnZ+llaSRDQIaPRBOJvkrt9mPET9 HFpFHmxg0o8nQinz5srT07reA0g0JbWqJfz4RFQ/FKrg7pGBRclc/i5HJJxvq3vLizdhfF TgPG6h/b7mf1vdDgV3CoDp9wXZH0XGk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1734488771; a=rsa-sha256; cv=none; b=rkkIiBYYm+a7aYOqMIWIKWbfGz87muB5gD5/uP526IENBdlyX7nzcC3zly3RnQiBD50Pxi Q7DfmhaCUT0az59RfwwHrsvrdZwHSkzKO2QxHJrAGxUxCj8h8sHR5lZXjVpcgkHVcytz// SQlUnr2uPBfBwAoABD8qkw0sjcLeVEE= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=rOCE0qvP; spf=none (imf10.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=quarantine) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=ZbUYX9Sq5KIho4Fukut+jcN4YUtrDSxc8GT+CZTyNJI=; b=rOCE0qvP1bit6BhC2nOW+ZmD1C MjnSDQBMGg0LebsCOfpJZS5VU+y1MF9ftXASeJHmNQu668uZk62viyqP2nWwMFil83pO0XL6VaLcc 7ebXitKACjEMvt3i+W7gaNBm8ysthbep6l4kO2V96ZIJETU/OEl0ofk9QvN1ogbhPTg9gLYq3LVfy i3b8vLmSXM3vSiaWT0vzDdfIPVuI6xps08Qj8YCSppp+iiqyXLC7IjPxC+NEq3/4A7ICfNRpO6GM4 QYbvzZjEM7IFZaFXNlhwvIVOtZZTL9Kmwf2IQlX1GUowQNUkXADtFpVK9hUCgEOLpdmccNaGqUWra 0NvGIbdA==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1tNjlc-0000000FOFb-1UCn; Wed, 18 Dec 2024 02:26:28 +0000 From: Luis Chamberlain To: hare@suse.de, willy@infradead.org, dave@stgolabs.net, david@fromorbit.com, djwong@kernel.org, kbusch@kernel.org Cc: john.g.garry@oracle.com, hch@lst.de, ritesh.list@gmail.com, linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, gost.dev@samsung.com, p.raghav@samsung.com, da.gomez@samsung.com, kernel@pankajraghav.com, mcgrof@kernel.org Subject: [PATCH 5/5] fs/buffer: reduce stack usage on bh_read_iter() Date: Tue, 17 Dec 2024 18:26:26 -0800 Message-ID: <20241218022626.3668119-6-mcgrof@kernel.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20241218022626.3668119-1-mcgrof@kernel.org> References: <20241218022626.3668119-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: DD59DC000A X-Stat-Signature: gf4xwqufzz913mu5hn9jgr56nku9q34p X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1734488778-79959 X-HE-Meta: U2FsdGVkX18P7yNIrji66WlQ0jCZ97I2KymVuvBfhFbu/TCRhpDiOOq6xUx0HngOt0HL+81rXg+bpXR3sU6oqLG1+NbdIL46ijLEJ4kBvh9yKKchFUmrFRumDGfJelkDvIHXIimS/Mn2wV6JAX3UpHEzg4nleQMk/0poeaRpSWMs5e2hKrDh6sY600QUQvqB5NAsE3VlTcOv8vRFQyzm4/yqh1puCfSfwP66ElwbMTuDadTyIoZl88lul3kvN+w9FWehf2KE6CGyjeuZq8t8IUDgrfMcrn1TedZIilQ2MekqUh0fk9b9lC14lTeF4qzGNlp6PY/VS/BaWLJ7lkVQvstd6cQgIx8kU1IkgCNu+tvRltbY4rPA8b7I0/e52KqLKDSLiedSzefdLfM6khI4WPUaxP7Hy+X2xlBnWOvFXtBMD7jSThOtn15Sm+mnJ1ytGsdVw81V/geMmLi1Q795tn7blN6unYzyU3b3uPJcssPWCiru63V2aXUT2PROsnsvJiN3zXRWdKuu+2Rmh1YuUikLygv7dRF+KDlbFkuhmdBUZCNNsv+qC7EcISSiBA7Hiags/VTSzkDA5w2RqRCdZwxLf8luyXTZ9aMkaBRF32AgFI+9iB1R5cmsp11E05NZE2321F+Nem/61fHRZppIGaeZHKZgzq6mOztu7LqFFxZWXYTwWzW+u3UxTugr6dtMTTOuCgYTBPZKo/fyD5RLOJEkuw1yhjZIJHS9Ry7FA48HpAVKbBMk4/WCMa1FAiCW0B9Zbe6My2VDjlyHWRupTsH7UzUpM5RbVZNkZkuHNT1g7sgezMPdoDUVXVBE1Lmg7ldidw8gq3n1OY/b1w9BtGVsuZtA4cf+3odS8QXjx7oiuWgDNQYCk/lfrjbjUc2vW0/ZhBoFZrfoXm4XghSDNs6AuaQxDTOsy5aE4HA4SZeOCsw/U0HuBoiLWU2IBh2A52qqRsV2fG0c6ErMmKj v7gr3U8q HW2cqyM7CN5jg3nX3GJPE/GvlQNKoXE0qgqkBL8SBfLlbVLcSNUoCtOg5iuS55czFiE33/himrCJomPtz0o1F97LBEbpVgfmjcIr4ZOa+znhtizO7Yq5CBWzB6uotSmNBkQBvL6TvYP+Q2IftVYouFkKK4W+IzJLoCu0URgR/M7B4Lc8t3hq8i9KiPy0pygL7oDLKTc12D2t9KdCYGMkaqEW79F0Wcqjbh925NLOtWQMiK3vqSfQPtlpxCcRomWOlCDFjDr1uy/5038hON28gWTh5uF1KSe/WXBCW73k62sb8qQ1M2Y8BmI1J96ofIJQnppqyMgKvWj7XAObRCCHyniZv8/NaqXdVqtx2/gM+fDGCoLObKqPLqpEO3nnINy2etI6RgHDs88AgTPF2l6Y2SVQhTSe0DUj28+m0Obs3Yv9CAFCX7Ke4GjOyVZQVV6f35S0ZDdpVXUWLCkwRkKFWVAFgpsd0LvS+5wbZMc/T607kLM7NqTPxvS8PZlPLHJT2de7BhqO8hjzOXm01GTpFkl451WiKWKbtMh3+7svRy60bxR0= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000021, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Now that we can read asynchronously buffer heads from a folio in chunks, we can chop up bh_read_iter() with a smaller array size. Use an array of 8 to avoid stack growth warnings on systems with huge base page sizes. Reviewed-by: Hannes Reinecke Signed-off-by: Luis Chamberlain --- fs/buffer.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/buffer.c b/fs/buffer.c index b8ba72f2f211..bfa9c09b8597 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2415,7 +2415,10 @@ static void bh_read_batch_async(struct folio *folio, (__tmp); \ (__tmp) = bh_next(__tmp, __head)) +#define MAX_BUF_CHUNK 8 + struct bh_iter { + int chunk_number; sector_t iblock; get_block_t *get_block; bool any_get_block_error; @@ -2424,7 +2427,7 @@ struct bh_iter { }; /* - * Reads up to MAX_BUF_PER_PAGE buffer heads at a time on a folio on the given + * Reads up to MAX_BUF_CHUNK buffer heads at a time on a folio on the given * block range iblock to lblock and helps update the number of buffer-heads * which were not uptodate or unmapped for which we issued an async read for * on iter->bh_folio_reads for the full folio. Returns the last buffer-head we @@ -2436,10 +2439,11 @@ static struct buffer_head *bh_read_iter(struct folio *folio, struct inode *inode, struct bh_iter *iter, sector_t lblock) { - struct buffer_head *arr[MAX_BUF_PER_PAGE]; + struct buffer_head *arr[MAX_BUF_CHUNK]; struct buffer_head *bh = pivot, *last; int nr = 0, i = 0; size_t blocksize = head->b_size; + int chunk_idx = MAX_BUF_CHUNK * iter->chunk_number; bool no_reads = false; bool fully_mapped = false; @@ -2447,7 +2451,8 @@ static struct buffer_head *bh_read_iter(struct folio *folio, /* collect buffers not uptodate and not mapped yet */ for_each_bh_pivot(bh, last, head) { - BUG_ON(nr >= MAX_BUF_PER_PAGE); + if (nr >= MAX_BUF_CHUNK) + break; if (buffer_uptodate(bh)) { iter->iblock++; @@ -2487,8 +2492,7 @@ static struct buffer_head *bh_read_iter(struct folio *folio, } iter->bh_folio_reads += nr; - - WARN_ON_ONCE(!bh_is_last(last, head)); + iter->chunk_number++; if (bh_is_last(last, head)) { if (!iter->bh_folio_reads) @@ -2518,6 +2522,7 @@ int block_read_full_folio(struct folio *folio, get_block_t *get_block) struct buffer_head *bh, *head; struct bh_iter iter = { .get_block = get_block, + .chunk_number = 0, .unmapped = 0, .any_get_block_error = false, .bh_folio_reads = 0,