From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Shivank Garg <shivankg@amd.com>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Jan Kara <jack@suse.cz>,
Andrew Morton <akpm@linux-foundation.org>,
Vlastimil Babka <vbabka@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Brendan Jackman <jackmanb@google.com>,
Johannes Weiner <hannes@cmpxchg.org>, Zi Yan <ziy@nvidia.com>,
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>,
Paolo Bonzini <pbonzini@redhat.com>,
Shuah Khan <shuah@kernel.org>,
Chao Peng <chao.p.peng@linux.intel.com>,
Nikunj A Dadhania <nikunj@amd.com>,
Michael Roth <michael.roth@amd.com>,
Pankaj Gupta <pankaj.gupta@amd.com>,
Ackerley Tng <ackerleytng@google.com>,
Sean Christopherson <seanjc@google.com>,
Vishal Annapurve <vannapurve@google.com>,
Nikita Kalyazin <nikita.kalyazin@linux.dev>,
Patrick Roy <patrick.roy@linux.dev>,
Pratik Sampat <prsampat@amd.com>,
Ashish Kalra <Ashish.Kalra@amd.com>,
Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Peter Shier <pshier@google.com>,
Jim Mattson <jmattson@google.com>,
Ricardo Koller <ricarkol@google.com>,
Ira Weiny <iweiny@kernel.org>, Fuad Tabba <fuad.tabba@linux.dev>
Cc: linux-fsdevel@vger.kernel.org, linux-coco@lists.linux.dev,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH v3 2/9] mm: split AS_UNMOVABLE back out of AS_INACCESSIBLE
Date: Thu, 10 Sep 2026 12:03:28 +0200 [thread overview]
Message-ID: <8fa1b403-99b0-4508-b705-f9e93c6bf0c8@kernel.org> (raw)
In-Reply-To: <20260805-shivank-gmem-migrate-v3-2-00d8bdec4e1d@amd.com>
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?
IOW, for shared-only with migration support, can't we just not do
mapping_set_inaccessible() ?
--
Cheers,
David
next prev parent reply other threads:[~2026-09-10 10:03 UTC|newest]
Thread overview: 21+ 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) [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-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)
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=8fa1b403-99b0-4508-b705-f9e93c6bf0c8@kernel.org \
--to=david@kernel.org \
--cc=Ashish.Kalra@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=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=michael.roth@amd.com \
--cc=mingo@redhat.com \
--cc=nikita.kalyazin@linux.dev \
--cc=nikunj@amd.com \
--cc=pankaj.gupta@amd.com \
--cc=patrick.roy@linux.dev \
--cc=pbonzini@redhat.com \
--cc=prsampat@amd.com \
--cc=pshier@google.com \
--cc=rakie.kim@sk.com \
--cc=ricarkol@google.com \
--cc=seanjc@google.com \
--cc=shivankg@amd.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