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: 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) [this message]
2026-09-11 13:22 ` Garg, Shivank
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=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 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.