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 9E3B5C61CE8 for ; Mon, 9 Jun 2025 15:48:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 39E326B0096; Mon, 9 Jun 2025 11:48:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 34E076B0098; Mon, 9 Jun 2025 11:48:07 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 28BA66B0099; Mon, 9 Jun 2025 11:48:07 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 086C26B0096 for ; Mon, 9 Jun 2025 11:48:07 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 9F6941A0958 for ; Mon, 9 Jun 2025 15:48:06 +0000 (UTC) X-FDA: 83536293372.02.E44F000 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf11.hostedemail.com (Postfix) with ESMTP id CDC3840007 for ; Mon, 9 Jun 2025 15:48:04 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=aJtQSXRk; spf=pass (imf11.hostedemail.com: domain of djwong@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=djwong@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749484084; 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=9cywBpravq9fxnwyMa5a+F8cPkx1E9SrZyj52hEJ56k=; b=Nu2jbCX8EHNFxxnuYYugTOzh8gz0WGjdvD0pVvIJAD659eRYd6m3Pef47wg7kjW4jVCJ1z KLjnZYKBCnrkyvf0dGjBh1tucNiaWLbiMzrvx31k9jYkKIFZWr/NZX7/STgodoDzML2Z/u Ah6d/CpoYMl0j2GTFEEcUcyVzImFuuY= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=aJtQSXRk; spf=pass (imf11.hostedemail.com: domain of djwong@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=djwong@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749484084; a=rsa-sha256; cv=none; b=CP0vBqYQJsoxi1an0Ir7zNHQvMnku8T67c6Y8pY5r670jkY86vly263gveY20gNh+x+RGf ijU38tbU8srxgqgfI6t8K5SBC15dbZzz08siK4eByWWVwVydIxlSjyIAVUYlpeUpSmSNvY zffOf6xQsF8LbB/fbVfI87xmY6bQa0c= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id E51615C1080; Mon, 9 Jun 2025 15:45:46 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4046EC4CEEB; Mon, 9 Jun 2025 15:48:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749484083; bh=lif/CBsWAXaIRHNW7WKES1+sUcI6rXNxbmHDIuO+9Sc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=aJtQSXRkyw2TIn63fFDQJyQQ+0U7YVwHzFuvN2StSQz0lmO110FkF5+pQwAQnoHpd o8G0iebZJDejJ7muW/UBhrbtUDxAz7KpsmoqOEe/XFhH4tcTGF5zfD7wWbakobFQF9 3CM2qxzAR+PR25WfNFpaAZ4dSLEns4Dsehbxi/oV1mqxrZqEmcYp+LqqnBNyBaMSpi WGXYmcgS/mUpcKbhIh277dzWD7EpGLeeBS8lQFlW/2MjSqdr51LnKYt0iFeEAg4Bd5 X7V9QHeSC1cEsttBufwmFGn/zUN/Sbrolq/b14mE0MzrtY4zYoBWrlfLKZk4DOvrw4 RPi0f7BN3olWg== Date: Mon, 9 Jun 2025 08:48:02 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-mm@kvack.org Subject: Re: [PATCH 2/7] filemap: add helper to look up dirty folios in a range Message-ID: <20250609154802.GB6156@frogsfrogsfrogs> References: <20250605173357.579720-1-bfoster@redhat.com> <20250605173357.579720-3-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20250605173357.579720-3-bfoster@redhat.com> X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: CDC3840007 X-Stat-Signature: zfi66tu4mpxnh64sgek9a7erpw9btj33 X-Rspam-User: X-HE-Tag: 1749484084-120880 X-HE-Meta: U2FsdGVkX1/Rv7cjudjVGMZlPfxsRs8t1cUf4V+KgQ+SgtmkVuhjqIKNjFW6Xmw6KQy51VpOuQShq9dkgCvbPoXIGF8NBnOqguIHXqG5RxQ0u7Jt997I2cAFrvf/PPifhqY1gw5LZA3sRrSsz59s8z3wa+Y0hQQ3CQpyq7rPA9GCEjkNqid1RjSXyZjh7OiZz8+qevsmyRpBKEjIXO/Fv0hwMdNWYuc/PfR6XFlvrOZvWvsedrhdcVTvB+sddrqDyw6x5Iu8o9bm6uoSjC+sg5ZuaOZKN2+8MlRBbD6lnIp2cAGCYErDW6E7nI1vqC51IgBh64JhYn6NwIkPQGqYQ9xjm4inSFdc9fHaQ3JzpOBbs4rli4l+WzpjRp9pKuKR+Efzv+/yMETVSxc62MXArc7PpYS+kbxDCbc24Fr5DCPt0mKtIuOHcf4EwTpjFF/b0RD7x34266sN3dziaKK6InUi1qhdnNrgLzARpEov0EO9AzFjcRCeLxAUqTNrot6IotWP5wFL00LxOKvs/I/rLN7JTaev0v7g0JO2lnoyiWHDoHPObZH3vpr8JUoAbt8NPdzYtci5HwiW4OmiU5ShYbHDF7XfsXn5iKc/sB31eNL6g9Q8NmvU2N2qTWcplqJz4R2Z3/GmHncgmDXR3nBldQNO2o7Hu0GBTOelqvkKOWW5RPwjIwFQDzATRCaHq7oNLR1+gGdPxRfEF3c9dNQeffoo27m/VNlAJQVlat8Tl+QGRfB6IYi9ZQtpYU10bKKzFh6EHsa3vIexNSLzUjVI0JYUJ71+R244QYPP0V5MSis7sUSpIHVpnPCjxoHVUlRyJ0Ir2xFK7GQ0LMd0ZQ5BmeKzRKfpDG3pSpS62efRTiLld5ghhUUPNOnN69cuCtuvOtCJt1pTYF/aYISVjgy8ukuIggGySXNgsuUGswx/JcW6670t5aAafN8r9ygyLx6h6kIGeXiJizFHuiG4D0a UQRt48P0 wkT9zEQ257nK65ykRsRXvFjAcE6BxCIpm0vgdI3tm+uMbztOnD6OvEY5/h9FyGri4h8VMzOL5BmEWE24aA0IVKYOi/YaBwpcB/10Xu1XrA+3evGpUufeTDakefb11MY4REijEsJOFd1eRzYj7ZWIjrtVangne3if0AGd4rM7/ZAaAs3WacA3V0/citQIEUkLL5X8Zxb5kwEvxflFVRlG4oceU2rAUiEZ2TjBpdBosTAaudobJqom6yG+oYGToPXlKNM4wQC5A0VfGWravaJ9gYIdQ6A== 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 Thu, Jun 05, 2025 at 01:33:52PM -0400, Brian Foster wrote: > Add a new filemap_get_folios_dirty() helper to look up existing dirty > folios in a range and add them to a folio_batch. This is to support > optimization of certain iomap operations that only care about dirty > folios in a target range. For example, zero range only zeroes the subset > of dirty pages over unwritten mappings, seek hole/data may use similar > logic in the future, etc. > > Note that the helper is intended for use under internal fs locks. > Therefore it trylocks folios in order to filter out clean folios. > This loosely follows the logic from filemap_range_has_writeback(). > > Signed-off-by: Brian Foster You might want to cc willy directly on this one... > --- > include/linux/pagemap.h | 2 ++ > mm/filemap.c | 42 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 44 insertions(+) > > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h > index e63fbfbd5b0f..fb83ddf26621 100644 > --- a/include/linux/pagemap.h > +++ b/include/linux/pagemap.h > @@ -941,6 +941,8 @@ unsigned filemap_get_folios_contig(struct address_space *mapping, > pgoff_t *start, pgoff_t end, struct folio_batch *fbatch); > unsigned filemap_get_folios_tag(struct address_space *mapping, pgoff_t *start, > pgoff_t end, xa_mark_t tag, struct folio_batch *fbatch); > +unsigned filemap_get_folios_dirty(struct address_space *mapping, > + pgoff_t *start, pgoff_t end, struct folio_batch *fbatch); > > /* > * Returns locked page at given index in given cache, creating it if needed. > diff --git a/mm/filemap.c b/mm/filemap.c > index bada249b9fb7..d28e984cdfd4 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -2334,6 +2334,48 @@ unsigned filemap_get_folios_tag(struct address_space *mapping, pgoff_t *start, > } > EXPORT_SYMBOL(filemap_get_folios_tag); > > +unsigned filemap_get_folios_dirty(struct address_space *mapping, pgoff_t *start, > + pgoff_t end, struct folio_batch *fbatch) This ought to have a comment explaining what the function does. It identifies every folio starting at @*start and ending before @end that is dirty and tries to assign them to @fbatch, right? The code looks reasonable to me; hopefully there aren't some subtleties that I'm missing here :P > +{ > + XA_STATE(xas, &mapping->i_pages, *start); > + struct folio *folio; > + > + rcu_read_lock(); > + while ((folio = find_get_entry(&xas, end, XA_PRESENT)) != NULL) { > + if (xa_is_value(folio)) > + continue; > + if (folio_trylock(folio)) { > + bool clean = !folio_test_dirty(folio) && > + !folio_test_writeback(folio); > + folio_unlock(folio); > + if (clean) { > + folio_put(folio); > + continue; > + } > + } > + if (!folio_batch_add(fbatch, folio)) { > + unsigned long nr = folio_nr_pages(folio); > + *start = folio->index + nr; > + goto out; > + } > + } > + /* > + * We come here when there is no page beyond @end. We take care to not ...no folio beyond @end? --D > + * overflow the index @start as it confuses some of the callers. This > + * breaks the iteration when there is a page at index -1 but that is > + * already broke anyway. > + */ > + if (end == (pgoff_t)-1) > + *start = (pgoff_t)-1; > + else > + *start = end + 1; > +out: > + rcu_read_unlock(); > + > + return folio_batch_count(fbatch); > +} > +EXPORT_SYMBOL(filemap_get_folios_dirty); > + > /* > * CD/DVDs are error prone. When a medium error occurs, the driver may fail > * a _large_ part of the i/o request. Imagine the worst scenario: > -- > 2.49.0 > >