All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	 "Liam R. Howlett" <liam@infradead.org>,
	Vlastimil Babka <vbabka@kernel.org>,
	 Mike Rapoport <rppt@kernel.org>,
	Suren Baghdasaryan <surenb@google.com>,
	 Michal Hocko <mhocko@suse.com>, Jann Horn <jannh@google.com>,
	Pedro Falcato <pfalcato@suse.de>,
	 "Matthew Wilcox (Oracle)" <willy@infradead.org>,
	Jan Kara <jack@suse.cz>, Miaohe Lin <linmiaohe@huawei.com>,
	 Naoya Horiguchi <nao.horiguchi@gmail.com>,
	Rik van Riel <riel@surriel.com>, Harry Yoo <harry@kernel.org>,
	 Lance Yang <lance.yang@linux.dev>, Kees Cook <kees@kernel.org>,
	Zi Yan <ziy@nvidia.com>,
	 Baolin Wang <baolin.wang@linux.alibaba.com>,
	Nico Pache <npache@redhat.com>,
	 Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
	Barry Song <baohua@kernel.org>,
	 Usama Arif <usama.arif@linux.dev>,
	Matthew Brost <matthew.brost@intel.com>,
	 Joshua Hahn <joshua.hahnjy@gmail.com>,
	Rakie Kim <rakie.kim@sk.com>, Byungchul Park <byungchul@sk.com>,
	 Gregory Price <gourry@gourry.net>,
	Ying Huang <ying.huang@linux.alibaba.com>,
	 Alistair Popple <apopple@nvidia.com>,
	Peter Xu <peterx@redhat.com>, Xu Xin <xu.xin16@zte.com.cn>,
	 Chengming Zhou <chengming.zhou@linux.dev>,
	Arnd Bergmann <arnd@arndb.de>,
	 Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	 linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [PATCH v3 02/15] mm: introduce linear_anon_page_index()
Date: Mon, 3 Aug 2026 11:10:07 +0100	[thread overview]
Message-ID: <anBjpdMicqaGADr-@lucifer> (raw)
In-Reply-To: <e01ad01e-715c-486d-9a26-1126c666947f@kernel.org>

On Mon, Aug 03, 2026 at 11:34:32AM +0200, David Hildenbrand (Arm) wrote:
> On 7/29/26 18:48, Lorenzo Stoakes (ARM) wrote:
> > This function provides the anonymous equivalent of linear_page_index(),
> > instead offsetting based on the anonymous page offset of the VMA.
> >
> > It is valid only for anonymous or MAP_PRIVATE file-backed mappings. It must
> > not be called for shared file-backed mappings.
> >
> > For pure anon VMAs, this will be equal to linear_page_index().
> >
> > Assert that both of these invariants are true In linear_anon_page_index()
> > and implement the algorithm in __linear_anon_page_index().
> >
> > Note that MAP_PRIVATE-/dev/zero mappings will satisfy vma_is_anonymous()
> > but not fulfill this invariant, so when asserting this we check
> > vma->vm_file to account for this.
> >
> > We do not update callsites yet, so no functional change intended.
> >
> > Also const-ify vma_is_anonymous() to make it compatible with the
> > const-ified linear_anon_page_index().
> >
> > VMA userland tests are also updated accordingly.
>
> In general looks good, some comments below.
>
> >
> > Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> > ---
> >  include/linux/mm.h              |  2 +-
> >  include/linux/pagemap.h         | 42 +++++++++++++++++++++++++++++++++++++++++
> >  tools/testing/vma/include/dup.h | 25 +++++++++++++++++++++++-
> >  3 files changed, 67 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index df78847f5f07..64214191e7c6 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -1556,7 +1556,7 @@ static inline void vma_desc_set_anonymous(struct vm_area_desc *desc)
> >  	desc->vm_ops = NULL;
> >  }
> >
> > -static inline bool vma_is_anonymous(struct vm_area_struct *vma)
> > +static inline bool vma_is_anonymous(const struct vm_area_struct *vma)
> >  {
> >  	return !vma->vm_ops;
> >  }
> > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> > index c6fc783aaee5..259177544b03 100644
> > --- a/include/linux/pagemap.h
> > +++ b/include/linux/pagemap.h
> > @@ -1101,6 +1101,48 @@ static inline pgoff_t linear_page_index(const struct vm_area_struct *vma,
> >  	return pgoff;
> >  }
> >
> > +static inline pgoff_t __linear_anon_page_index(const struct vm_area_struct *vma,
> > +					       const unsigned long address)
>
> Nit Usual "two tab" comment (same below) :)

Ack will change.

>
> > +{
> > +	pgoff_t pgoff;
> > +
> > +	pgoff = linear_page_delta(vma, address);
> > +	pgoff += vma_start_anon_pgoff(vma);
>
>
> I'd simply do
>
> 	return vma_start_anon_pgoff(vma) + linear_page_delta(vma, address);

This was just to mimic the existing thing linear_page_index() did (which in turn
was based on what the original implementation of linear_page_index()
did), will change.

>
> > +	return pgoff;
> > +}
> > +
> > +/**
> > + * linear_anon_page_index() - Determine the absolute anonymous page offset of
> > + * @address within @vma.
> > + * @vma: An anonymous or MAP_PRIVATE file-backed VMA in which @address resides.
> > + * @address: The address whose absolute page offset is required.
> > + *
> > + * This returns the anonymous page offset of @address, which is the page offset
> > + * the address possessed at the time the VMA was first faulted.
> > + *
> > + * For anonymous mappings, this returns the same value as linear_page_index().
> > + *
> > + * For MAP_PRIVATE file-backed mappings, this returns the anonymous page offset
> > + * of @address, which is the page offset the address possessed at the time the
> > + * VMA was first faulted.
> > + *
> > + * It is not valid to call this function for shared file-backed mappings.
> > + *
> > + * Returns: The absolute anonymous page offset of @address within @vma.
> > + */
> > +static inline pgoff_t linear_anon_page_index(const struct vm_area_struct *vma,
> > +					     const unsigned long address)
>
> Dito.

Ack.

>
> > +{
> > +	const pgoff_t pgoff = __linear_anon_page_index(vma, address);
> > +
> > +	VM_WARN_ON_ONCE(vma_test(vma, VMA_SHARED_BIT));
>
> Could we test or COW mappings instead?
>
> VM_WARN_ON_ONCE(!is_cow_mapping(vma));
>
> Because we must never have anon folios is non-cow mappings.

(guessing is -> in?)

is_cow_mapping() == !VMA_SHARED_BIT && VMA_MAYWRITE_BIT

!is_cow_mapping() == VMA_SHARED_BIT || !VMA_MAYWRITE_BIT (by De Morgan's law)

So the delta here would be this being called on !VMA_MAYWRITE_BIT anon mappings.

This is called from:

* linear_folio_page_index() - tests folio is anon first so must be CoW
* __folio_set_anon() - must be CoW
* __page_check_anon_rmap() - must be CoW
* try_to_merge_with_ksm_page(), ksm_might_need_to_copy() - must be CoW

So yeah this is fine, will change!

>
> [...]
>
> > +static inline pgoff_t __linear_anon_page_index(const struct vm_area_struct *vma,
> > +					       const unsigned long address)
> > +{
> > +	pgoff_t pgoff;
> > +
> > +	pgoff = linear_page_delta(vma, address);
> > +	pgoff += vma_start_anon_pgoff(vma);
> > +	return pgoff;
> > +}
>
> Same comment as above.

Ack, will change.

>
> --
> Cheers,
>
> David

--
Cheers, Lorenzo

  reply	other threads:[~2026-08-03 10:10 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-29 16:48 [PATCH v3 00/15] mm/rmap: index MAP_PRIVATE file-backed folios by anonymous pgoff Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 01/15] mm/vma: introduce VMA anon page offset field and add helpers Lorenzo Stoakes (ARM)
2026-07-29 17:11   ` Lorenzo Stoakes (ARM)
2026-07-30  3:32   ` Gregory Price
2026-08-03  9:28   ` David Hildenbrand (Arm)
2026-08-03  9:46     ` Lorenzo Stoakes (ARM)
2026-08-03  9:58       ` David Hildenbrand (Arm)
2026-08-03 10:13         ` Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 02/15] mm: introduce linear_anon_page_index() Lorenzo Stoakes (ARM)
2026-07-30  6:28   ` Gregory Price
2026-08-03  9:34   ` David Hildenbrand (Arm)
2026-08-03 10:10     ` Lorenzo Stoakes (ARM) [this message]
2026-07-29 16:48 ` [PATCH v3 03/15] mm: abstract vma_address() and introduce vma_anon_address() Lorenzo Stoakes (ARM)
2026-07-30  4:58   ` Gregory Price
2026-07-30  6:39     ` Gregory Price
2026-07-30 10:16       ` Lorenzo Stoakes (ARM)
2026-08-03  9:37   ` David Hildenbrand (Arm)
2026-07-29 16:48 ` [PATCH v3 04/15] mm: update print_bad_page_map() to show anonymous page index Lorenzo Stoakes (ARM)
2026-07-30  6:32   ` Gregory Price
2026-08-03  9:39     ` David Hildenbrand (Arm)
2026-08-03 10:19       ` Lorenzo Stoakes (ARM)
2026-08-05  8:30         ` Gregory Price
2026-08-05  9:01           ` Lorenzo Stoakes (ARM)
2026-08-06 15:14             ` Lorenzo Stoakes (ARM)
2026-08-06 16:54             ` Matthew Wilcox
2026-08-06 17:18               ` Lorenzo Stoakes (ARM)
2026-08-03  9:39   ` David Hildenbrand (Arm)
2026-07-29 16:48 ` [PATCH v3 05/15] mm: introduce and use vma_filebacked_address() Lorenzo Stoakes (ARM)
2026-08-03  9:54   ` David Hildenbrand (Arm)
2026-08-03 10:15     ` Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 06/15] mm: propagate VMA anonymous page offset on map, remap, split + merge Lorenzo Stoakes (ARM)
2026-08-03 10:52   ` David Hildenbrand (Arm)
2026-08-03 13:46     ` Lorenzo Stoakes (ARM)
2026-08-05  7:35       ` David Hildenbrand (Arm)
2026-08-05  8:59         ` Lorenzo Stoakes (ARM)
2026-08-05  9:19           ` David Hildenbrand (Arm)
2026-08-05  9:29             ` Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 07/15] mm/rmap: track whether the page VMA mapped pgoff is anonymous Lorenzo Stoakes (ARM)
2026-08-03 10:57   ` David Hildenbrand (Arm)
2026-08-03 13:51     ` Lorenzo Stoakes (ARM)
2026-08-03 14:02       ` David Hildenbrand (Arm)
2026-08-03 14:32         ` Lorenzo Stoakes (ARM)
2026-08-05  7:17           ` David Hildenbrand (Arm)
2026-08-05  7:25             ` Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 08/15] mm: introduce and use linear_folio_page_index() Lorenzo Stoakes (ARM)
2026-08-03 11:27   ` David Hildenbrand (Arm)
2026-08-03 14:30     ` Lorenzo Stoakes (ARM)
2026-08-05  7:26       ` David Hildenbrand (Arm)
2026-08-05  9:02         ` Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 09/15] mm/rmap: use anon pgoff to track MAP_PRIVATE file-backed anon folios Lorenzo Stoakes (ARM)
2026-08-03 11:32   ` David Hildenbrand (Arm)
2026-08-03 14:30     ` Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 10/15] tools/testing/vma: expand VMA merge tests to assert anon pgoff Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 11/15] tools/testing/selftests/mm: test anonymous page offset merge behaviour Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 12/15] mm/vma: only permit MAP_PRIVATE /dev/zero to be mapped anonymous Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 13/15] mm/vma: make MAP_PRIVATE-mapped /dev/zero mappings truly anonymous Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 14/15] tools/testing/vma: add test to assert MAP_PRIVATE-/dev/zero is anon Lorenzo Stoakes (ARM)
2026-07-29 16:48 ` [PATCH v3 15/15] tools/testing/selftests/mm: add MAP_PRIVATE-/dev/zero merge tests Lorenzo Stoakes (ARM)

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=anBjpdMicqaGADr-@lucifer \
    --to=ljs@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=apopple@nvidia.com \
    --cc=arnd@arndb.de \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=byungchul@sk.com \
    --cc=chengming.zhou@linux.dev \
    --cc=david@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=gourry@gourry.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=harry@kernel.org \
    --cc=jack@suse.cz \
    --cc=jannh@google.com \
    --cc=joshua.hahnjy@gmail.com \
    --cc=kees@kernel.org \
    --cc=lance.yang@linux.dev \
    --cc=liam@infradead.org \
    --cc=linmiaohe@huawei.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=matthew.brost@intel.com \
    --cc=mhocko@suse.com \
    --cc=nao.horiguchi@gmail.com \
    --cc=npache@redhat.com \
    --cc=peterx@redhat.com \
    --cc=pfalcato@suse.de \
    --cc=rakie.kim@sk.com \
    --cc=riel@surriel.com \
    --cc=rppt@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=surenb@google.com \
    --cc=usama.arif@linux.dev \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --cc=xu.xin16@zte.com.cn \
    --cc=ying.huang@linux.alibaba.com \
    --cc=ziy@nvidia.com \
    /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.