All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <jonathan.cameron@huawei.com>
To: John Groves <john@jagalactic.com>
Cc: John Groves <John@Groves.net>, Miklos Szeredi <miklos@szeredi.hu>,
	"Dan Williams" <dan.j.williams@intel.com>,
	Bernd Schubert <bschubert@ddn.com>,
	Alison Schofield <alison.schofield@intel.com>,
	John Groves <jgroves@micron.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Shuah Khan <skhan@linuxfoundation.org>,
	Vishal Verma <vishal.l.verma@intel.com>,
	"Dave Jiang" <dave.jiang@intel.com>,
	Matthew Wilcox <willy@infradead.org>, "Jan Kara" <jack@suse.cz>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	"David Hildenbrand" <david@kernel.org>,
	Christian Brauner <brauner@kernel.org>,
	"Darrick J . Wong" <djwong@kernel.org>,
	Randy Dunlap <rdunlap@infradead.org>,
	Jeff Layton <jlayton@kernel.org>,
	Amir Goldstein <amir73il@gmail.com>,
	Stefan Hajnoczi <shajnocz@redhat.com>,
	Joanne Koong <joannelkoong@gmail.com>,
	Josef Bacik <josef@toxicpanda.com>,
	Bagas Sanjaya <bagasdotme@gmail.com>,
	Chen Linxuan <chenlinxuan@uniontech.com>,
	"James Morse" <james.morse@arm.com>,
	Fuad Tabba <tabba@google.com>,
	"Sean Christopherson" <seanjc@google.com>,
	Shivank Garg <shivankg@amd.com>,
	Ackerley Tng <ackerleytng@google.com>,
	Gregory Price <gourry@gourry.net>,
	Aravind Ramesh <arramesh@micron.com>,
	Ajay Joshi <ajayjoshi@micron.com>,
	"venkataravis@micron.com" <venkataravis@micron.com>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"nvdimm@lists.linux.dev" <nvdimm@lists.linux.dev>,
	"linux-cxl@vger.kernel.org" <linux-cxl@vger.kernel.org>,
	"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
	Ira Weiny <ira.weiny@intel.com>
Subject: Re: [PATCH V9 2/8] dax: Factor out dax_folio_reset_order() helper
Date: Tue, 24 Mar 2026 14:23:46 +0000	[thread overview]
Message-ID: <20260324142346.00002edc@huawei.com> (raw)
In-Reply-To: <0100019d1d47285f-eedfbde4-0f74-4356-b694-4b44fab92f2c-000000@email.amazonses.com>

On Tue, 24 Mar 2026 00:38:15 +0000
John Groves <john@jagalactic.com> wrote:

> From: John Groves <John@Groves.net>
> 
> Both fs/dax.c:dax_folio_put() and drivers/dax/fsdev.c:
> fsdev_clear_folio_state() (the latter coming in the next commit after this
> one) contain nearly identical code to reset a compound DAX folio back to
> order-0 pages. Factor this out into a shared helper function.
> 
> The new dax_folio_reset_order() function:
> - Clears the folio's mapping and share count
> - Resets compound folio state via folio_reset_order()
> - Clears PageHead and compound_head for each sub-page
> - Restores the pgmap pointer for each resulting order-0 folio
> - Returns the original folio order (for callers that need to advance by
>   that many pages)
> 
> Two intentional differences from the original dax_folio_put() logic:
> 
> 1. folio->share is cleared unconditionally. This is correct because the DAX
>    subsystem maintains the invariant that share != 0 only when mapping == NULL
>    (enforced by dax_folio_make_shared()). dax_folio_put() ensures share has
>    reached zero before calling this helper, so the unconditional clear is safe.
> 
> 2. folio->pgmap is now explicitly restored for order-0 folios. For the
>    dax_folio_put() caller this is a no-op (reads and writes back the same
>    field). It is intentional for the upcoming fsdev_clear_folio_state()
>    caller, which converts previously-compound folios and needs pgmap
>    re-established for all pages regardless of order.
> 
> This simplifies fsdev_clear_folio_state() from ~50 lines to ~15 lines.
> 
> Suggested-by: Jonathan Cameron <jonathan.cameron@huawei.com>
A couple of trivial "if you are respinning" line length of comments
comments inline.
Subject to DAX folk sanity checking the new comments match their
expectations.

Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>


> Reviewed-by: Ira Weiny <ira.weiny@intel.com>
> Reviewed-by: Dave Jiang <dave.jiang@intel.com>
> Signed-off-by: John Groves <john@groves.net>
> ---
>  fs/dax.c            | 74 ++++++++++++++++++++++++++++++++++-----------
>  include/linux/dax.h |  1 +
>  2 files changed, 57 insertions(+), 18 deletions(-)
> 
> diff --git a/fs/dax.c b/fs/dax.c
> index 289e6254aa30..eba86802a7a7 100644
> --- a/fs/dax.c
> +++ b/fs/dax.c
> @@ -378,6 +378,59 @@ static void dax_folio_make_shared(struct folio *folio)
>  	folio->share = 1;
>  }
>  
> +/**
> + * dax_folio_reset_order - Reset a compound DAX folio to order-0 pages
> + * @folio: The folio to reset
> + *
> + * Splits a compound folio back into individual order-0 pages,
> + * clearing compound state and restoring pgmap pointers.
> + *
> + * Returns: the original folio order (0 if already order-0)
> + */
> +int dax_folio_reset_order(struct folio *folio)
> +{
> +	struct dev_pagemap *pgmap = page_pgmap(&folio->page);
> +	int order = folio_order(folio);
> +
> +	/*
> +	 * DAX maintains the invariant that folio->share != 0 only when
> +	 * folio->mapping == NULL (enforced by dax_folio_make_shared()).
> +	 * Equivalently: folio->mapping != NULL implies folio->share == 0.
> +	 * Callers ensure share has been decremented to zero before
> +	 * calling here, so unconditionally clearing both fields is
> +	 * correct.

If you happen to spin again, wrap is a bit short of standard 80 chars.
	 * DAX maintains the invariant that folio->share != 0 only when
	 * folio->mapping == NULL (enforced by dax_folio_make_shared()).
	 * Equivalently: folio->mapping != NULL implies folio->share == 0.
	 * Callers ensure share has been decremented to zero before calling here,
	 * so unconditionally clearing both fields is correct.
> +	 */
> +	folio->mapping = NULL;
> +	folio->share = 0;
> +
> +	if (!order) {
> +		/*
> +		 * Restore pgmap explicitly even for order-0 folios. For
> +		 * the dax_folio_put() caller this is a no-op (same value),
> +		 * but fsdev_clear_folio_state() may call this on folios
> +		 * that were previously compound and need pgmap
> +		 * re-established.
> +		 */
		 * Restore pgmap explicitly even for order-0 folios. For the
		 * dax_folio_put() caller this is a no-op (same value), but
		 * fsdev_clear_folio_state() may call this on folios that were
		 * previously compound and need pgmap re-established.
		 */

> +		folio->pgmap = pgmap;
> +		return 0;
> +	}
> +
> +	folio_reset_order(folio);
> +
> +	for (int i = 0; i < (1UL << order); i++) {
> +		struct page *page = folio_page(folio, i);
> +		struct folio *f = (struct folio *)page;
> +
> +		ClearPageHead(page);
> +		clear_compound_head(page);
> +		f->mapping = NULL;
> +		f->share = 0;
> +		f->pgmap = pgmap;
> +	}
> +
> +	return order;
> +}


  reply	other threads:[~2026-03-24 14:23 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20260324003630.4930-1-john@jagalactic.com>
2026-03-24  0:36 ` [PATCH BUNDLE v9] famfs: Fabric-Attached Memory File System John Groves
2026-03-24  0:37   ` [PATCH V9 0/8] dax: prepare for famfs John Groves
2026-03-24  0:37     ` [PATCH V9 1/8] dax: move dax_pgoff_to_phys from [drivers/dax/] device.c to bus.c John Groves
2026-03-24 14:18       ` Jonathan Cameron
2026-03-24 23:44         ` Ira Weiny
2026-03-25 11:55           ` Jonathan Cameron
2026-03-24  0:38     ` [PATCH V9 2/8] dax: Factor out dax_folio_reset_order() helper John Groves
2026-03-24 14:23       ` Jonathan Cameron [this message]
2026-03-24  0:38     ` [PATCH V9 3/8] dax: add fsdev.c driver for fs-dax on character dax John Groves
2026-03-24 14:39       ` Jonathan Cameron
2026-03-25 12:43         ` John Groves
2026-03-25 16:04           ` Ira Weiny
2026-03-26 14:33             ` John Groves
2026-03-26 22:46               ` Ira Weiny
2026-03-27  0:56                 ` John Groves
2026-03-27 16:40                   ` Ira Weiny
2026-03-24 15:19       ` Dave Jiang
2026-03-25  4:48       ` Ira Weiny
2026-03-24  0:38     ` [PATCH V9 4/8] dax: Save the kva from memremap John Groves
2026-03-24 14:40       ` Jonathan Cameron
2026-03-24  0:39     ` [PATCH V9 5/8] dax: Add dax_operations for use by fs-dax on fsdev dax John Groves
2026-03-24 14:51       ` Jonathan Cameron
2026-03-24 15:23       ` Dave Jiang
2026-03-25 21:28       ` Dave Jiang
2026-03-27 14:06         ` John Groves
2026-03-25 22:40       ` Dave Jiang
2026-03-27 14:14         ` John Groves
2026-03-24  0:39     ` [PATCH V9 6/8] dax: Add dax_set_ops() for setting dax_operations at bind time John Groves
2026-03-24 14:53       ` Jonathan Cameron
2026-03-24  0:39     ` [PATCH V9 7/8] dax: Add fs_dax_get() func to prepare dax for fs-dax usage John Groves
2026-03-24 15:05       ` Jonathan Cameron
2026-03-27 14:45         ` John Groves
2026-03-24 15:25       ` Dave Jiang
2026-03-24  0:39     ` [PATCH V9 8/8] dax: export dax_dev_get() John Groves
2026-03-24 15:06       ` Jonathan Cameron
2026-03-24  0:39   ` [PATCH V9 00/10] famfs: port into fuse John Groves
2026-03-24  0:40     ` [PATCH V9 01/10] famfs_fuse: Update macro s/FUSE_IS_DAX/FUSE_IS_VIRTIO_DAX/ John Groves
2026-03-24 15:12       ` Jonathan Cameron
2026-03-27 14:52         ` John Groves
2026-03-24  0:40     ` [PATCH V9 02/10] famfs_fuse: Basic fuse kernel ABI enablement for famfs John Groves
2026-03-24  0:40     ` [PATCH V9 03/10] famfs_fuse: Plumb the GET_FMAP message/response John Groves
2026-03-24  0:41     ` [PATCH V9 04/10] famfs_fuse: Create files with famfs fmaps John Groves
2026-03-24  0:41     ` [PATCH V9 05/10] famfs_fuse: GET_DAXDEV message and daxdev_table John Groves
2026-03-24  0:41     ` [PATCH V9 06/10] famfs_fuse: Plumb dax iomap and fuse read/write/mmap John Groves
2026-03-24  0:41     ` [PATCH V9 07/10] famfs_fuse: Add holder_operations for dax notify_failure() John Groves
2026-03-24  0:41     ` [PATCH V9 08/10] famfs_fuse: Add DAX address_space_operations with noop_dirty_folio John Groves
2026-03-24  0:42     ` [PATCH V9 09/10] famfs_fuse: Add famfs fmap metadata documentation John Groves
2026-03-24  0:42     ` [PATCH V9 10/10] famfs_fuse: Add documentation John Groves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260324142346.00002edc@huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=John@Groves.net \
    --cc=ackerleytng@google.com \
    --cc=ajayjoshi@micron.com \
    --cc=alison.schofield@intel.com \
    --cc=amir73il@gmail.com \
    --cc=arramesh@micron.com \
    --cc=bagasdotme@gmail.com \
    --cc=brauner@kernel.org \
    --cc=bschubert@ddn.com \
    --cc=chenlinxuan@uniontech.com \
    --cc=corbet@lwn.net \
    --cc=dan.j.williams@intel.com \
    --cc=dave.jiang@intel.com \
    --cc=david@kernel.org \
    --cc=djwong@kernel.org \
    --cc=gourry@gourry.net \
    --cc=ira.weiny@intel.com \
    --cc=jack@suse.cz \
    --cc=james.morse@arm.com \
    --cc=jgroves@micron.com \
    --cc=jlayton@kernel.org \
    --cc=joannelkoong@gmail.com \
    --cc=john@jagalactic.com \
    --cc=josef@toxicpanda.com \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=nvdimm@lists.linux.dev \
    --cc=rdunlap@infradead.org \
    --cc=seanjc@google.com \
    --cc=shajnocz@redhat.com \
    --cc=shivankg@amd.com \
    --cc=skhan@linuxfoundation.org \
    --cc=tabba@google.com \
    --cc=venkataravis@micron.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=vishal.l.verma@intel.com \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.