guest_memfd folios are currently always marked unmovable, so the kernel cannot perform memory compaction, offlining, etc. This is unavoidable for confidential VMs (SEV-SNP, TDX), since memory is encrypted and copying it needs firmware assistance. However, for non-confidential VMs (like Firecracker), we can migrate the folios.
This series enables folio migration for non-confidential guest_memfd and also lays the groundwork for migrating confidential guest_memfd later. Once firmware-assisted copying support is available, those VMs can be made movable, the confidential folio content can be copied separately, and the destination folio marked with FOLIO_CONTENT_COPIED so __migrate_folio() skips the host-side folio_mc_copy(). Testing ------- Host: 7.2-rc5+(62cc902415) + this, 2 NUMA nodes - KVM selftest: allocate folios on node 0, migrate them to node 1 and back and verify resulting NUMA node and the folio contents at each step. - Firecracker [1]: booted a microVM backed by guest_memfd. While the guest was running, forced host-side migration of its folios via migratepages(8) and explicit move_pages(2) of guest_memfd pages. Verify with /proc/firecracker_pid/numa_maps. Notes ----- - Sashiko pointed out a pre-existing ABBA deadlock between kvm_gmem_error_folio() and truncation. It's being addressed separately by Hao Zhang. [2][3] - Sashiko also asked whether selftest should dynamically discover available NUMA nodes instead of hardcoding nodes 0 and 1? This feels like over-complication for an artificial scenario. [3] So avoiding it. [1] https://github.com/firecracker-microvm/firecracker/tree/feature/secret-hiding In builder.rs, add GUEST_MEMFD_FLAG_MIGRATABLE to bit-2 and pass it instead of GUEST_MEMFD_FLAG_NO_DIRECT_MAP to vm.create_guest_memfd(). [2] https://lore.kernel.org/all/[email protected]/ [3] https://sashiko.dev/#/patchset/20260611-shivank-gmem-migrate-v1-0-2d266bfc6f95%40amd.com Signed-off-by: Shivank Garg <[email protected]> --- Changes in v2: - Make folio migration opt-in through GUEST_MEMFD_FLAG_MIGRATABLE, preserving unmovable behavior if userspace don't explictly ask. (Alexandru, David, Sean) - Add kvm_arch_supports_gmem_migration() so arch can control whether GUEST_MEMFD_FLAG_MIGRATABLE is advertised. - Allocate movable folios with GFP_HIGHUSER_MOVABLE. (David) - Keep guest_memfd unevictable. (David, Sashiko, Sean) - Split migrate_folio() implementation and enablement as separate patches. - Update selftest with new flag. - Link to v1: https://lore.kernel.org/r/[email protected] --- Shivank Garg (4): mm: split AS_UNMOVABLE back out of AS_INACCESSIBLE KVM: guest_memfd: implement folio migration for non-confidential VMs KVM: guest_memfd: add GUEST_MEMFD_FLAG_MIGRATABLE KVM: selftests: exercise guest_memfd folio migration arch/x86/kvm/x86.c | 9 +++ include/linux/kvm_host.h | 4 ++ include/linux/pagemap.h | 24 ++++++-- include/uapi/linux/kvm.h | 1 + mm/compaction.c | 12 ++-- mm/migrate.c | 2 +- tools/include/uapi/linux/kvm.h | 1 + tools/testing/selftests/kvm/guest_memfd_test.c | 82 ++++++++++++++++++++++++++ virt/kvm/guest_memfd.c | 53 +++++++++++++++-- 9 files changed, 172 insertions(+), 16 deletions(-) --- base-commit: 62cc90241548d5570ee68e01aaba6506964e9811 change-id: 20260611-shivank-gmem-migrate-8c1c519b30a6 Best regards, -- Shivank Garg <[email protected]>

