From mboxrd@z Thu Jan 1 00:00:00 1970 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 A98A6C021A9 for ; Mon, 17 Feb 2025 21:40:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3EEED280098; Mon, 17 Feb 2025 16:40:12 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 39E4F2800A4; Mon, 17 Feb 2025 16:40:12 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 267CD280098; Mon, 17 Feb 2025 16:40:12 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 0EE632800A4 for ; Mon, 17 Feb 2025 16:40:12 -0500 (EST) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 824BF120497 for ; Mon, 17 Feb 2025 21:40:11 +0000 (UTC) X-FDA: 83130755022.25.EB42F5C Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf01.hostedemail.com (Postfix) with ESMTP id 8C77140007 for ; Mon, 17 Feb 2025 21:40:09 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=P9L6uob3; dmarc=none; spf=none (imf01.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739828410; a=rsa-sha256; cv=none; b=QCSUHGySqef3HsxoP3H2Gt6BtCcduXTdLR9ZtJ3qxj3Ajg6aNvLCq5295/UwhAqDqCgZ63 FcmmhyIJ9bAvVM+hUmEwLoGknSe8hgHCif/3OfNKOL9nmiHTKWMkI5ocbfioBpBs1739HY V1fAdHuTZ9OjIRHO+T0iJOGOqfgSGy8= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=P9L6uob3; dmarc=none; spf=none (imf01.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739828410; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=KY8nyubrU5h1fWAeCYwM70hwEZhksrwYllCElbQXlTA=; b=FxEzkGImFoLIctKLRKNXqtGW708XM8uyFD2ok2U27TEloMEUHjFsEQXITcs1271uvR8a4c DJqfumrnSGXCp9RwhkkLko9GVoLPO5NLSXvgNKXZGOyKhzP6B9c+ZS1A83NptXdLmHP5V0 AcYHKhZjJcc95wJEqssOh4y7d7Xttns= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=KY8nyubrU5h1fWAeCYwM70hwEZhksrwYllCElbQXlTA=; b=P9L6uob3gnsA9z7fl3KVtM5ac1 eVA7gQ/xKeKMmu5K/T68/i7b2E7FfiSjoVn6j7pKgh1O40M1rEvWGcgf0YGXHMmfNYX9En37jJpGL xJke9LGh+DVVO0EVQkQSfA1rd53OPsx3VcQIvnbmvmp07QmR4qh9BUkbrFKWhXoVaQSb++xbVU/mF 24r9uZvwgbLme2F5nkNGmATd66YThEBl6PsgnKbzWDOwoeryQSd3vmhFu8vUAM8HH1JzvQlJFnLoL I7nRalertEjJ+MhNEKuVc926mVYTTIqe7kRm/bmHIwsNSzKmmGj4EWlykONbrj0JHXU6bgX8klIr8 3z46BjHw==; Received: from willy by casper.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1tk8qO-00000001yqZ-0ysr; Mon, 17 Feb 2025 21:40:00 +0000 Date: Mon, 17 Feb 2025 21:40:00 +0000 From: Matthew Wilcox To: Luis Chamberlain Cc: hare@suse.de, dave@stgolabs.net, david@fromorbit.com, djwong@kernel.org, kbusch@kernel.org, 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 Subject: Re: [PATCH v2 2/8] fs/buffer: remove batching from async read Message-ID: References: <20250204231209.429356-1-mcgrof@kernel.org> <20250204231209.429356-3-mcgrof@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20250204231209.429356-3-mcgrof@kernel.org> X-Rspam-User: X-Rspamd-Queue-Id: 8C77140007 X-Rspamd-Server: rspam12 X-Stat-Signature: wew3wpdfnx6njoi13e4p6ks9pnk1oi86 X-HE-Tag: 1739828409-169053 X-HE-Meta: U2FsdGVkX18EKIBAHSoqo8QjPvUqxntJDTqx+pMOtJFSokn7LG2eWAXsvxKZxd33AJAds4OIyG/IJyGEMuD4u7/GLqZr5VNujHzD4tiBK3Mg3Tf9m423hFHX9EdqM3QcjVAiYC/YTXQWmmInO7pNQJvri4MzLGyBeiw6J6znoxqNBanCrjzyxmKCQPXLCvf8dK9U6Bzuy8J4RxQ1rrN/cSU9AHfeNro30KHYAfv+QDWobykpi+qYJa5e2FPVK7brpQYEI3UKOdrAAvkMZykYtGTB+GvkaWRLGD9IwH83B9MfgjoIwTipH5EqXy9bRJukRlsjkKrS1ZIuOUA+TzjX82J9XPWa9cs74gVa4Ig0UVOfj8ty/matu3syDI9gvDO4HmDEpoCuxaxmrgZKysYO0n1p1uiwHFRVJcODxFZdhzhZi4I7kw66UKMMyAh4qNODnsCt5QaI/GdzV1+ycdEVRVrT/U5oYWikIyTq2CVN/ut/HGkfhOYNLKnIjWK2Gz47/AgcFBhaY97gesjWpBcocyrrQu1G+KpHEtA6OZjmwujnC5cjx25EJH/9wwrpvec/2cEK8Ngc2peTERJ/ARO06R463Baigtwz9E+ALuZTx5mo2E7bmCml7vHXucp/d0IdvO8muMkm1LeMD9Q3LPV0CLWz2naeawh/5R3WD2Cbdo7EmDgVSV95WKMhgJlv53wR5g9gfV1L/uzXaK3WNZYlLofAeXxoIDOaSu2j0sHP85pN11kr19lTwwXX2f1Ix6i2aJ9dRzcFWDYK8ZrgHveqOXXAVDoq5HeszdIQmMHAVmrtHkq3AxqbNGTt6ZUxYCtOV7RI0aRECiK8mZkFj6Uor74IYlQPIFkKs/8xU4Tbf+9DKKGIk6UxCtS1Vo0jqtvDcx0NSXWqLbXIZRNo8CytnGRCPOFs2fQpQPZZuGs2OGCupzwHYx1q3xBjDVcHFTgjOlTLQKP0ye8ry/AvLLB 1ronfnOG OMCOAaF4XYW7LfvNmm2BcpBuStxg0UyGu4fdKx5PVNh+do1C6eh1xAbpneLsz+/hFLQWkrWHaHs+4DgIycy4/VNB1tWK9YepjxliMSz/BlbYDNdijv13kFius3sEpEHAFZsrqKwSVW6JQMlLNVks0hnRuEMGrsFRCozNJJCqlirdBLGHj/EQrUyspkTI50ms6AOYTW058KuRQ+bp75WxF5pEvo7qRRkuETfk2SEDEtEq9Q9oMcdr/QAxWBBVWOm8voKLMx/YwMo/SVFY0gUsC3QngWPrH4yQXR+B7tNAY4e06nfY+H6IynGTxpkF2X/RczlYeP6+sa8Mbfvqjg7TFqCTvr2Kfly8hffP9RL23e6hNlFjpTtsbxPdF5jcqUuwdu+cV4PMvhWDUlPA= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, Feb 04, 2025 at 03:12:03PM -0800, Luis Chamberlain wrote: > From: Matthew Wilcox From: Matthew Wilcox (Oracle) block_read_full_folio() currently puts all !uptodate buffers into an array allocated on the stack, then iterates over it twice, first locking the buffers and then submitting them for read. We want to remove this array because it occupies too much stack space on configurations with a larger PAGE_SIZE (eg 512 bytes with 8 byte pointers and a 64KiB PAGE_SIZE). We cannot simply submit buffer heads as we find them as the completion handler needs to be able to tell when all reads are finished, so it can end the folio read. So we keep one buffer in reserve (using the 'prev' variable) until the end of the function. Signed-off-by: Matthew Wilcox (Oracle) > diff --git a/fs/buffer.c b/fs/buffer.c > index b99560e8a142..167fa3e33566 100644 > --- a/fs/buffer.c > +++ b/fs/buffer.c > @@ -2361,9 +2361,8 @@ int block_read_full_folio(struct folio *folio, get_block_t *get_block) > { > struct inode *inode = folio->mapping->host; > sector_t iblock, lblock; > - struct buffer_head *bh, *head, *arr[MAX_BUF_PER_PAGE]; > + struct buffer_head *bh, *head, *prev = NULL; > size_t blocksize; > - int nr, i; > int fully_mapped = 1; > bool page_error = false; > loff_t limit = i_size_read(inode); > @@ -2380,7 +2379,6 @@ int block_read_full_folio(struct folio *folio, get_block_t *get_block) > iblock = div_u64(folio_pos(folio), blocksize); > lblock = div_u64(limit + blocksize - 1, blocksize); > bh = head; > - nr = 0; > > do { > if (buffer_uptodate(bh)) > @@ -2410,40 +2408,33 @@ int block_read_full_folio(struct folio *folio, get_block_t *get_block) > if (buffer_uptodate(bh)) > continue; > } > - arr[nr++] = bh; > + > + lock_buffer(bh); > + if (buffer_uptodate(bh)) { > + unlock_buffer(bh); > + continue; > + } > + > + mark_buffer_async_read(bh); > + if (prev) > + submit_bh(REQ_OP_READ, prev); > + prev = bh; > } while (iblock++, (bh = bh->b_this_page) != head); > > if (fully_mapped) > folio_set_mappedtodisk(folio); > > - if (!nr) { > - /* > - * All buffers are uptodate or get_block() returned an > - * error when trying to map them - we can finish the read. > - */ > - folio_end_read(folio, !page_error); > - return 0; > - } > - > - /* Stage two: lock the buffers */ > - for (i = 0; i < nr; i++) { > - bh = arr[i]; > - lock_buffer(bh); > - mark_buffer_async_read(bh); > - } > - > /* > - * Stage 3: start the IO. Check for uptodateness > - * inside the buffer lock in case another process reading > - * the underlying blockdev brought it uptodate (the sct fix). > + * All buffers are uptodate or get_block() returned an error > + * when trying to map them - we must finish the read because > + * end_buffer_async_read() will never be called on any buffer > + * in this folio. > */ > - for (i = 0; i < nr; i++) { > - bh = arr[i]; > - if (buffer_uptodate(bh)) > - end_buffer_async_read(bh, 1); > - else > - submit_bh(REQ_OP_READ, bh); > - } > + if (prev) > + submit_bh(REQ_OP_READ, prev); > + else > + folio_end_read(folio, !page_error); > + > return 0; > } > EXPORT_SYMBOL(block_read_full_folio); > -- > 2.45.2 >