kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Garg, Shivank" <shivankg@amd.com>
To: "Gupta, Pankaj" <Pankaj.Gupta@amd.com>,
	"Sampat, Pratik Rajesh" <PratikRajesh.Sampat@amd.com>,
	"nikita.kalyazin@linux.dev" <nikita.kalyazin@linux.dev>,
	"ying.huang@linux.alibaba.com" <ying.huang@linux.alibaba.com>,
	"patrick.roy@linux.dev" <patrick.roy@linux.dev>,
	"joshua.hahnjy@gmail.com" <joshua.hahnjy@gmail.com>,
	"david@kernel.org" <david@kernel.org>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>,
	"jmattson@google.com" <jmattson@google.com>,
	"hannes@cmpxchg.org" <hannes@cmpxchg.org>,
	"jack@suse.cz" <jack@suse.cz>,
	"tglx@kernel.org" <tglx@kernel.org>,
	"Dadhania, Nikunj" <nikunj.dadhania@amd.com>,
	"Roth, Michael" <Michael.Roth@amd.com>,
	"corbet@lwn.net" <corbet@lwn.net>,
	"mhocko@suse.com" <mhocko@suse.com>,
	"gourry@gourry.net" <gourry@gourry.net>,
	"iweiny@kernel.org" <iweiny@kernel.org>,
	"chao.p.peng@linux.intel.com" <chao.p.peng@linux.intel.com>,
	"byungchul@sk.com" <byungchul@sk.com>,
	"x86@kernel.org" <x86@kernel.org>, "bp@alien8.de" <bp@alien8.de>,
	"ricarkol@google.com" <ricarkol@google.com>,
	"vannapurve@google.com" <vannapurve@google.com>,
	"shuah@kernel.org" <shuah@kernel.org>,
	"seanjc@google.com" <seanjc@google.com>,
	"jackmanb@google.com" <jackmanb@google.com>,
	"Kalra, Ashish" <Ashish.Kalra@amd.com>,
	"willy@infradead.org" <willy@infradead.org>,
	"surenb@google.com" <surenb@google.com>,
	"pshier@google.com" <pshier@google.com>,
	"matthew.brost@intel.com" <matthew.brost@intel.com>,
	"fuad.tabba@linux.dev" <fuad.tabba@linux.dev>,
	"skhan@linuxfoundation.org" <skhan@linuxfoundation.org>,
	"hpa@zytor.com" <hpa@zytor.com>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"rakie.kim@sk.com" <rakie.kim@sk.com>,
	"ackerleytng@google.com" <ackerleytng@google.com>,
	"apopple@nvidia.com" <apopple@nvidia.com>,
	"ziy@nvidia.com" <ziy@nvidia.com>,
	"vbabka@kernel.org" <vbabka@kernel.org>,
	"akpm@linux-foundation.org" <akpm@linux-foundation.org>,
	"dave.hansen@linux.intel.com" <dave.hansen@linux.intel.com>
Cc: "linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-coco@lists.linux.dev" <linux-coco@lists.linux.dev>,
	"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-kselftest@vger.kernel.org"
	<linux-kselftest@vger.kernel.org>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH v3 2/9] mm: split AS_UNMOVABLE back out of AS_INACCESSIBLE
Date: Fri, 11 Sep 2026 13:22:30 +0000	[thread overview]
Message-ID: <40e6e4af230cf5dc6e6937d785ee507378482602.camel@amd.com> (raw)
In-Reply-To: <8fa1b403-99b0-4508-b705-f9e93c6bf0c8@kernel.org>

On Thu, 2026-09-10 at 12:03 +0200, David Hildenbrand (Arm) wrote:
> On 8/5/26 08:40, Shivank Garg wrote:
> > Commit 27e6a24a4cf3 ("mm, virt: merge AS_UNMOVABLE and AS_INACCESSIBLE")
> > folded the two flags into one, on the grounds that guest_memfd was the
> > only user and always set both. But the two flags were added for
> > different reasons and guard different things:
> > 
> >   AS_UNMOVABLE (0003e2a41468) marks a mapping whose folios cannot be
> >   migrated.
> > 
> >   AS_INACCESSIBLE (c72ceafbd12c) marks a mapping whose contents must
> >   not be directly R/W accessed. Its only job is to stop
> >   truncate_inode_partial_folio() from zeroing the folio.
> > 
> > The merge assumed unmovable and inaccessible were the same thing.
> > This cannot express a mapping that is inaccessible yet still movable,
> > which is exactly what guest_memfd wants.
> > 
> > Reintroduce AS_UNMOVABLE and restore the original split: truncate keeps
> > checking AS_INACCESSIBLE, while migration and compaction go back to
> > checking AS_UNMOVABLE.
> > 
> > Currently guest_memfd sets both, so the resulting flags and behaviour
> > are unchanged. Preparatory change to support folio migration for
> > non-confidential guest_memfd VMs.
> > 
> > Signed-off-by: Shivank Garg <shivankg@amd.com>
> > ---
> >  include/linux/pagemap.h | 24 ++++++++++++++++++++----
> >  mm/compaction.c         | 12 ++++++------
> >  mm/migrate.c            |  2 +-
> >  virt/kvm/guest_memfd.c  |  1 +
> >  4 files changed, 28 insertions(+), 11 deletions(-)
> > 
> > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> > index 2c3718d592d6..a7dcaa66e4e3 100644
> > --- a/include/linux/pagemap.h
> > +++ b/include/linux/pagemap.h
> > @@ -210,6 +210,7 @@ enum mapping_flags {
> >  	AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM = 9,
> >  	AS_KERNEL_FILE = 10,	/* mapping for a fake kernel file that shouldn't
> >  				   account usage to user cgroups */
> > +	AS_UNMOVABLE = 11,	/* The mapping cannot be moved, ever */
> >  	/* Bits 16-25 are used for FOLIO_ORDER */
> >  	AS_FOLIO_ORDER_BITS = 5,
> >  	AS_FOLIO_ORDER_MIN = 16,
> > @@ -322,11 +323,10 @@ static inline void mapping_clear_stable_writes(struct address_space *mapping)
> >  static inline void mapping_set_inaccessible(struct address_space *mapping)
> >  {
> >  	/*
> > -	 * It's expected inaccessible mappings are also unevictable. Compaction
> > -	 * migrate scanner (isolate_migratepages_block()) relies on this to
> > -	 * reduce page locking.
> > +	 * The mapping's contents must not be accessed by the CPU through
> > +	 * the kernel direct map or other internal paths (e.g. zeroing of
> > +	 * pages during truncation).
> >  	 */
> > -	set_bit(AS_UNEVICTABLE, &mapping->flags);
> >  	set_bit(AS_INACCESSIBLE, &mapping->flags);
> >  }
> >  
> > @@ -335,6 +335,22 @@ static inline bool mapping_inaccessible(const struct address_space *mapping)
> >  	return test_bit(AS_INACCESSIBLE, &mapping->flags);
> >  }
> >  
> > +static inline void mapping_set_unmovable(struct address_space *mapping)
> > +{
> > +	/*
> > +	 * It's expected unmovable mappings are also unevictable. Compaction
> > +	 * migrate scanner (isolate_migratepages_block()) relies on this to
> > +	 * reduce page locking.
> > +	 */
> > +	set_bit(AS_UNEVICTABLE, &mapping->flags);
> > +	set_bit(AS_UNMOVABLE, &mapping->flags);
> > +}
> > +
> > +static inline bool mapping_unmovable(const struct address_space *mapping)
> > +{
> > +	return test_bit(AS_UNMOVABLE, &mapping->flags);
> > +}
> > +
> >  static inline void mapping_set_writeback_may_deadlock_on_reclaim(struct address_space *mapping)
> >  {
> >  	set_bit(AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM, &mapping->flags);
> > diff --git a/mm/compaction.c b/mm/compaction.c
> > index f08765ade014..e6b0fdfaf79d 100644
> > --- a/mm/compaction.c
> > +++ b/mm/compaction.c
> > @@ -1133,22 +1133,22 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
> >  		if (((mode & ISOLATE_ASYNC_MIGRATE) && is_dirty) ||
> >  		    (mapping && is_unevictable)) {
> >  			bool migrate_dirty = true;
> > -			bool is_inaccessible;
> > +			bool is_unmovable;
> >  
> >  			/*
> >  			 * Only folios without mappings or that have
> >  			 * a ->migrate_folio callback are possible to migrate
> >  			 * without blocking.
> >  			 *
> > -			 * Folios from inaccessible mappings are not migratable.
> > +			 * Folios from unmovable mappings are not migratable.
> >  			 *
> >  			 * However, we can be racing with truncation, which can
> >  			 * free the mapping that we need to check. Truncation
> >  			 * holds the folio lock until after the folio is removed
> >  			 * from the page so holding it ourselves is sufficient.
> >  			 *
> > -			 * To avoid locking the folio just to check inaccessible,
> > -			 * assume every inaccessible folio is also unevictable,
> > +			 * To avoid locking the folio just to check unmovable,
> > +			 * assume every unmovable folio is also unevictable,
> >  			 * which is a cheaper test.  If our assumption goes
> >  			 * wrong, it's not a correctness bug, just potentially
> >  			 * wasted cycles.
> > @@ -1161,9 +1161,9 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
> >  				migrate_dirty = !mapping ||
> >  						mapping->a_ops->migrate_folio;
> >  			}
> > -			is_inaccessible = mapping && mapping_inaccessible(mapping);
> > +			is_unmovable = mapping && mapping_unmovable(mapping);
> >  			folio_unlock(folio);
> > -			if (!migrate_dirty || is_inaccessible)
> > +			if (!migrate_dirty || is_unmovable)
> >  				goto isolate_fail_put;
> >  		}
> >  
> > diff --git a/mm/migrate.c b/mm/migrate.c
> > index dd15a84b2a52..d4dcd7f142ce 100644
> > --- a/mm/migrate.c
> > +++ b/mm/migrate.c
> > @@ -1101,7 +1101,7 @@ static int move_to_new_folio(struct folio *dst, struct folio *src,
> >  
> >  	if (!mapping)
> >  		rc = migrate_folio(mapping, dst, src, mode);
> > -	else if (mapping_inaccessible(mapping))
> > +	else if (mapping_unmovable(mapping))
> >  		rc = -EOPNOTSUPP;
> >  	else if (mapping->a_ops->migrate_folio)
> >  		/*
> > diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
> > index 45cbdf4801ec..169f75f95433 100644
> > --- a/virt/kvm/guest_memfd.c
> > +++ b/virt/kvm/guest_memfd.c
> > @@ -593,6 +593,7 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags)
> >  	inode->i_size = size;
> >  	mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER);
> >  	mapping_set_inaccessible(inode->i_mapping);
> > +	mapping_set_unmovable(inode->i_mapping);
> 
> For shared-only guest_memfd, is there even a reason to mark it as
> mapping_set_inaccessible() ?
> 
> mapping_inaccessible() is only used in truncation and compaction logic.
> 
> Wouldn't we want compaction to work here?

Compaction would work here because migration and compaction now checks the
mapping_unmovable(), while the Truncation still checks
mapping_inaccessible() to avoid writes to confidential memory.

> 
> IOW, for shared-only with migration support, can't we just not do
> mapping_set_inaccessible() ?

yes, I'll do this.

Thanks,
Shivank

  reply	other threads:[~2026-09-11 13:22 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-05  6:40 [PATCH v3 0/9] KVM: guest_memfd: folio migration for non-confidential VMs Shivank Garg
2026-08-05  6:40 ` [PATCH v3 1/9] KVM: guest_memfd: take the invalidate lock when unbinding a dying file Shivank Garg
2026-08-05  7:06   ` sashiko-bot
2026-09-10  9:58   ` David Hildenbrand (Arm)
2026-09-11  6:40     ` Garg, Shivank
2026-08-05  6:40 ` [PATCH v3 2/9] mm: split AS_UNMOVABLE back out of AS_INACCESSIBLE Shivank Garg
2026-09-10 10:03   ` David Hildenbrand (Arm)
2026-09-11 13:22     ` Garg, Shivank [this message]
2026-08-05  6:40 ` [PATCH v3 3/9] KVM: guest_memfd: implement folio migration for non-confidential VMs Shivank Garg
2026-08-05  7:09   ` sashiko-bot
2026-09-10 10:05   ` David Hildenbrand (Arm)
2026-09-11 11:42     ` Garg, Shivank
2026-08-05  6:40 ` [PATCH v3 4/9] KVM: guest_memfd: add GUEST_MEMFD_FLAG_MIGRATABLE Shivank Garg
2026-08-05  7:08   ` sashiko-bot
2026-08-14  8:25     ` Garg, Shivank
2026-08-05  6:40 ` [PATCH v3 5/9] KVM: selftests: fix maxnode arguments in xapic_ipi_test Shivank Garg
2026-08-05  6:40 ` [PATCH v3 6/9] KVM: selftests: use BITS_PER_TYPE() for NUMA masks Shivank Garg
2026-08-05  6:40 ` [PATCH v3 7/9] KVM: selftests: add get_numa_mem_nodes() Shivank Garg
2026-08-05  6:40 ` [PATCH v3 8/9] KVM: selftests: use allowed NUMA nodes in guest_memfd_test Shivank Garg
2026-08-05  6:40 ` [PATCH v3 9/9] KVM: selftests: exercise guest_memfd folio migration Shivank Garg
2026-08-21 12:34 ` [PATCH v3 0/9] KVM: guest_memfd: folio migration for non-confidential VMs Garg, Shivank
2026-08-21 13:39   ` David Hildenbrand (Arm)
2026-09-10  9:58 ` David Hildenbrand (Arm)
2026-09-11 11:37   ` Garg, Shivank

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=40e6e4af230cf5dc6e6937d785ee507378482602.camel@amd.com \
    --to=shivankg@amd.com \
    --cc=Ashish.Kalra@amd.com \
    --cc=Michael.Roth@amd.com \
    --cc=Pankaj.Gupta@amd.com \
    --cc=PratikRajesh.Sampat@amd.com \
    --cc=ackerleytng@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=apopple@nvidia.com \
    --cc=bp@alien8.de \
    --cc=byungchul@sk.com \
    --cc=chao.p.peng@linux.intel.com \
    --cc=corbet@lwn.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@kernel.org \
    --cc=fuad.tabba@linux.dev \
    --cc=gourry@gourry.net \
    --cc=hannes@cmpxchg.org \
    --cc=hpa@zytor.com \
    --cc=iweiny@kernel.org \
    --cc=jack@suse.cz \
    --cc=jackmanb@google.com \
    --cc=jmattson@google.com \
    --cc=joshua.hahnjy@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-coco@lists.linux.dev \
    --cc=linux-doc@vger.kernel.org \
    --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=mingo@redhat.com \
    --cc=nikita.kalyazin@linux.dev \
    --cc=nikunj.dadhania@amd.com \
    --cc=patrick.roy@linux.dev \
    --cc=pbonzini@redhat.com \
    --cc=pshier@google.com \
    --cc=rakie.kim@sk.com \
    --cc=ricarkol@google.com \
    --cc=seanjc@google.com \
    --cc=shuah@kernel.org \
    --cc=skhan@linuxfoundation.org \
    --cc=surenb@google.com \
    --cc=tglx@kernel.org \
    --cc=vannapurve@google.com \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --cc=x86@kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).