diff --git a/resources/hiding_ci/linux_patches/0001-mm-Consolidate-freeing-of-typed-folios-on-final-foli.patch b/resources/hiding_ci/linux_patches/0001-mm-Consolidate-freeing-of-typed-folios-on-final-foli.patch index 0986dfacfeb..4d4b5572d8a 100644 --- a/resources/hiding_ci/linux_patches/0001-mm-Consolidate-freeing-of-typed-folios-on-final-foli.patch +++ b/resources/hiding_ci/linux_patches/0001-mm-Consolidate-freeing-of-typed-folios-on-final-foli.patch @@ -1,7 +1,7 @@ From f9ca710b51263ce8317cc2fa02232e456fa1f39c Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:15 +0000 -Subject: [PATCH 01/34] mm: Consolidate freeing of typed folios on final +Subject: [PATCH 01/26] mm: Consolidate freeing of typed folios on final folio_put() Some folio types, such as hugetlb, handle freeing their own diff --git a/resources/hiding_ci/linux_patches/0002-KVM-guest_memfd-Handle-final-folio_put-of-guest_memf.patch b/resources/hiding_ci/linux_patches/0002-KVM-guest_memfd-Handle-final-folio_put-of-guest_memf.patch index b9f4f83f442..d5778165add 100644 --- a/resources/hiding_ci/linux_patches/0002-KVM-guest_memfd-Handle-final-folio_put-of-guest_memf.patch +++ b/resources/hiding_ci/linux_patches/0002-KVM-guest_memfd-Handle-final-folio_put-of-guest_memf.patch @@ -1,7 +1,7 @@ From 9a4d7cd855d14e1522f363e3e04ebb9fa0a90ff0 Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:16 +0000 -Subject: [PATCH 02/34] KVM: guest_memfd: Handle final folio_put() of +Subject: [PATCH 02/26] KVM: guest_memfd: Handle final folio_put() of guest_memfd pages Before transitioning a guest_memfd folio to unshared, thereby diff --git a/resources/hiding_ci/linux_patches/0003-KVM-guest_memfd-Allow-host-to-map-guest_memfd-pages.patch b/resources/hiding_ci/linux_patches/0003-KVM-guest_memfd-Allow-host-to-map-guest_memfd-pages.patch index 8fb306b257b..13d7180fa19 100644 --- a/resources/hiding_ci/linux_patches/0003-KVM-guest_memfd-Allow-host-to-map-guest_memfd-pages.patch +++ b/resources/hiding_ci/linux_patches/0003-KVM-guest_memfd-Allow-host-to-map-guest_memfd-pages.patch @@ -1,7 +1,7 @@ From fd39febef2e0d41394e51f5e34f2c8de80b3b4dc Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:17 +0000 -Subject: [PATCH 03/34] KVM: guest_memfd: Allow host to map guest_memfd() pages +Subject: [PATCH 03/26] KVM: guest_memfd: Allow host to map guest_memfd() pages Add support for mmap() and fault() for guest_memfd backed memory in the host for VMs that support in-place conversion between diff --git a/resources/hiding_ci/linux_patches/0004-KVM-x86-Mark-KVM_X86_SW_PROTECTED_VM-as-supporting-g.patch b/resources/hiding_ci/linux_patches/0004-KVM-x86-Mark-KVM_X86_SW_PROTECTED_VM-as-supporting-g.patch index 33bf24f9415..2d32a4cefc2 100644 --- a/resources/hiding_ci/linux_patches/0004-KVM-x86-Mark-KVM_X86_SW_PROTECTED_VM-as-supporting-g.patch +++ b/resources/hiding_ci/linux_patches/0004-KVM-x86-Mark-KVM_X86_SW_PROTECTED_VM-as-supporting-g.patch @@ -1,7 +1,7 @@ From d16c343f0f95ecd8d2cda2dfba4ac8b7c293f217 Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:19 +0000 -Subject: [PATCH 04/34] KVM: x86: Mark KVM_X86_SW_PROTECTED_VM as supporting +Subject: [PATCH 04/26] KVM: x86: Mark KVM_X86_SW_PROTECTED_VM as supporting guest_memfd shared memory The KVM_X86_SW_PROTECTED_VM type is meant for experimentation and diff --git a/resources/hiding_ci/linux_patches/0005-KVM-arm64-Refactor-user_mem_abort-calculation-of-for.patch b/resources/hiding_ci/linux_patches/0005-KVM-arm64-Refactor-user_mem_abort-calculation-of-for.patch index 38b3292884d..905c88558d8 100644 --- a/resources/hiding_ci/linux_patches/0005-KVM-arm64-Refactor-user_mem_abort-calculation-of-for.patch +++ b/resources/hiding_ci/linux_patches/0005-KVM-arm64-Refactor-user_mem_abort-calculation-of-for.patch @@ -1,7 +1,7 @@ From 483ccb70335cb0c76161caf76c0ccb7c618038e2 Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:20 +0000 -Subject: [PATCH 05/34] KVM: arm64: Refactor user_mem_abort() calculation of +Subject: [PATCH 05/26] KVM: arm64: Refactor user_mem_abort() calculation of force_pte To simplify the code and to make the assumptions clearer, diff --git a/resources/hiding_ci/linux_patches/0006-KVM-guest_memfd-Handle-in-place-shared-memory-as-gue.patch b/resources/hiding_ci/linux_patches/0006-KVM-guest_memfd-Handle-in-place-shared-memory-as-gue.patch index 05d9e08b1fc..3e0dea5a7e6 100644 --- a/resources/hiding_ci/linux_patches/0006-KVM-guest_memfd-Handle-in-place-shared-memory-as-gue.patch +++ b/resources/hiding_ci/linux_patches/0006-KVM-guest_memfd-Handle-in-place-shared-memory-as-gue.patch @@ -1,7 +1,7 @@ From b1e925d4d5db8513dba67c3a9d40a2b507668f09 Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:18 +0000 -Subject: [PATCH 06/34] KVM: guest_memfd: Handle in-place shared memory as +Subject: [PATCH 06/26] KVM: guest_memfd: Handle in-place shared memory as guest_memfd backed memory For VMs that allow sharing guest_memfd backed memory in-place, diff --git a/resources/hiding_ci/linux_patches/0007-KVM-arm64-Handle-guest_memfd-backed-guest-page-fault.patch b/resources/hiding_ci/linux_patches/0007-KVM-arm64-Handle-guest_memfd-backed-guest-page-fault.patch index 1ce256e6f57..5b68d6e183e 100644 --- a/resources/hiding_ci/linux_patches/0007-KVM-arm64-Handle-guest_memfd-backed-guest-page-fault.patch +++ b/resources/hiding_ci/linux_patches/0007-KVM-arm64-Handle-guest_memfd-backed-guest-page-fault.patch @@ -1,7 +1,7 @@ From 996513a423377349767d5cfef87850e80131854f Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:21 +0000 -Subject: [PATCH 07/34] KVM: arm64: Handle guest_memfd()-backed guest page +Subject: [PATCH 07/26] KVM: arm64: Handle guest_memfd()-backed guest page faults Add arm64 support for handling guest page faults on guest_memfd diff --git a/resources/hiding_ci/linux_patches/0008-KVM-guest_memfd-selftests-guest_memfd-mmap-test-when.patch b/resources/hiding_ci/linux_patches/0008-KVM-guest_memfd-selftests-guest_memfd-mmap-test-when.patch index 872ee55d789..2a5a355a2e1 100644 --- a/resources/hiding_ci/linux_patches/0008-KVM-guest_memfd-selftests-guest_memfd-mmap-test-when.patch +++ b/resources/hiding_ci/linux_patches/0008-KVM-guest_memfd-selftests-guest_memfd-mmap-test-when.patch @@ -1,7 +1,7 @@ From 1ee5d01987bff47f007fb86ad7738b299816b2ef Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:23 +0000 -Subject: [PATCH 08/34] KVM: guest_memfd: selftests: guest_memfd mmap() test +Subject: [PATCH 08/26] KVM: guest_memfd: selftests: guest_memfd mmap() test when mapping is allowed Expand the guest_memfd selftests to include testing mapping guest diff --git a/resources/hiding_ci/linux_patches/0009-KVM-arm64-Enable-mapping-guest_memfd-in-arm64.patch b/resources/hiding_ci/linux_patches/0009-KVM-arm64-Enable-mapping-guest_memfd-in-arm64.patch index eb2cb3fd4e8..a03d592e4b0 100644 --- a/resources/hiding_ci/linux_patches/0009-KVM-arm64-Enable-mapping-guest_memfd-in-arm64.patch +++ b/resources/hiding_ci/linux_patches/0009-KVM-arm64-Enable-mapping-guest_memfd-in-arm64.patch @@ -1,7 +1,7 @@ From 3cc51efc17a2c41a480eed36b31c1773936717e0 Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Tue, 18 Mar 2025 16:18:22 +0000 -Subject: [PATCH 09/34] KVM: arm64: Enable mapping guest_memfd in arm64 +Subject: [PATCH 09/26] KVM: arm64: Enable mapping guest_memfd in arm64 Enable mapping guest_memfd in arm64. For now, it applies to all VMs in arm64 that use guest_memfd. In the future, new VM types diff --git a/resources/hiding_ci/linux_patches/0010-mm-introduce-AS_NO_DIRECT_MAP.patch b/resources/hiding_ci/linux_patches/0010-mm-introduce-AS_NO_DIRECT_MAP.patch index 0ec11b19bb7..bd336166268 100644 --- a/resources/hiding_ci/linux_patches/0010-mm-introduce-AS_NO_DIRECT_MAP.patch +++ b/resources/hiding_ci/linux_patches/0010-mm-introduce-AS_NO_DIRECT_MAP.patch @@ -1,7 +1,7 @@ From 22ec89c0ff7af3430027cf71cf8bce5c8ed6e402 Mon Sep 17 00:00:00 2001 From: Patrick Roy Date: Fri, 7 Feb 2025 11:16:06 +0000 -Subject: [PATCH 10/34] mm: introduce AS_NO_DIRECT_MAP +Subject: [PATCH 10/26] mm: introduce AS_NO_DIRECT_MAP Add AS_NO_DIRECT_MAP for mappings where direct map entries of folios are set to not present . Currently, mappings that match this description are diff --git a/resources/hiding_ci/linux_patches/0011-KVM-guest_memfd-Add-flag-to-remove-from-direct-map.patch b/resources/hiding_ci/linux_patches/0011-KVM-guest_memfd-Add-flag-to-remove-from-direct-map.patch index 0c8b984a2e6..dcce661a60e 100644 --- a/resources/hiding_ci/linux_patches/0011-KVM-guest_memfd-Add-flag-to-remove-from-direct-map.patch +++ b/resources/hiding_ci/linux_patches/0011-KVM-guest_memfd-Add-flag-to-remove-from-direct-map.patch @@ -1,7 +1,7 @@ From b1fc478976c93fd42b14e06d2de57e121be03142 Mon Sep 17 00:00:00 2001 From: Patrick Roy Date: Fri, 7 Feb 2025 14:33:01 +0000 -Subject: [PATCH 11/34] KVM: guest_memfd: Add flag to remove from direct map +Subject: [PATCH 11/26] KVM: guest_memfd: Add flag to remove from direct map Add KVM_GMEM_NO_DIRECT_MAP flag for KVM_CREATE_GUEST_MEMFD() ioctl. When set, guest_memfd folios will be removed from the direct map after diff --git a/resources/hiding_ci/linux_patches/0012-patrick-v4-fixup.patch b/resources/hiding_ci/linux_patches/0012-fixup-for-direct-map-removal-v4.patch similarity index 92% rename from resources/hiding_ci/linux_patches/0012-patrick-v4-fixup.patch rename to resources/hiding_ci/linux_patches/0012-fixup-for-direct-map-removal-v4.patch index 7532bcbe975..c54565134f1 100644 --- a/resources/hiding_ci/linux_patches/0012-patrick-v4-fixup.patch +++ b/resources/hiding_ci/linux_patches/0012-fixup-for-direct-map-removal-v4.patch @@ -1,7 +1,7 @@ -From 098a8167ad6c55336cad9abb808ebdc105784278 Mon Sep 17 00:00:00 2001 +From ab44b2d5bfb7ef9b7bbb156d493f49a4bbebf014 Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Thu, 10 Apr 2025 14:18:39 +0000 -Subject: [PATCH 12/34] patrick v4 fixup +Subject: [PATCH 12/26] fixup for direct map removal v4 Do not make kvm_gmem_free_folio dependent on CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE . diff --git a/resources/hiding_ci/linux_patches/0013-KVM-Add-KVM_MEM_USERFAULT-memslot-flag-and-bitmap.patch b/resources/hiding_ci/linux_patches/0013-KVM-Add-KVM_MEM_USERFAULT-memslot-flag-and-bitmap.patch index 263752c8c6e..f4a62443b72 100644 --- a/resources/hiding_ci/linux_patches/0013-KVM-Add-KVM_MEM_USERFAULT-memslot-flag-and-bitmap.patch +++ b/resources/hiding_ci/linux_patches/0013-KVM-Add-KVM_MEM_USERFAULT-memslot-flag-and-bitmap.patch @@ -1,7 +1,7 @@ -From abfa51cb95feaae899254453788c6db1c70d0189 Mon Sep 17 00:00:00 2001 +From 48a178e27031d5eac97ba0630686fcf3034e88ed Mon Sep 17 00:00:00 2001 From: James Houghton Date: Thu, 9 Jan 2025 20:49:17 +0000 -Subject: [PATCH 13/34] KVM: Add KVM_MEM_USERFAULT memslot flag and bitmap +Subject: [PATCH 13/26] KVM: Add KVM_MEM_USERFAULT memslot flag and bitmap Use one of the 14 reserved u64s in struct kvm_userspace_memory_region2 for the user to provide `userfault_bitmap`. diff --git a/resources/hiding_ci/linux_patches/0014-KVM-Add-KVM_MEMORY_EXIT_FLAG_USERFAULT.patch b/resources/hiding_ci/linux_patches/0014-KVM-Add-KVM_MEMORY_EXIT_FLAG_USERFAULT.patch index 11d3f4d0618..dddc2b9dbfd 100644 --- a/resources/hiding_ci/linux_patches/0014-KVM-Add-KVM_MEMORY_EXIT_FLAG_USERFAULT.patch +++ b/resources/hiding_ci/linux_patches/0014-KVM-Add-KVM_MEMORY_EXIT_FLAG_USERFAULT.patch @@ -1,7 +1,7 @@ -From 0a91075ecff4f60404bc05da0d10d41e1b33fcec Mon Sep 17 00:00:00 2001 +From 51a78015a0114ceaf1930739bba6111b1bc09f87 Mon Sep 17 00:00:00 2001 From: James Houghton Date: Thu, 9 Jan 2025 20:49:18 +0000 -Subject: [PATCH 14/34] KVM: Add KVM_MEMORY_EXIT_FLAG_USERFAULT +Subject: [PATCH 14/26] KVM: Add KVM_MEMORY_EXIT_FLAG_USERFAULT This flag is used for vCPU memory faults caused by KVM Userfault; i.e., the bit in `userfault_bitmap` corresponding to the faulting gfn was set. diff --git a/resources/hiding_ci/linux_patches/0015-KVM-Allow-late-setting-of-KVM_MEM_USERFAULT-on-guest.patch b/resources/hiding_ci/linux_patches/0015-KVM-Allow-late-setting-of-KVM_MEM_USERFAULT-on-guest.patch index 38f7624d108..7960341db8a 100644 --- a/resources/hiding_ci/linux_patches/0015-KVM-Allow-late-setting-of-KVM_MEM_USERFAULT-on-guest.patch +++ b/resources/hiding_ci/linux_patches/0015-KVM-Allow-late-setting-of-KVM_MEM_USERFAULT-on-guest.patch @@ -1,7 +1,7 @@ -From 7a626f99566e7ab7fce004fcf4041d87e75512cc Mon Sep 17 00:00:00 2001 +From ed691412fd9414d3b9124e2416f6cae3f21a1071 Mon Sep 17 00:00:00 2001 From: James Houghton Date: Thu, 9 Jan 2025 20:49:19 +0000 -Subject: [PATCH 15/34] KVM: Allow late setting of KVM_MEM_USERFAULT on +Subject: [PATCH 15/26] KVM: Allow late setting of KVM_MEM_USERFAULT on guest_memfd memslot Currently guest_memfd memslots can only be deleted. Slightly change the diff --git a/resources/hiding_ci/linux_patches/0016-KVM-x86-mmu-Add-support-for-KVM_MEM_USERFAULT.patch b/resources/hiding_ci/linux_patches/0016-KVM-x86-mmu-Add-support-for-KVM_MEM_USERFAULT.patch index 5895c60b415..ca31ca9518b 100644 --- a/resources/hiding_ci/linux_patches/0016-KVM-x86-mmu-Add-support-for-KVM_MEM_USERFAULT.patch +++ b/resources/hiding_ci/linux_patches/0016-KVM-x86-mmu-Add-support-for-KVM_MEM_USERFAULT.patch @@ -1,7 +1,7 @@ -From 7e9f22f83ca191df8deab84d7c8c9d64a1b5b10f Mon Sep 17 00:00:00 2001 +From fa324f2e503cd36dc357c3eb9b807e02f9b6206e Mon Sep 17 00:00:00 2001 From: James Houghton Date: Thu, 9 Jan 2025 20:49:21 +0000 -Subject: [PATCH 16/34] KVM: x86/mmu: Add support for KVM_MEM_USERFAULT +Subject: [PATCH 16/26] KVM: x86/mmu: Add support for KVM_MEM_USERFAULT Adhering to the requirements of KVM Userfault: diff --git a/resources/hiding_ci/linux_patches/0017-KVM-Advertise-KVM_CAP_USERFAULT-in-KVM_CHECK_EXTENSI.patch b/resources/hiding_ci/linux_patches/0017-KVM-Advertise-KVM_CAP_USERFAULT-in-KVM_CHECK_EXTENSI.patch index bdbcb9117ba..c89c7c9b262 100644 --- a/resources/hiding_ci/linux_patches/0017-KVM-Advertise-KVM_CAP_USERFAULT-in-KVM_CHECK_EXTENSI.patch +++ b/resources/hiding_ci/linux_patches/0017-KVM-Advertise-KVM_CAP_USERFAULT-in-KVM_CHECK_EXTENSI.patch @@ -1,7 +1,7 @@ -From fe6a44733d6384057fd68732ebf3aeb612443d14 Mon Sep 17 00:00:00 2001 +From f0ef961eba32b98755d2bfa5ff684944e3a442fc Mon Sep 17 00:00:00 2001 From: James Houghton Date: Thu, 9 Jan 2025 20:49:20 +0000 -Subject: [PATCH 17/34] KVM: Advertise KVM_CAP_USERFAULT in KVM_CHECK_EXTENSION +Subject: [PATCH 17/26] KVM: Advertise KVM_CAP_USERFAULT in KVM_CHECK_EXTENSION Advertise support for KVM_CAP_USERFAULT when kvm_has_userfault() returns true. Currently this is merely IS_ENABLED(CONFIG_HAVE_KVM_USERFAULT), so diff --git a/resources/hiding_ci/linux_patches/0018-KVM-arm64-Add-support-for-KVM_MEM_USERFAULT.patch b/resources/hiding_ci/linux_patches/0018-KVM-arm64-Add-support-for-KVM_MEM_USERFAULT.patch index bc9d608d15b..58f076e27cb 100644 --- a/resources/hiding_ci/linux_patches/0018-KVM-arm64-Add-support-for-KVM_MEM_USERFAULT.patch +++ b/resources/hiding_ci/linux_patches/0018-KVM-arm64-Add-support-for-KVM_MEM_USERFAULT.patch @@ -1,7 +1,7 @@ -From 86888e840dce0193dfb14916857df1c09749b618 Mon Sep 17 00:00:00 2001 +From 482a64008a53577da046428922f247dce203113f Mon Sep 17 00:00:00 2001 From: James Houghton Date: Thu, 9 Jan 2025 20:49:22 +0000 -Subject: [PATCH 18/34] KVM: arm64: Add support for KVM_MEM_USERFAULT +Subject: [PATCH 18/26] KVM: arm64: Add support for KVM_MEM_USERFAULT Adhering to the requirements of KVM Userfault: 1. When it is toggled on, zap the second stage with diff --git a/resources/hiding_ci/linux_patches/0026-KVM-guest_memfd-add-generic-population-via-write.patch b/resources/hiding_ci/linux_patches/0019-KVM-guest_memfd-add-generic-population-via-write.patch similarity index 96% rename from resources/hiding_ci/linux_patches/0026-KVM-guest_memfd-add-generic-population-via-write.patch rename to resources/hiding_ci/linux_patches/0019-KVM-guest_memfd-add-generic-population-via-write.patch index f7c1cce60f2..0c05129841e 100644 --- a/resources/hiding_ci/linux_patches/0026-KVM-guest_memfd-add-generic-population-via-write.patch +++ b/resources/hiding_ci/linux_patches/0019-KVM-guest_memfd-add-generic-population-via-write.patch @@ -1,7 +1,7 @@ -From dda48e07b48f344c57d8ed90ddad7e01c26f7952 Mon Sep 17 00:00:00 2001 +From f81fae83d40e1520a0a46afa3473f9fc4c6b7c79 Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Fri, 29 Nov 2024 11:51:02 +0000 -Subject: [PATCH 26/34] KVM: guest_memfd: add generic population via write +Subject: [PATCH 19/26] KVM: guest_memfd: add generic population via write write syscall populates guest_memfd with user-supplied data in a generic way, ie no vendor-specific preparation is performed. This is supposed diff --git a/resources/hiding_ci/linux_patches/0019-KVM-selftests-Fix-vm_mem_region_set_flags-docstring.patch b/resources/hiding_ci/linux_patches/0019-KVM-selftests-Fix-vm_mem_region_set_flags-docstring.patch deleted file mode 100644 index effde901d5b..00000000000 --- a/resources/hiding_ci/linux_patches/0019-KVM-selftests-Fix-vm_mem_region_set_flags-docstring.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 398111201a62de89a4973295512b303d74ea0662 Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:23 +0000 -Subject: [PATCH 19/34] KVM: selftests: Fix vm_mem_region_set_flags docstring - -`flags` is what region->region.flags gets set to. - -Signed-off-by: James Houghton ---- - tools/testing/selftests/kvm/lib/kvm_util.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c -index 33fefeb3ca44..a87988a162f1 100644 ---- a/tools/testing/selftests/kvm/lib/kvm_util.c -+++ b/tools/testing/selftests/kvm/lib/kvm_util.c -@@ -1124,7 +1124,7 @@ memslot2region(struct kvm_vm *vm, uint32_t memslot) - * - * Input Args: - * vm - Virtual Machine -- * flags - Starting guest physical address -+ * flags - Flags for the memslot - * - * Output Args: None - * --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0020-KVM-selftests-Fix-prefault_mem-logic.patch b/resources/hiding_ci/linux_patches/0020-KVM-selftests-Fix-prefault_mem-logic.patch deleted file mode 100644 index e97c522033e..00000000000 --- a/resources/hiding_ci/linux_patches/0020-KVM-selftests-Fix-prefault_mem-logic.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 281292095132694847d44d12de0268045ae727ec Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:24 +0000 -Subject: [PATCH 20/34] KVM: selftests: Fix prefault_mem logic - -The previous logic didn't handle the case where memory was partitioned -AND we were using a single userfaultfd. It would only prefault the first -vCPU's memory and not the rest. - -Signed-off-by: James Houghton ---- - tools/testing/selftests/kvm/demand_paging_test.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c -index 0202b78f8680..315f5c9037b4 100644 ---- a/tools/testing/selftests/kvm/demand_paging_test.c -+++ b/tools/testing/selftests/kvm/demand_paging_test.c -@@ -172,11 +172,13 @@ static void run_test(enum vm_guest_mode mode, void *arg) - memset(guest_data_prototype, 0xAB, demand_paging_size); - - if (p->uffd_mode == UFFDIO_REGISTER_MODE_MINOR) { -- num_uffds = p->single_uffd ? 1 : nr_vcpus; -- for (i = 0; i < num_uffds; i++) { -+ for (i = 0; i < nr_vcpus; i++) { - vcpu_args = &memstress_args.vcpu_args[i]; - prefault_mem(addr_gpa2alias(vm, vcpu_args->gpa), - vcpu_args->pages * memstress_args.guest_page_size); -+ if (!p->partition_vcpu_memory_access) -+ /* We prefaulted everything */ -+ break; - } - } - --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0027-KVM-selftests-update-guest_memfd-write-tests.patch b/resources/hiding_ci/linux_patches/0020-KVM-selftests-update-guest_memfd-write-tests.patch similarity index 97% rename from resources/hiding_ci/linux_patches/0027-KVM-selftests-update-guest_memfd-write-tests.patch rename to resources/hiding_ci/linux_patches/0020-KVM-selftests-update-guest_memfd-write-tests.patch index 6062f6fd982..869144f63d0 100644 --- a/resources/hiding_ci/linux_patches/0027-KVM-selftests-update-guest_memfd-write-tests.patch +++ b/resources/hiding_ci/linux_patches/0020-KVM-selftests-update-guest_memfd-write-tests.patch @@ -1,7 +1,7 @@ -From 120635067e2d910bf96a53e3b7e2f2d5be19af7e Mon Sep 17 00:00:00 2001 +From 3ccb28e0fe31afa8ac626ebd5b957ba9263a68d3 Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Fri, 29 Nov 2024 11:57:58 +0000 -Subject: [PATCH 27/34] KVM: selftests: update guest_memfd write tests +Subject: [PATCH 20/26] KVM: selftests: update guest_memfd write tests This is to reflect that the write syscall is now implemented for guest_memfd. diff --git a/resources/hiding_ci/linux_patches/0021-KVM-selftests-Add-va_start-end-into-uffd_desc.patch b/resources/hiding_ci/linux_patches/0021-KVM-selftests-Add-va_start-end-into-uffd_desc.patch deleted file mode 100644 index 67bf2b8c9d8..00000000000 --- a/resources/hiding_ci/linux_patches/0021-KVM-selftests-Add-va_start-end-into-uffd_desc.patch +++ /dev/null @@ -1,44 +0,0 @@ -From c64583011616045a4b70e34aeef6fd77e6f23ccc Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:25 +0000 -Subject: [PATCH 21/34] KVM: selftests: Add va_start/end into uffd_desc - -This will be used for the self-test to look up which userfaultfd we -should be using when handling a KVM Userfault (in the event KVM -Userfault and userfaultfd are being used together). - -Signed-off-by: James Houghton ---- - tools/testing/selftests/kvm/include/userfaultfd_util.h | 2 ++ - tools/testing/selftests/kvm/lib/userfaultfd_util.c | 2 ++ - 2 files changed, 4 insertions(+) - -diff --git a/tools/testing/selftests/kvm/include/userfaultfd_util.h b/tools/testing/selftests/kvm/include/userfaultfd_util.h -index 60f7f9d435dc..b62fecdfe745 100644 ---- a/tools/testing/selftests/kvm/include/userfaultfd_util.h -+++ b/tools/testing/selftests/kvm/include/userfaultfd_util.h -@@ -30,6 +30,8 @@ struct uffd_desc { - int *pipefds; - pthread_t *readers; - struct uffd_reader_args *reader_args; -+ void *va_start; -+ void *va_end; - }; - - struct uffd_desc *uffd_setup_demand_paging(int uffd_mode, useconds_t delay, -diff --git a/tools/testing/selftests/kvm/lib/userfaultfd_util.c b/tools/testing/selftests/kvm/lib/userfaultfd_util.c -index 7c9de8414462..93004c85bcdc 100644 ---- a/tools/testing/selftests/kvm/lib/userfaultfd_util.c -+++ b/tools/testing/selftests/kvm/lib/userfaultfd_util.c -@@ -152,6 +152,8 @@ struct uffd_desc *uffd_setup_demand_paging(int uffd_mode, useconds_t delay, - expected_ioctls, "missing userfaultfd ioctls"); - - uffd_desc->uffd = uffd; -+ uffd_desc->va_start = hva; -+ uffd_desc->va_end = (char *)hva + len; - for (i = 0; i < uffd_desc->num_readers; ++i) { - int pipes[2]; - --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0028-mm-userfaultfd-generic-continue-for-non-hugetlbfs.patch b/resources/hiding_ci/linux_patches/0021-mm-userfaultfd-generic-continue-for-non-hugetlbfs.patch similarity index 97% rename from resources/hiding_ci/linux_patches/0028-mm-userfaultfd-generic-continue-for-non-hugetlbfs.patch rename to resources/hiding_ci/linux_patches/0021-mm-userfaultfd-generic-continue-for-non-hugetlbfs.patch index e610f502a9b..4818a87a713 100644 --- a/resources/hiding_ci/linux_patches/0028-mm-userfaultfd-generic-continue-for-non-hugetlbfs.patch +++ b/resources/hiding_ci/linux_patches/0021-mm-userfaultfd-generic-continue-for-non-hugetlbfs.patch @@ -1,7 +1,7 @@ -From 38fb84551a238b98a622433157fb2537ecb5611e Mon Sep 17 00:00:00 2001 +From 51dc7d27476d00d96f6f71882a11b5e17e80aa8f Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Mon, 31 Mar 2025 10:15:35 +0000 -Subject: [PATCH 28/34] mm: userfaultfd: generic continue for non hugetlbfs +Subject: [PATCH 21/26] mm: userfaultfd: generic continue for non hugetlbfs Remove shmem-specific code from UFFDIO_CONTINUE implementation for non-huge pages by calling vm_ops->fault(). A new VMF flag, diff --git a/resources/hiding_ci/linux_patches/0022-KVM-selftests-Inform-set_memory_region_test-of-KVM_M.patch b/resources/hiding_ci/linux_patches/0022-KVM-selftests-Inform-set_memory_region_test-of-KVM_M.patch deleted file mode 100644 index 22ec8dbcc83..00000000000 --- a/resources/hiding_ci/linux_patches/0022-KVM-selftests-Inform-set_memory_region_test-of-KVM_M.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 73cef3464706c3665efcbac533979e83716b0d86 Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:27 +0000 -Subject: [PATCH 22/34] KVM: selftests: Inform set_memory_region_test of - KVM_MEM_USERFAULT - -The KVM_MEM_USERFAULT flag is supported iff KVM_CAP_USERFAULT is -available. - -Signed-off-by: James Houghton ---- - tools/testing/selftests/kvm/set_memory_region_test.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c -index bc440d5aba57..56231c02d88c 100644 ---- a/tools/testing/selftests/kvm/set_memory_region_test.c -+++ b/tools/testing/selftests/kvm/set_memory_region_test.c -@@ -364,6 +364,9 @@ static void test_invalid_memory_region_flags(void) - if (kvm_check_cap(KVM_CAP_MEMORY_ATTRIBUTES) & KVM_MEMORY_ATTRIBUTE_PRIVATE) - supported_flags |= KVM_MEM_GUEST_MEMFD; - -+ if (kvm_check_cap(KVM_CAP_USERFAULT)) -+ supported_flags |= KVM_MEM_USERFAULT; -+ - for (i = 0; i < 32; i++) { - if ((supported_flags & BIT(i)) && !(v2_only_flags & BIT(i))) - continue; --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0029-mm-provide-can_userfault-vma-operation.patch b/resources/hiding_ci/linux_patches/0022-mm-provide-can_userfault-vma-operation.patch similarity index 95% rename from resources/hiding_ci/linux_patches/0029-mm-provide-can_userfault-vma-operation.patch rename to resources/hiding_ci/linux_patches/0022-mm-provide-can_userfault-vma-operation.patch index 0f939d066d1..b6bc10178cc 100644 --- a/resources/hiding_ci/linux_patches/0029-mm-provide-can_userfault-vma-operation.patch +++ b/resources/hiding_ci/linux_patches/0022-mm-provide-can_userfault-vma-operation.patch @@ -1,7 +1,7 @@ -From bcfff7f58b747aac6f27a51ce54efe5eae4b02f9 Mon Sep 17 00:00:00 2001 +From 7ed09f6e50ea4e4448e457a7b7712bdf3b38e826 Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Fri, 4 Apr 2025 14:15:18 +0000 -Subject: [PATCH 29/34] mm: provide can_userfault vma operation +Subject: [PATCH 22/26] mm: provide can_userfault vma operation The new operation allows to decouple the userfaulfd code from dependencies to VMA types, specifically, shmem and hugetlb. The diff --git a/resources/hiding_ci/linux_patches/0023-KVM-selftests-Add-KVM-Userfault-mode-to-demand_pagin.patch b/resources/hiding_ci/linux_patches/0023-KVM-selftests-Add-KVM-Userfault-mode-to-demand_pagin.patch deleted file mode 100644 index d0b3c5e7489..00000000000 --- a/resources/hiding_ci/linux_patches/0023-KVM-selftests-Add-KVM-Userfault-mode-to-demand_pagin.patch +++ /dev/null @@ -1,381 +0,0 @@ -From 6aa865fbd91cb293da61db4e11f0ce1a6de36cae Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:26 +0000 -Subject: [PATCH 23/34] KVM: selftests: Add KVM Userfault mode to - demand_paging_test - -Add a way for the KVM_RUN loop to handle -EFAULT exits when they are for -KVM_MEMORY_EXIT_FLAG_USERFAULT. In this case, preemptively handle the -UFFDIO_COPY or UFFDIO_CONTINUE if userfaultfd is also in use. This saves -the trip through the userfaultfd poll/read/WAKE loop. - -When preemptively handling UFFDIO_COPY/CONTINUE, do so with -MODE_DONTWAKE, as there will not be a thread to wake. If a thread *does* -take the userfaultfd slow path, we will get a regular userfault, and we -will call handle_uffd_page_request() which will do a full wake-up. In -the EEXIST case, a wake-up will not occur. Make sure to call UFFDIO_WAKE -explicitly in this case. - -When handling KVM userfaults, make sure to set the bitmap with -memory_order_release. Although it wouldn't affect the functionality of -the test (because memstress doesn't actually require any particular -guest memory contents), it is what userspace normally needs to do. - -Add `-k` to set the test to use KVM Userfault. - -Add the vm_mem_region_set_flags_userfault() helper for setting -`userfault_bitmap` and KVM_MEM_USERFAULT at the same time. - -Signed-off-by: James Houghton ---- - .../selftests/kvm/demand_paging_test.c | 139 +++++++++++++++++- - .../testing/selftests/kvm/include/kvm_util.h | 5 + - tools/testing/selftests/kvm/lib/kvm_util.c | 40 ++++- - 3 files changed, 176 insertions(+), 8 deletions(-) - -diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c -index 315f5c9037b4..183c70731093 100644 ---- a/tools/testing/selftests/kvm/demand_paging_test.c -+++ b/tools/testing/selftests/kvm/demand_paging_test.c -@@ -12,7 +12,9 @@ - #include - #include - #include -+#include - #include -+#include - - #include "kvm_util.h" - #include "test_util.h" -@@ -24,11 +26,21 @@ - #ifdef __NR_userfaultfd - - static int nr_vcpus = 1; -+static int num_uffds; - static uint64_t guest_percpu_mem_size = DEFAULT_PER_VCPU_MEM_SIZE; - - static size_t demand_paging_size; -+static size_t host_page_size; - static char *guest_data_prototype; - -+static struct { -+ bool enabled; -+ int uffd_mode; /* set if userfaultfd is also in use */ -+ struct uffd_desc **uffd_descs; -+} kvm_userfault_data; -+ -+static void resolve_kvm_userfault(u64 gpa, u64 size); -+ - static void vcpu_worker(struct memstress_vcpu_args *vcpu_args) - { - struct kvm_vcpu *vcpu = vcpu_args->vcpu; -@@ -41,8 +53,22 @@ static void vcpu_worker(struct memstress_vcpu_args *vcpu_args) - clock_gettime(CLOCK_MONOTONIC, &start); - - /* Let the guest access its memory */ -+restart: - ret = _vcpu_run(vcpu); -- TEST_ASSERT(ret == 0, "vcpu_run failed: %d", ret); -+ if (ret < 0 && errno == EFAULT && kvm_userfault_data.enabled) { -+ /* Check for userfault. */ -+ TEST_ASSERT(run->exit_reason == KVM_EXIT_MEMORY_FAULT, -+ "Got invalid exit reason: %x", run->exit_reason); -+ TEST_ASSERT(run->memory_fault.flags == -+ KVM_MEMORY_EXIT_FLAG_USERFAULT, -+ "Got invalid memory fault exit: %llx", -+ run->memory_fault.flags); -+ resolve_kvm_userfault(run->memory_fault.gpa, -+ run->memory_fault.size); -+ goto restart; -+ } else -+ TEST_ASSERT(ret == 0, "vcpu_run failed: %d", ret); -+ - if (get_ucall(vcpu, NULL) != UCALL_SYNC) { - TEST_ASSERT(false, - "Invalid guest sync status: exit_reason=%s", -@@ -54,11 +80,10 @@ static void vcpu_worker(struct memstress_vcpu_args *vcpu_args) - ts_diff.tv_sec, ts_diff.tv_nsec); - } - --static int handle_uffd_page_request(int uffd_mode, int uffd, -- struct uffd_msg *msg) -+static int resolve_uffd_page_request(int uffd_mode, int uffd, uint64_t addr, -+ bool wake) - { - pid_t tid = syscall(__NR_gettid); -- uint64_t addr = msg->arg.pagefault.address; - struct timespec start; - struct timespec ts_diff; - int r; -@@ -71,7 +96,7 @@ static int handle_uffd_page_request(int uffd_mode, int uffd, - copy.src = (uint64_t)guest_data_prototype; - copy.dst = addr; - copy.len = demand_paging_size; -- copy.mode = 0; -+ copy.mode = wake ? 0 : UFFDIO_COPY_MODE_DONTWAKE; - - r = ioctl(uffd, UFFDIO_COPY, ©); - /* -@@ -96,6 +121,7 @@ static int handle_uffd_page_request(int uffd_mode, int uffd, - - cont.range.start = addr; - cont.range.len = demand_paging_size; -+ cont.mode = wake ? 0 : UFFDIO_CONTINUE_MODE_DONTWAKE; - - r = ioctl(uffd, UFFDIO_CONTINUE, &cont); - /* -@@ -119,6 +145,20 @@ static int handle_uffd_page_request(int uffd_mode, int uffd, - TEST_FAIL("Invalid uffd mode %d", uffd_mode); - } - -+ if (r < 0 && wake) { -+ /* -+ * No wake-up occurs when UFFDIO_COPY/CONTINUE fails, but we -+ * have a thread waiting. Wake it up. -+ */ -+ struct uffdio_range range = {0}; -+ -+ range.start = addr; -+ range.len = demand_paging_size; -+ -+ TEST_ASSERT(ioctl(uffd, UFFDIO_WAKE, &range) == 0, -+ "UFFDIO_WAKE failed: 0x%lx", addr); -+ } -+ - ts_diff = timespec_elapsed(start); - - PER_PAGE_DEBUG("UFFD page-in %d \t%ld ns\n", tid, -@@ -129,6 +169,58 @@ static int handle_uffd_page_request(int uffd_mode, int uffd, - return 0; - } - -+static int handle_uffd_page_request(int uffd_mode, int uffd, -+ struct uffd_msg *msg) -+{ -+ uint64_t addr = msg->arg.pagefault.address; -+ -+ return resolve_uffd_page_request(uffd_mode, uffd, addr, true); -+} -+ -+static void resolve_kvm_userfault(u64 gpa, u64 size) -+{ -+ struct kvm_vm *vm = memstress_args.vm; -+ struct userspace_mem_region *region; -+ unsigned long *bitmap_chunk; -+ u64 page, gpa_offset; -+ -+ region = (struct userspace_mem_region *) userspace_mem_region_find( -+ vm, gpa, (gpa + size - 1)); -+ -+ if (kvm_userfault_data.uffd_mode) { -+ /* -+ * Resolve userfaults early, without needing to read them -+ * off the userfaultfd. -+ */ -+ uint64_t hva = (uint64_t)addr_gpa2hva(vm, gpa); -+ struct uffd_desc **descs = kvm_userfault_data.uffd_descs; -+ int i, fd; -+ -+ for (i = 0; i < num_uffds; ++i) -+ if (hva >= (uint64_t)descs[i]->va_start && -+ hva < (uint64_t)descs[i]->va_end) -+ break; -+ -+ TEST_ASSERT(i < num_uffds, -+ "Did not find userfaultfd for hva: %lx", hva); -+ -+ fd = kvm_userfault_data.uffd_descs[i]->uffd; -+ resolve_uffd_page_request(kvm_userfault_data.uffd_mode, fd, -+ hva, false); -+ } else { -+ uint64_t hva = (uint64_t)addr_gpa2hva(vm, gpa); -+ -+ memcpy((char *)hva, guest_data_prototype, demand_paging_size); -+ } -+ -+ gpa_offset = gpa - region->region.guest_phys_addr; -+ page = gpa_offset / host_page_size; -+ bitmap_chunk = (unsigned long *)region->region.userfault_bitmap + -+ page / BITS_PER_LONG; -+ atomic_fetch_and_explicit((_Atomic unsigned long *)bitmap_chunk, -+ ~(1ul << (page % BITS_PER_LONG)), memory_order_release); -+} -+ - struct test_params { - int uffd_mode; - bool single_uffd; -@@ -136,6 +228,7 @@ struct test_params { - int readers_per_uffd; - enum vm_mem_backing_src_type src_type; - bool partition_vcpu_memory_access; -+ bool kvm_userfault; - }; - - static void prefault_mem(void *alias, uint64_t len) -@@ -149,6 +242,25 @@ static void prefault_mem(void *alias, uint64_t len) - } - } - -+static void enable_userfault(struct kvm_vm *vm, int slots) -+{ -+ for (int i = 0; i < slots; ++i) { -+ int slot = MEMSTRESS_MEM_SLOT_INDEX + i; -+ struct userspace_mem_region *region; -+ unsigned long *userfault_bitmap; -+ int flags = KVM_MEM_USERFAULT; -+ -+ region = memslot2region(vm, slot); -+ userfault_bitmap = bitmap_zalloc(region->mmap_size / -+ host_page_size); -+ /* everything is userfault initially */ -+ memset(userfault_bitmap, -1, region->mmap_size / host_page_size / CHAR_BIT); -+ printf("Setting bitmap: %p\n", userfault_bitmap); -+ vm_mem_region_set_flags_userfault(vm, slot, flags, -+ userfault_bitmap); -+ } -+} -+ - static void run_test(enum vm_guest_mode mode, void *arg) - { - struct memstress_vcpu_args *vcpu_args; -@@ -159,12 +271,13 @@ static void run_test(enum vm_guest_mode mode, void *arg) - struct timespec ts_diff; - double vcpu_paging_rate; - struct kvm_vm *vm; -- int i, num_uffds = 0; -+ int i; - - vm = memstress_create_vm(mode, nr_vcpus, guest_percpu_mem_size, 1, - p->src_type, p->partition_vcpu_memory_access); - - demand_paging_size = get_backing_src_pagesz(p->src_type); -+ host_page_size = getpagesize(); - - guest_data_prototype = malloc(demand_paging_size); - TEST_ASSERT(guest_data_prototype, -@@ -208,6 +321,14 @@ static void run_test(enum vm_guest_mode mode, void *arg) - } - } - -+ if (p->kvm_userfault) { -+ TEST_REQUIRE(kvm_has_cap(KVM_CAP_USERFAULT)); -+ kvm_userfault_data.enabled = true; -+ kvm_userfault_data.uffd_mode = p->uffd_mode; -+ kvm_userfault_data.uffd_descs = uffd_descs; -+ enable_userfault(vm, 1); -+ } -+ - pr_info("Finished creating vCPUs and starting uffd threads\n"); - - clock_gettime(CLOCK_MONOTONIC, &start); -@@ -265,6 +386,7 @@ static void help(char *name) - printf(" -v: specify the number of vCPUs to run.\n"); - printf(" -o: Overlap guest memory accesses instead of partitioning\n" - " them into a separate region of memory for each vCPU.\n"); -+ printf(" -k: Use KVM Userfault\n"); - puts(""); - exit(0); - } -@@ -283,7 +405,7 @@ int main(int argc, char *argv[]) - - guest_modes_append_default(); - -- while ((opt = getopt(argc, argv, "ahom:u:d:b:s:v:c:r:")) != -1) { -+ while ((opt = getopt(argc, argv, "ahokm:u:d:b:s:v:c:r:")) != -1) { - switch (opt) { - case 'm': - guest_modes_cmdline(optarg); -@@ -326,6 +448,9 @@ int main(int argc, char *argv[]) - "Invalid number of readers per uffd %d: must be >=1", - p.readers_per_uffd); - break; -+ case 'k': -+ p.kvm_userfault = true; -+ break; - case 'h': - default: - help(argv[0]); -diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h -index 4c4e5a847f67..0d49a9ce832a 100644 ---- a/tools/testing/selftests/kvm/include/kvm_util.h -+++ b/tools/testing/selftests/kvm/include/kvm_util.h -@@ -582,6 +582,8 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, - void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type, - uint64_t guest_paddr, uint32_t slot, uint64_t npages, - uint32_t flags, int guest_memfd_fd, uint64_t guest_memfd_offset); -+struct userspace_mem_region * -+userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end); - - #ifndef vm_arch_has_protected_memory - static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) -@@ -591,6 +593,9 @@ static inline bool vm_arch_has_protected_memory(struct kvm_vm *vm) - #endif - - void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags); -+void vm_mem_region_set_flags_userfault(struct kvm_vm *vm, uint32_t slot, -+ uint32_t flags, -+ unsigned long *userfault_bitmap); - void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa); - void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot); - struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id); -diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c -index a87988a162f1..a8f6b949ac59 100644 ---- a/tools/testing/selftests/kvm/lib/kvm_util.c -+++ b/tools/testing/selftests/kvm/lib/kvm_util.c -@@ -634,7 +634,7 @@ void kvm_parse_vcpu_pinning(const char *pcpus_string, uint32_t vcpu_to_pcpu[], - * of the regions is returned. Null is returned only when no overlapping - * region exists. - */ --static struct userspace_mem_region * -+struct userspace_mem_region * - userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end) - { - struct rb_node *node; -@@ -1149,6 +1149,44 @@ void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags) - ret, errno, slot, flags); - } - -+/* -+ * VM Memory Region Flags Set with a userfault bitmap -+ * -+ * Input Args: -+ * vm - Virtual Machine -+ * flags - Flags for the memslot -+ * userfault_bitmap - The bitmap to use for KVM_MEM_USERFAULT -+ * -+ * Output Args: None -+ * -+ * Return: None -+ * -+ * Sets the flags of the memory region specified by the value of slot, -+ * to the values given by flags. This helper adds a way to provide a -+ * userfault_bitmap. -+ */ -+void vm_mem_region_set_flags_userfault(struct kvm_vm *vm, uint32_t slot, -+ uint32_t flags, -+ unsigned long *userfault_bitmap) -+{ -+ int ret; -+ struct userspace_mem_region *region; -+ -+ region = memslot2region(vm, slot); -+ -+ TEST_ASSERT(!userfault_bitmap ^ (flags & KVM_MEM_USERFAULT), -+ "KVM_MEM_USERFAULT must be specified with a bitmap"); -+ -+ region->region.flags = flags; -+ region->region.userfault_bitmap = (__u64)userfault_bitmap; -+ -+ ret = __vm_ioctl(vm, KVM_SET_USER_MEMORY_REGION2, ®ion->region); -+ -+ TEST_ASSERT(ret == 0, "KVM_SET_USER_MEMORY_REGION2 IOCTL failed,\n" -+ " rc: %i errno: %i slot: %u flags: 0x%x", -+ ret, errno, slot, flags); -+} -+ - /* - * VM Memory Region Move - * --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0030-mm-userfaultfd-use-can_userfault-vma-operation.patch b/resources/hiding_ci/linux_patches/0023-mm-userfaultfd-use-can_userfault-vma-operation.patch similarity index 95% rename from resources/hiding_ci/linux_patches/0030-mm-userfaultfd-use-can_userfault-vma-operation.patch rename to resources/hiding_ci/linux_patches/0023-mm-userfaultfd-use-can_userfault-vma-operation.patch index 3344989cb31..ce5130bb620 100644 --- a/resources/hiding_ci/linux_patches/0030-mm-userfaultfd-use-can_userfault-vma-operation.patch +++ b/resources/hiding_ci/linux_patches/0023-mm-userfaultfd-use-can_userfault-vma-operation.patch @@ -1,7 +1,7 @@ -From 2c19b37bc94ef338ec540424a9a1eee95ffbdc3c Mon Sep 17 00:00:00 2001 +From 04555059b68ba6e2aeb678da706a8290e3598df0 Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Fri, 4 Apr 2025 14:16:49 +0000 -Subject: [PATCH 30/34] mm: userfaultfd: use can_userfault vma operation +Subject: [PATCH 23/26] mm: userfaultfd: use can_userfault vma operation Signed-off-by: Nikita Kalyazin --- diff --git a/resources/hiding_ci/linux_patches/0031-KVM-guest_memfd-add-support-for-userfaultfd-minor.patch b/resources/hiding_ci/linux_patches/0024-KVM-guest_memfd-add-support-for-userfaultfd-minor.patch similarity index 90% rename from resources/hiding_ci/linux_patches/0031-KVM-guest_memfd-add-support-for-userfaultfd-minor.patch rename to resources/hiding_ci/linux_patches/0024-KVM-guest_memfd-add-support-for-userfaultfd-minor.patch index 4e544677625..37dc68e3989 100644 --- a/resources/hiding_ci/linux_patches/0031-KVM-guest_memfd-add-support-for-userfaultfd-minor.patch +++ b/resources/hiding_ci/linux_patches/0024-KVM-guest_memfd-add-support-for-userfaultfd-minor.patch @@ -1,7 +1,7 @@ -From 140a906e90e2ba2092148d80e0764e54802c947c Mon Sep 17 00:00:00 2001 +From b806003684d08506cb66c664efdfda3d7ff6103e Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Tue, 1 Apr 2025 15:02:56 +0000 -Subject: [PATCH 31/34] KVM: guest_memfd: add support for userfaultfd minor +Subject: [PATCH 24/26] KVM: guest_memfd: add support for userfaultfd minor Add support for sending a pagefault event if userfaultfd is registered. Only page minor event is currently supported. diff --git a/resources/hiding_ci/linux_patches/0024-KVM-selftests-Add-KVM_MEM_USERFAULT-guest_memfd-togg.patch b/resources/hiding_ci/linux_patches/0024-KVM-selftests-Add-KVM_MEM_USERFAULT-guest_memfd-togg.patch deleted file mode 100644 index 36b151a0f3c..00000000000 --- a/resources/hiding_ci/linux_patches/0024-KVM-selftests-Add-KVM_MEM_USERFAULT-guest_memfd-togg.patch +++ /dev/null @@ -1,65 +0,0 @@ -From be1d7a3ce1b177d64198b8e060bc9a3844f462cd Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:28 +0000 -Subject: [PATCH 24/34] KVM: selftests: Add KVM_MEM_USERFAULT + guest_memfd - toggle tests - -Make sure KVM_MEM_USERFAULT can be toggled on and off for -KVM_MEM_GUEST_MEMFD memslots. - -Signed-off-by: James Houghton ---- - .../selftests/kvm/set_memory_region_test.c | 30 +++++++++++++++++++ - 1 file changed, 30 insertions(+) - -diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c -index 56231c02d88c..95d315b976df 100644 ---- a/tools/testing/selftests/kvm/set_memory_region_test.c -+++ b/tools/testing/selftests/kvm/set_memory_region_test.c -@@ -608,6 +608,35 @@ static void test_mmio_during_vectoring(void) - } - #endif - -+static void test_private_memory_region_userfault(void) -+{ -+ struct kvm_vm *vm; -+ int memfd; -+ -+ pr_info("Testing toggling KVM_MEM_USERFAULT on KVM_MEM_GUEST_MEMFD memory regions\n"); -+ -+ vm = vm_create_barebones_type(KVM_X86_SW_PROTECTED_VM); -+ -+ test_invalid_guest_memfd(vm, vm->kvm_fd, 0, "KVM fd should fail"); -+ test_invalid_guest_memfd(vm, vm->fd, 0, "VM's fd should fail"); -+ -+ memfd = vm_create_guest_memfd(vm, MEM_REGION_SIZE, 0); -+ -+ vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_GUEST_MEMFD, -+ MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); -+ -+ vm_set_user_memory_region2(vm, MEM_REGION_SLOT, -+ KVM_MEM_GUEST_MEMFD | KVM_MEM_USERFAULT, -+ MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); -+ -+ vm_set_user_memory_region2(vm, MEM_REGION_SLOT, KVM_MEM_GUEST_MEMFD, -+ MEM_REGION_GPA, MEM_REGION_SIZE, 0, memfd, 0); -+ -+ close(memfd); -+ -+ kvm_vm_free(vm); -+} -+ - int main(int argc, char *argv[]) - { - #ifdef __x86_64__ -@@ -633,6 +662,7 @@ int main(int argc, char *argv[]) - (kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM))) { - test_add_private_memory_region(); - test_add_overlapping_private_memory_regions(); -+ test_private_memory_region_userfault(); - } else { - pr_info("Skipping tests for KVM_MEM_GUEST_MEMFD memory regions\n"); - } --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0025-KVM-Documentation-Add-KVM_CAP_USERFAULT-and-KVM_MEM_.patch b/resources/hiding_ci/linux_patches/0025-KVM-Documentation-Add-KVM_CAP_USERFAULT-and-KVM_MEM_.patch deleted file mode 100644 index 68aa5a42ad1..00000000000 --- a/resources/hiding_ci/linux_patches/0025-KVM-Documentation-Add-KVM_CAP_USERFAULT-and-KVM_MEM_.patch +++ /dev/null @@ -1,76 +0,0 @@ -From fb4c74191df7821bf047af099473dd8f20948b43 Mon Sep 17 00:00:00 2001 -From: James Houghton -Date: Thu, 9 Jan 2025 20:49:29 +0000 -Subject: [PATCH 25/34] KVM: Documentation: Add KVM_CAP_USERFAULT and - KVM_MEM_USERFAULT details - -Include the note about memory ordering when clearing bits in -userfault_bitmap, as it may not be obvious for users. - -Signed-off-by: James Houghton -Reviewed-by: Bagas Sanjaya ---- - Documentation/virt/kvm/api.rst | 33 ++++++++++++++++++++++++++++++++- - 1 file changed, 32 insertions(+), 1 deletion(-) - -diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst -index 2b52eb77e29c..3ec3d0bdb18a 100644 ---- a/Documentation/virt/kvm/api.rst -+++ b/Documentation/virt/kvm/api.rst -@@ -6287,7 +6287,8 @@ bounds checks apply (use common sense). - __u64 guest_memfd_offset; - __u32 guest_memfd; - __u32 pad1; -- __u64 pad2[14]; -+ __u64 userfault_bitmap; -+ __u64 pad2[13]; - }; - - A KVM_MEM_GUEST_MEMFD region _must_ have a valid guest_memfd (private memory) and -@@ -6303,6 +6304,25 @@ state. At VM creation time, all memory is shared, i.e. the PRIVATE attribute - is '0' for all gfns. Userspace can control whether memory is shared/private by - toggling KVM_MEMORY_ATTRIBUTE_PRIVATE via KVM_SET_MEMORY_ATTRIBUTES as needed. - -+When the KVM_MEM_USERFAULT flag is set, userfault_bitmap points to the starting -+address for the bitmap that controls if vCPU memory faults should immediately -+exit to userspace. If an invalid pointer is provided, at fault time, KVM_RUN -+will return -EFAULT. KVM_MEM_USERFAULT is only supported when -+KVM_CAP_USERFAULT is supported. -+ -+userfault_bitmap should point to an array of longs where each bit in the array -+linearly corresponds to a single gfn. Bit 0 in userfault_bitmap corresponds to -+guest_phys_addr, bit 1 corresponds to guest_phys_addr + PAGE_SIZE, etc. If the -+bit for a page is set, any vCPU access to that page will exit to userspace with -+KVM_MEMORY_EXIT_FLAG_USERFAULT. -+ -+Setting bits in userfault_bitmap has no effect on pages that have already been -+mapped by KVM until KVM_MEM_USERFAULT is disabled and re-enabled again. -+ -+Clearing bits in userfault_bitmap should usually be done with a store-release -+if changes to guest memory are being made available to the guest via -+userfault_bitmap. -+ - S390: - ^^^^^ - -@@ -8258,6 +8278,17 @@ KVM exits with the register state of either the L1 or L2 guest - depending on which executed at the time of an exit. Userspace must - take care to differentiate between these cases. - -+7.37 KVM_CAP_USERFAULT -+---------------------- -+ -+:Architectures: x86, arm64 -+:Returns: Informational only, -EINVAL on direct KVM_ENABLE_CAP. -+ -+The presence of this capability indicates that KVM_SET_USER_MEMORY_REGION2 will -+accept KVM_MEM_USERFAULT as a valid memslot flag. -+ -+See KVM_SET_USER_MEMORY_REGION2 for more details. -+ - 8. Other capabilities. - ====================== - --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0032-mm-userfaultfd-add-UFFD_FEATURE_MINOR_GUEST_MEMFD.patch b/resources/hiding_ci/linux_patches/0025-mm-userfaultfd-add-UFFD_FEATURE_MINOR_GUEST_MEMFD.patch similarity index 94% rename from resources/hiding_ci/linux_patches/0032-mm-userfaultfd-add-UFFD_FEATURE_MINOR_GUEST_MEMFD.patch rename to resources/hiding_ci/linux_patches/0025-mm-userfaultfd-add-UFFD_FEATURE_MINOR_GUEST_MEMFD.patch index 3700d496c49..777a2b05e66 100644 --- a/resources/hiding_ci/linux_patches/0032-mm-userfaultfd-add-UFFD_FEATURE_MINOR_GUEST_MEMFD.patch +++ b/resources/hiding_ci/linux_patches/0025-mm-userfaultfd-add-UFFD_FEATURE_MINOR_GUEST_MEMFD.patch @@ -1,7 +1,7 @@ -From 27e27a59e6139f780439f13cf7180f06c5b0d518 Mon Sep 17 00:00:00 2001 +From 6c5886204ff8d306cc4ee945235c88eb854ebf7f Mon Sep 17 00:00:00 2001 From: Nikita Kalyazin Date: Fri, 4 Apr 2025 14:18:03 +0000 -Subject: [PATCH 32/34] mm: userfaultfd: add UFFD_FEATURE_MINOR_GUEST_MEMFD +Subject: [PATCH 25/26] mm: userfaultfd: add UFFD_FEATURE_MINOR_GUEST_MEMFD Signed-off-by: Nikita Kalyazin --- diff --git a/resources/hiding_ci/linux_patches/0026-fixup-for-guest_memfd-uffd-v3.patch b/resources/hiding_ci/linux_patches/0026-fixup-for-guest_memfd-uffd-v3.patch new file mode 100644 index 00000000000..2aa0a3bea09 --- /dev/null +++ b/resources/hiding_ci/linux_patches/0026-fixup-for-guest_memfd-uffd-v3.patch @@ -0,0 +1,70 @@ +From d950436a063f021ae0d925509363106625eafe0f Mon Sep 17 00:00:00 2001 +From: Nikita Kalyazin +Date: Thu, 10 Apr 2025 14:18:53 +0000 +Subject: [PATCH 26/26] fixup for guest_memfd uffd v3 + + - implement can_userfault for guest_memfd + - check vma->vm_ops pointer before dereferencing + - proper check for VM_UFFD_MINOR +--- + include/linux/userfaultfd_k.h | 6 ++++-- + mm/userfaultfd.c | 4 +++- + virt/kvm/guest_memfd.c | 9 ++++++++- + 3 files changed, 15 insertions(+), 4 deletions(-) + +diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h +index 64551e8a55fb..080437fa7eab 100644 +--- a/include/linux/userfaultfd_k.h ++++ b/include/linux/userfaultfd_k.h +@@ -221,8 +221,10 @@ static inline bool vma_can_userfault(struct vm_area_struct *vma, + if (vm_flags & VM_DROPPABLE) + return false; + +- if (!vma->vm_ops->can_userfault || +- !vma->vm_ops->can_userfault(vma, VM_UFFD_MINOR)) ++ if ((vm_flags & VM_UFFD_MINOR) && ++ (!vma->vm_ops || ++ !vma->vm_ops->can_userfault || ++ !vma->vm_ops->can_userfault(vma, VM_UFFD_MINOR))) + return false; + + /* +diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c +index 0aa82c968e16..638360a78561 100644 +--- a/mm/userfaultfd.c ++++ b/mm/userfaultfd.c +@@ -788,7 +788,9 @@ static __always_inline ssize_t mfill_atomic(struct userfaultfd_ctx *ctx, + return mfill_atomic_hugetlb(ctx, dst_vma, dst_start, + src_start, len, flags); + +- can_userfault = dst_vma->vm_ops->can_userfault && ++ can_userfault = ++ dst_vma->vm_ops && ++ dst_vma->vm_ops->can_userfault && + dst_vma->vm_ops->can_userfault(dst_vma, __VM_UFFD_FLAGS); + + if (!vma_is_anonymous(dst_vma) && !can_userfault) +diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c +index 91ee5dd91c31..202b12dc4b6f 100644 +--- a/virt/kvm/guest_memfd.c ++++ b/virt/kvm/guest_memfd.c +@@ -420,8 +420,15 @@ static vm_fault_t kvm_gmem_fault(struct vm_fault *vmf) + return ret; + } + ++static bool kvm_gmem_can_userfault(struct vm_area_struct *vma, ++ unsigned long vm_flags) ++{ ++ return vm_flags & VM_UFFD_MINOR; ++} ++ + static const struct vm_operations_struct kvm_gmem_vm_ops = { +- .fault = kvm_gmem_fault, ++ .fault = kvm_gmem_fault, ++ .can_userfault = kvm_gmem_can_userfault, + }; + + static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) +-- +2.47.1 + diff --git a/resources/hiding_ci/linux_patches/0033-KVM-selftests-test-userfaultfd-minor-for-guest_memfd.patch b/resources/hiding_ci/linux_patches/0033-KVM-selftests-test-userfaultfd-minor-for-guest_memfd.patch deleted file mode 100644 index bfade8ef68a..00000000000 --- a/resources/hiding_ci/linux_patches/0033-KVM-selftests-test-userfaultfd-minor-for-guest_memfd.patch +++ /dev/null @@ -1,146 +0,0 @@ -From 4647a42c34b3896fd872f8b2991b55827d084a38 Mon Sep 17 00:00:00 2001 -From: Nikita Kalyazin -Date: Fri, 28 Feb 2025 16:17:41 +0000 -Subject: [PATCH 33/34] KVM: selftests: test userfaultfd minor for guest_memfd - -The test demonstrates that a minor userfaultfd event in guest_memfd can -be resolved via a memcpy followed by a UFFDIO_CONTINUE ioctl. - -Signed-off-by: Nikita Kalyazin ---- - .../testing/selftests/kvm/guest_memfd_test.c | 99 +++++++++++++++++++ - 1 file changed, 99 insertions(+) - -diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c -index b07221aa54c9..c9578f0ce46f 100644 ---- a/tools/testing/selftests/kvm/guest_memfd_test.c -+++ b/tools/testing/selftests/kvm/guest_memfd_test.c -@@ -10,12 +10,16 @@ - #include - #include - #include -+#include - - #include - #include -+#include - #include - #include - #include -+#include -+#include - - #include "kvm_util.h" - #include "test_util.h" -@@ -278,6 +282,98 @@ static void test_create_guest_memfd_multiple(struct kvm_vm *vm) - close(fd1); - } - -+struct fault_args { -+ char *addr; -+ volatile char value; -+}; -+ -+static void *fault_thread_fn(void *arg) -+{ -+ struct fault_args *args = arg; -+ -+ /* Trigger page fault */ -+ args->value = *args->addr; -+ return NULL; -+} -+ -+static void test_uffd_minor(int fd, size_t page_size, size_t total_size) -+{ -+ struct uffdio_register uffd_reg; -+ struct uffdio_continue uffd_cont; -+ struct uffd_msg msg; -+ struct fault_args args; -+ pthread_t fault_thread; -+ void *mem, *mem_nofault, *buf = NULL; -+ int uffd, ret; -+ off_t offset = page_size; -+ void *fault_addr; -+ -+ ret = posix_memalign(&buf, page_size, total_size); -+ TEST_ASSERT_EQ(ret, 0); -+ -+ uffd = syscall(__NR_userfaultfd, O_CLOEXEC); -+ TEST_ASSERT(uffd != -1, "userfaultfd creation should succeed"); -+ -+ struct uffdio_api uffdio_api = { -+ .api = UFFD_API, -+ .features = UFFD_FEATURE_MINOR_GUEST_MEMFD, -+ }; -+ ret = ioctl(uffd, UFFDIO_API, &uffdio_api); -+ TEST_ASSERT(ret != -1, "ioctl(UFFDIO_API) should succeed"); -+ -+ mem = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); -+ TEST_ASSERT(mem != MAP_FAILED, "mmap should succeed"); -+ -+ mem_nofault = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); -+ TEST_ASSERT(mem_nofault != MAP_FAILED, "mmap should succeed"); -+ -+ uffd_reg.range.start = (unsigned long)mem; -+ uffd_reg.range.len = total_size; -+ uffd_reg.mode = UFFDIO_REGISTER_MODE_MINOR; -+ ret = ioctl(uffd, UFFDIO_REGISTER, &uffd_reg); -+ TEST_ASSERT(ret != -1, "ioctl(UFFDIO_REGISTER) should succeed"); -+ -+ ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, -+ offset, page_size); -+ TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) should succeed"); -+ -+ fault_addr = mem + offset; -+ args.addr = fault_addr; -+ -+ ret = pthread_create(&fault_thread, NULL, fault_thread_fn, &args); -+ TEST_ASSERT(ret == 0, "pthread_create should succeed"); -+ -+ ret = read(uffd, &msg, sizeof(msg)); -+ TEST_ASSERT(ret != -1, "read from userfaultfd should succeed"); -+ TEST_ASSERT(msg.event == UFFD_EVENT_PAGEFAULT, "event type should be pagefault"); -+ TEST_ASSERT((void *)(msg.arg.pagefault.address & ~(page_size - 1)) == fault_addr, -+ "pagefault should occur at expected address"); -+ -+ memcpy(mem_nofault + offset, buf + offset, page_size); -+ -+ uffd_cont.range.start = (unsigned long)fault_addr; -+ uffd_cont.range.len = page_size; -+ uffd_cont.mode = 0; -+ ret = ioctl(uffd, UFFDIO_CONTINUE, &uffd_cont); -+ TEST_ASSERT(ret != -1, "ioctl(UFFDIO_CONTINUE) should succeed"); -+ -+ TEST_ASSERT(args.value == *(char *)(mem_nofault + offset), -+ "memory should contain the value that was copied"); -+ TEST_ASSERT(args.value == *(char *)(mem + offset), -+ "no further fault is expected"); -+ -+ ret = pthread_join(fault_thread, NULL); -+ TEST_ASSERT(ret == 0, "pthread_join should succeed"); -+ -+ ret = munmap(mem_nofault, total_size); -+ TEST_ASSERT(!ret, "munmap should succeed"); -+ -+ ret = munmap(mem, total_size); -+ TEST_ASSERT(!ret, "munmap should succeed"); -+ free(buf); -+ close(uffd); -+} -+ - unsigned long get_shared_type(void) - { - #ifdef __x86_64__ -@@ -317,6 +413,9 @@ void test_vm_type(unsigned long type, bool is_shared) - test_fallocate(fd, page_size, total_size); - test_invalid_punch_hole(fd, page_size, total_size); - -+ if (is_shared) -+ test_uffd_minor(fd, page_size, total_size); -+ - close(fd); - kvm_vm_release(vm); - } --- -2.47.1 - diff --git a/resources/hiding_ci/linux_patches/0034-uffd-v3-fixup.patch b/resources/hiding_ci/linux_patches/0034-uffd-v3-fixup.patch deleted file mode 100644 index 41df6ff2428..00000000000 --- a/resources/hiding_ci/linux_patches/0034-uffd-v3-fixup.patch +++ /dev/null @@ -1,50 +0,0 @@ -From a03bf9042094cc0fd1b2a71307b6e0b02e8500d8 Mon Sep 17 00:00:00 2001 -From: Nikita Kalyazin -Date: Thu, 10 Apr 2025 14:18:53 +0000 -Subject: [PATCH 34/34] uffd v3 fixup - - - implement can_userfault for guest_memfd - - check vma->vm_ops pointer before dereferencing ---- - include/linux/userfaultfd_k.h | 3 ++- - virt/kvm/guest_memfd.c | 9 ++++++++- - 2 files changed, 10 insertions(+), 2 deletions(-) - -diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h -index 64551e8a55fb..92fb5372bea5 100644 ---- a/include/linux/userfaultfd_k.h -+++ b/include/linux/userfaultfd_k.h -@@ -221,7 +221,8 @@ static inline bool vma_can_userfault(struct vm_area_struct *vma, - if (vm_flags & VM_DROPPABLE) - return false; - -- if (!vma->vm_ops->can_userfault || -+ if (!vma->vm_ops || -+ !vma->vm_ops->can_userfault || - !vma->vm_ops->can_userfault(vma, VM_UFFD_MINOR)) - return false; - -diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c -index 91ee5dd91c31..202b12dc4b6f 100644 ---- a/virt/kvm/guest_memfd.c -+++ b/virt/kvm/guest_memfd.c -@@ -420,8 +420,15 @@ static vm_fault_t kvm_gmem_fault(struct vm_fault *vmf) - return ret; - } - -+static bool kvm_gmem_can_userfault(struct vm_area_struct *vma, -+ unsigned long vm_flags) -+{ -+ return vm_flags & VM_UFFD_MINOR; -+} -+ - static const struct vm_operations_struct kvm_gmem_vm_ops = { -- .fault = kvm_gmem_fault, -+ .fault = kvm_gmem_fault, -+ .can_userfault = kvm_gmem_can_userfault, - }; - - static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) --- -2.47.1 -