tools/testing/selftests/kvm/Makefile.kvm | 11 +-
.../testing/selftests/kvm/include/kvm_util.h | 1 +
.../selftests/kvm/include/x86/processor.h | 34 ++-
.../selftests/kvm/include/x86/svm_util.h | 8 +
tools/testing/selftests/kvm/include/x86/vmx.h | 15 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 3 -
.../testing/selftests/kvm/lib/x86/memstress.c | 6 +-
.../testing/selftests/kvm/lib/x86/processor.c | 184 +++++++++++---
tools/testing/selftests/kvm/lib/x86/svm.c | 19 ++
tools/testing/selftests/kvm/lib/x86/vmx.c | 232 +++---------------
tools/testing/selftests/kvm/mmu_stress_test.c | 6 +-
...ested_test.c => close_while_nested_test.c} | 42 +++-
.../selftests/kvm/x86/hyperv_features.c | 2 +-
tools/testing/selftests/kvm/x86/hyperv_ipi.c | 18 +-
.../selftests/kvm/x86/hyperv_tlb_flush.c | 2 +-
...rty_log_test.c => nested_dirty_log_test.c} | 102 +++++---
.../kvm/x86/nested_invalid_cr3_test.c | 118 +++++++++
...adjust_test.c => nested_tsc_adjust_test.c} | 79 +++---
...aling_test.c => nested_tsc_scaling_test.c} | 48 +++-
...d_state_test.c => set_nested_state_test.c} | 135 +++++++++-
.../selftests/kvm/x86/sev_smoke_test.c | 2 +-
tools/testing/selftests/kvm/x86/state_test.c | 2 +-
.../selftests/kvm/x86/userspace_io_test.c | 2 +-
23 files changed, 695 insertions(+), 376 deletions(-)
rename tools/testing/selftests/kvm/x86/{vmx_close_while_nested_test.c => close_while_nested_test.c} (64%)
rename tools/testing/selftests/kvm/x86/{vmx_dirty_log_test.c => nested_dirty_log_test.c} (57%)
create mode 100644 tools/testing/selftests/kvm/x86/nested_invalid_cr3_test.c
rename tools/testing/selftests/kvm/x86/{vmx_tsc_adjust_test.c => nested_tsc_adjust_test.c} (61%)
rename tools/testing/selftests/kvm/x86/{vmx_nested_tsc_scaling_test.c => nested_tsc_scaling_test.c} (83%)
rename tools/testing/selftests/kvm/x86/{vmx_set_nested_state_test.c => set_nested_state_test.c} (67%)
There are multiple selftests exercising nested VMX that are not specific
to VMX (at least not anymore). Extend their coverage to nested SVM.
This version is significantly different (and longer) than v1 [1], mainly
due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
mappings instead of extending the existing nested EPT infrastructure. It
also has a lot more fixups and cleanups.
This series depends on two other series:
- "KVM: SVM: GIF and EFER.SVME are independent" [2]
- "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
The dependency on the former is because set_nested_state_test is now
also a regression test for that fix. The dependency on the latter is
purely to avoid conflicts.
The patch ordering is not perfect, I did some cleanups toward the end
that arguably should have been moved to the beginning, but I had to stop
rebasing and send the patches out at some point:
Block #1 (patch 1 to patch 7):
- Direct successors to the first 6 patches in v1, addressing review
comments from Jim and collecting his review tags. These patch extend 5
of the nVMX tests to cover nSVM.
Block #2 (patch 8 to patch 11):
- Miscellaneous fixups and cleanups.
Block #3 (patch 11 to patch 17):
- Moving nested EPT mapping functions to use __virt_pg_map(), patches 11
to 15 do the prep work, and patch 16 does the switch. Patch 17 is a
minor cleanup on top (which arguably fits better in block #2).
Block #4 (patch 18 to 23):
- Patches 18 to 22 are prep work to generalize the nested EPT mapping
code to work with nested NPT, and patch 23 finally extends the nested
dirty logging test to work with nSVM using the nested NPT
infrastructure. Patch 19 is admittedly an imposter in this block and
should have been in block #2.
[1]https://lore.kernel.org/kvm/20251001145816.1414855-1-yosry.ahmed@linux.dev/
[2]https://lore.kernel.org/kvm/20251009223153.3344555-1-jmattson@google.com/
[3]https://lore.kernel.org/kvm/20250917215031.2567566-1-jmattson@google.com/
Yosry Ahmed (23):
KVM: selftests: Minor improvements to asserts in
test_vmx_nested_state()
KVM: selftests: Extend vmx_set_nested_state_test to cover SVM
KVM: selftests: Extend vmx_close_while_nested_test to cover SVM
KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM
KVM: selftests: Move nested invalid CR3 check to its own test
KVM: selftests: Extend nested_invalid_cr3_test to cover SVM
KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM
KVM: selftests: Stop hardcoding PAGE_SIZE in x86 selftests
KVM: selftests: Remove the unused argument to prepare_eptp()
KVM: selftests: Stop using __virt_pg_map() directly in tests
KVM: selftests: Make sure vm->vpages_mapped is always up-to-date
KVM: selftests: Parameterize the PTE bitmasks for virt mapping
functions
KVM: selftests: Pass the root GPA into virt_get_pte()
KVM: selftests: Pass the root GPA into __virt_pg_map()
KVM: selftests: Stop setting AD bits on nested EPTs on creation
KVM: selftests: Use __virt_pg_map() for nested EPTs
KVM: selftests: Kill eptPageTablePointer
KVM: selftests: Generalize nested mapping functions
KVM: selftests: Move nested MMU mapping functions outside of vmx.c
KVM: selftests: Stop passing a memslot to nested_map_memslot()
KVM: selftests: Allow kvm_cpu_has_ept() to be called on AMD CPUs
KVM: selftests: Set the user bit on nested MMU PTEs
KVM: selftests: Extend vmx_dirty_log_test to cover SVM
tools/testing/selftests/kvm/Makefile.kvm | 11 +-
.../testing/selftests/kvm/include/kvm_util.h | 1 +
.../selftests/kvm/include/x86/processor.h | 34 ++-
.../selftests/kvm/include/x86/svm_util.h | 8 +
tools/testing/selftests/kvm/include/x86/vmx.h | 15 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 3 -
.../testing/selftests/kvm/lib/x86/memstress.c | 6 +-
.../testing/selftests/kvm/lib/x86/processor.c | 184 +++++++++++---
tools/testing/selftests/kvm/lib/x86/svm.c | 19 ++
tools/testing/selftests/kvm/lib/x86/vmx.c | 232 +++---------------
tools/testing/selftests/kvm/mmu_stress_test.c | 6 +-
...ested_test.c => close_while_nested_test.c} | 42 +++-
.../selftests/kvm/x86/hyperv_features.c | 2 +-
tools/testing/selftests/kvm/x86/hyperv_ipi.c | 18 +-
.../selftests/kvm/x86/hyperv_tlb_flush.c | 2 +-
...rty_log_test.c => nested_dirty_log_test.c} | 102 +++++---
.../kvm/x86/nested_invalid_cr3_test.c | 118 +++++++++
...adjust_test.c => nested_tsc_adjust_test.c} | 79 +++---
...aling_test.c => nested_tsc_scaling_test.c} | 48 +++-
...d_state_test.c => set_nested_state_test.c} | 135 +++++++++-
.../selftests/kvm/x86/sev_smoke_test.c | 2 +-
tools/testing/selftests/kvm/x86/state_test.c | 2 +-
.../selftests/kvm/x86/userspace_io_test.c | 2 +-
23 files changed, 695 insertions(+), 376 deletions(-)
rename tools/testing/selftests/kvm/x86/{vmx_close_while_nested_test.c => close_while_nested_test.c} (64%)
rename tools/testing/selftests/kvm/x86/{vmx_dirty_log_test.c => nested_dirty_log_test.c} (57%)
create mode 100644 tools/testing/selftests/kvm/x86/nested_invalid_cr3_test.c
rename tools/testing/selftests/kvm/x86/{vmx_tsc_adjust_test.c => nested_tsc_adjust_test.c} (61%)
rename tools/testing/selftests/kvm/x86/{vmx_nested_tsc_scaling_test.c => nested_tsc_scaling_test.c} (83%)
rename tools/testing/selftests/kvm/x86/{vmx_set_nested_state_test.c => set_nested_state_test.c} (67%)
--
2.51.0.869.ge66316f041-goog
On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> There are multiple selftests exercising nested VMX that are not specific
> to VMX (at least not anymore). Extend their coverage to nested SVM.
>
> This version is significantly different (and longer) than v1 [1], mainly
> due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> mappings instead of extending the existing nested EPT infrastructure. It
> also has a lot more fixups and cleanups.
>
> This series depends on two other series:
> - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
v2 of Jim's series switches all tests to use 57-bit by default when
available:
https://lore.kernel.org/kvm/20251028225827.2269128-4-jmattson@google.com/
This breaks moving nested EPT mappings to use __virt_pg_map() because
nested EPTs are hardcoded to use 4-level paging, while __virt_pg_map()
will assume we're using 5-level paging.
Patch #16 ("KVM: selftests: Use __virt_pg_map() for nested EPTs") will
need the following diff to make nested EPTs use the same paging level as
the guest:
diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
index 358143bf8dd0d..8bacb74c00053 100644
--- a/tools/testing/selftests/kvm/lib/x86/vmx.c
+++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
@@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
uint64_t ept_paddr;
struct eptPageTablePointer eptp = {
.memory_type = X86_MEMTYPE_WB,
- .page_walk_length = 3, /* + 1 */
+ .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
.ad_enabled = ept_vpid_cap_supported(VMX_EPT_VPID_CAP_AD_BITS),
.address = vmx->eptp_gpa >> PAGE_SHIFT_4K,
};
Which will conflict at patch #17, and should end up looking like this:
uint64_t eptp = vmx->eptp_gpa | EPTP_WB;
eptp |= get_cr4() & X86_CR4_LA57 ? EPTP_PWL_5 : EPTP_PWL_4;
Sean, let me know if you prefer that I rebase this series on top of
Jim's v2 and resend, or if you'll fix it up while applying.
>
> The dependency on the former is because set_nested_state_test is now
> also a regression test for that fix. The dependency on the latter is
> purely to avoid conflicts.
>
> The patch ordering is not perfect, I did some cleanups toward the end
> that arguably should have been moved to the beginning, but I had to stop
> rebasing and send the patches out at some point:
>
> Block #1 (patch 1 to patch 7):
> - Direct successors to the first 6 patches in v1, addressing review
> comments from Jim and collecting his review tags. These patch extend 5
> of the nVMX tests to cover nSVM.
>
> Block #2 (patch 8 to patch 11):
> - Miscellaneous fixups and cleanups.
>
> Block #3 (patch 11 to patch 17):
> - Moving nested EPT mapping functions to use __virt_pg_map(), patches 11
> to 15 do the prep work, and patch 16 does the switch. Patch 17 is a
> minor cleanup on top (which arguably fits better in block #2).
>
> Block #4 (patch 18 to 23):
> - Patches 18 to 22 are prep work to generalize the nested EPT mapping
> code to work with nested NPT, and patch 23 finally extends the nested
> dirty logging test to work with nSVM using the nested NPT
> infrastructure. Patch 19 is admittedly an imposter in this block and
> should have been in block #2.
>
> [1]https://lore.kernel.org/kvm/20251001145816.1414855-1-yosry.ahmed@linux.dev/
> [2]https://lore.kernel.org/kvm/20251009223153.3344555-1-jmattson@google.com/
> [3]https://lore.kernel.org/kvm/20250917215031.2567566-1-jmattson@google.com/
>
> Yosry Ahmed (23):
> KVM: selftests: Minor improvements to asserts in
> test_vmx_nested_state()
> KVM: selftests: Extend vmx_set_nested_state_test to cover SVM
> KVM: selftests: Extend vmx_close_while_nested_test to cover SVM
> KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM
> KVM: selftests: Move nested invalid CR3 check to its own test
> KVM: selftests: Extend nested_invalid_cr3_test to cover SVM
> KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM
> KVM: selftests: Stop hardcoding PAGE_SIZE in x86 selftests
> KVM: selftests: Remove the unused argument to prepare_eptp()
> KVM: selftests: Stop using __virt_pg_map() directly in tests
> KVM: selftests: Make sure vm->vpages_mapped is always up-to-date
> KVM: selftests: Parameterize the PTE bitmasks for virt mapping
> functions
> KVM: selftests: Pass the root GPA into virt_get_pte()
> KVM: selftests: Pass the root GPA into __virt_pg_map()
> KVM: selftests: Stop setting AD bits on nested EPTs on creation
> KVM: selftests: Use __virt_pg_map() for nested EPTs
> KVM: selftests: Kill eptPageTablePointer
> KVM: selftests: Generalize nested mapping functions
> KVM: selftests: Move nested MMU mapping functions outside of vmx.c
> KVM: selftests: Stop passing a memslot to nested_map_memslot()
> KVM: selftests: Allow kvm_cpu_has_ept() to be called on AMD CPUs
> KVM: selftests: Set the user bit on nested MMU PTEs
> KVM: selftests: Extend vmx_dirty_log_test to cover SVM
>
> tools/testing/selftests/kvm/Makefile.kvm | 11 +-
> .../testing/selftests/kvm/include/kvm_util.h | 1 +
> .../selftests/kvm/include/x86/processor.h | 34 ++-
> .../selftests/kvm/include/x86/svm_util.h | 8 +
> tools/testing/selftests/kvm/include/x86/vmx.h | 15 +-
> tools/testing/selftests/kvm/lib/kvm_util.c | 3 -
> .../testing/selftests/kvm/lib/x86/memstress.c | 6 +-
> .../testing/selftests/kvm/lib/x86/processor.c | 184 +++++++++++---
> tools/testing/selftests/kvm/lib/x86/svm.c | 19 ++
> tools/testing/selftests/kvm/lib/x86/vmx.c | 232 +++---------------
> tools/testing/selftests/kvm/mmu_stress_test.c | 6 +-
> ...ested_test.c => close_while_nested_test.c} | 42 +++-
> .../selftests/kvm/x86/hyperv_features.c | 2 +-
> tools/testing/selftests/kvm/x86/hyperv_ipi.c | 18 +-
> .../selftests/kvm/x86/hyperv_tlb_flush.c | 2 +-
> ...rty_log_test.c => nested_dirty_log_test.c} | 102 +++++---
> .../kvm/x86/nested_invalid_cr3_test.c | 118 +++++++++
> ...adjust_test.c => nested_tsc_adjust_test.c} | 79 +++---
> ...aling_test.c => nested_tsc_scaling_test.c} | 48 +++-
> ...d_state_test.c => set_nested_state_test.c} | 135 +++++++++-
> .../selftests/kvm/x86/sev_smoke_test.c | 2 +-
> tools/testing/selftests/kvm/x86/state_test.c | 2 +-
> .../selftests/kvm/x86/userspace_io_test.c | 2 +-
> 23 files changed, 695 insertions(+), 376 deletions(-)
> rename tools/testing/selftests/kvm/x86/{vmx_close_while_nested_test.c => close_while_nested_test.c} (64%)
> rename tools/testing/selftests/kvm/x86/{vmx_dirty_log_test.c => nested_dirty_log_test.c} (57%)
> create mode 100644 tools/testing/selftests/kvm/x86/nested_invalid_cr3_test.c
> rename tools/testing/selftests/kvm/x86/{vmx_tsc_adjust_test.c => nested_tsc_adjust_test.c} (61%)
> rename tools/testing/selftests/kvm/x86/{vmx_nested_tsc_scaling_test.c => nested_tsc_scaling_test.c} (83%)
> rename tools/testing/selftests/kvm/x86/{vmx_set_nested_state_test.c => set_nested_state_test.c} (67%)
>
> --
> 2.51.0.869.ge66316f041-goog
>
On Tue, Nov 18, 2025 at 2:26 PM Yosry Ahmed <yosry.ahmed@linux.dev> wrote:
>
> On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> > There are multiple selftests exercising nested VMX that are not specific
> > to VMX (at least not anymore). Extend their coverage to nested SVM.
> >
> > This version is significantly different (and longer) than v1 [1], mainly
> > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> > mappings instead of extending the existing nested EPT infrastructure. It
> > also has a lot more fixups and cleanups.
> >
> > This series depends on two other series:
> > - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
>
> v2 of Jim's series switches all tests to use 57-bit by default when
> available:
> https://lore.kernel.org/kvm/20251028225827.2269128-4-jmattson@google.com/
>
> This breaks moving nested EPT mappings to use __virt_pg_map() because
> nested EPTs are hardcoded to use 4-level paging, while __virt_pg_map()
> will assume we're using 5-level paging.
>
> Patch #16 ("KVM: selftests: Use __virt_pg_map() for nested EPTs") will
> need the following diff to make nested EPTs use the same paging level as
> the guest:
>
> diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
> index 358143bf8dd0d..8bacb74c00053 100644
> --- a/tools/testing/selftests/kvm/lib/x86/vmx.c
> +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
> @@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
> uint64_t ept_paddr;
> struct eptPageTablePointer eptp = {
> .memory_type = X86_MEMTYPE_WB,
> - .page_walk_length = 3, /* + 1 */
> + .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
LA57 does not imply support for 5-level EPT. (SRF, IIRC)
On Tue, Nov 18, 2025 at 03:00:26PM -0800, Jim Mattson wrote:
> On Tue, Nov 18, 2025 at 2:26 PM Yosry Ahmed <yosry.ahmed@linux.dev> wrote:
> >
> > On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> > > There are multiple selftests exercising nested VMX that are not specific
> > > to VMX (at least not anymore). Extend their coverage to nested SVM.
> > >
> > > This version is significantly different (and longer) than v1 [1], mainly
> > > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> > > mappings instead of extending the existing nested EPT infrastructure. It
> > > also has a lot more fixups and cleanups.
> > >
> > > This series depends on two other series:
> > > - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> > > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
> >
> > v2 of Jim's series switches all tests to use 57-bit by default when
> > available:
> > https://lore.kernel.org/kvm/20251028225827.2269128-4-jmattson@google.com/
> >
> > This breaks moving nested EPT mappings to use __virt_pg_map() because
> > nested EPTs are hardcoded to use 4-level paging, while __virt_pg_map()
> > will assume we're using 5-level paging.
> >
> > Patch #16 ("KVM: selftests: Use __virt_pg_map() for nested EPTs") will
> > need the following diff to make nested EPTs use the same paging level as
> > the guest:
> >
> > diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
> > index 358143bf8dd0d..8bacb74c00053 100644
> > --- a/tools/testing/selftests/kvm/lib/x86/vmx.c
> > +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
> > @@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
> > uint64_t ept_paddr;
> > struct eptPageTablePointer eptp = {
> > .memory_type = X86_MEMTYPE_WB,
> > - .page_walk_length = 3, /* + 1 */
> > + .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
>
> LA57 does not imply support for 5-level EPT. (SRF, IIRC)
Huh, that's annoying. We can keep the EPTs hardcoded to 4 levels and
pass in the max level to __virt_pg_map() instead of hardcoding
vm->pgtable_levels.
Sean, let me know how you want to handle this. I can fix this and rebase
the series (or part of it?), or you can fix it up if you prefer to do
so.
On Tue, Nov 18, 2025, Yosry Ahmed wrote:
> On Tue, Nov 18, 2025 at 03:00:26PM -0800, Jim Mattson wrote:
> > On Tue, Nov 18, 2025 at 2:26 PM Yosry Ahmed <yosry.ahmed@linux.dev> wrote:
> > >
> > > On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> > > > There are multiple selftests exercising nested VMX that are not specific
> > > > to VMX (at least not anymore). Extend their coverage to nested SVM.
> > > >
> > > > This version is significantly different (and longer) than v1 [1], mainly
> > > > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> > > > mappings instead of extending the existing nested EPT infrastructure. It
> > > > also has a lot more fixups and cleanups.
> > > >
> > > > This series depends on two other series:
> > > > - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> > > > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
> > >
> > > v2 of Jim's series switches all tests to use 57-bit by default when
> > > available:
> > > https://lore.kernel.org/kvm/20251028225827.2269128-4-jmattson@google.com/
> > >
> > > This breaks moving nested EPT mappings to use __virt_pg_map() because
> > > nested EPTs are hardcoded to use 4-level paging, while __virt_pg_map()
> > > will assume we're using 5-level paging.
> > >
> > > Patch #16 ("KVM: selftests: Use __virt_pg_map() for nested EPTs") will
> > > need the following diff to make nested EPTs use the same paging level as
> > > the guest:
> > >
> > > diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
> > > index 358143bf8dd0d..8bacb74c00053 100644
> > > --- a/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > @@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
> > > uint64_t ept_paddr;
> > > struct eptPageTablePointer eptp = {
> > > .memory_type = X86_MEMTYPE_WB,
> > > - .page_walk_length = 3, /* + 1 */
> > > + .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
> >
> > LA57 does not imply support for 5-level EPT. (SRF, IIRC)
Yuuuup. And similarly, MAXPHYADDR=52 doesn't imply 5-level EPT (thank you TDX!).
> Huh, that's annoying. We can keep the EPTs hardcoded to 4 levels and
> pass in the max level to __virt_pg_map() instead of hardcoding
> vm->pgtable_levels.
I haven't looked at the series in-depth so I don't know exactly what you're trying
to do, but why not check MSR_IA32_VMX_EPT_VPID_CAP for PWL5?
On Tue, Nov 18, 2025 at 03:49:55PM -0800, Sean Christopherson wrote:
> On Tue, Nov 18, 2025, Yosry Ahmed wrote:
> > On Tue, Nov 18, 2025 at 03:00:26PM -0800, Jim Mattson wrote:
> > > On Tue, Nov 18, 2025 at 2:26 PM Yosry Ahmed <yosry.ahmed@linux.dev> wrote:
> > > >
> > > > On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> > > > > There are multiple selftests exercising nested VMX that are not specific
> > > > > to VMX (at least not anymore). Extend their coverage to nested SVM.
> > > > >
> > > > > This version is significantly different (and longer) than v1 [1], mainly
> > > > > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> > > > > mappings instead of extending the existing nested EPT infrastructure. It
> > > > > also has a lot more fixups and cleanups.
> > > > >
> > > > > This series depends on two other series:
> > > > > - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> > > > > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
> > > >
> > > > v2 of Jim's series switches all tests to use 57-bit by default when
> > > > available:
> > > > https://lore.kernel.org/kvm/20251028225827.2269128-4-jmattson@google.com/
> > > >
> > > > This breaks moving nested EPT mappings to use __virt_pg_map() because
> > > > nested EPTs are hardcoded to use 4-level paging, while __virt_pg_map()
> > > > will assume we're using 5-level paging.
> > > >
> > > > Patch #16 ("KVM: selftests: Use __virt_pg_map() for nested EPTs") will
> > > > need the following diff to make nested EPTs use the same paging level as
> > > > the guest:
> > > >
> > > > diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
> > > > index 358143bf8dd0d..8bacb74c00053 100644
> > > > --- a/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > > +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > > @@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
> > > > uint64_t ept_paddr;
> > > > struct eptPageTablePointer eptp = {
> > > > .memory_type = X86_MEMTYPE_WB,
> > > > - .page_walk_length = 3, /* + 1 */
> > > > + .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
> > >
> > > LA57 does not imply support for 5-level EPT. (SRF, IIRC)
>
> Yuuuup. And similarly, MAXPHYADDR=52 doesn't imply 5-level EPT (thank you TDX!).
>
> > Huh, that's annoying. We can keep the EPTs hardcoded to 4 levels and
> > pass in the max level to __virt_pg_map() instead of hardcoding
> > vm->pgtable_levels.
>
> I haven't looked at the series in-depth so I don't know exactly what you're trying
> to do, but why not check MSR_IA32_VMX_EPT_VPID_CAP for PWL5?
The second part of the series reuses __virt_pg_map() to be used for
nested EPTs (and NPTs). __virt_pg_map() uses vm->pgtable_levels to find
out how many page table levels we have.
So we need to either:
(a) Always use the same number of levels for page tables and EPTs.
(b) Make __virt_pg_map() take the number of page table levels as a
parameter, and always pass 4 for EPTs (for now).
I suggested (a) initially, but it doesn't work because we can
technically have LA57 but not MSR_IA32_VMX_EPT_VPID_CAP, so we need to
do (b). We can still check MSR_IA32_VMX_EPT_VPID_CAP and use PWL5 for
EPTs, but that's an orthogonal change at this point.
Anyway, do you prefer that I resend the series on top of Jim's v2, or do
you want to wait and see if you'll fix it up (or apply a part of it
before I rebase the rest)?
On Wed, Nov 19, 2025, Yosry Ahmed wrote:
> On Tue, Nov 18, 2025 at 03:49:55PM -0800, Sean Christopherson wrote:
> > On Tue, Nov 18, 2025, Yosry Ahmed wrote:
> > > On Tue, Nov 18, 2025 at 03:00:26PM -0800, Jim Mattson wrote:
> > > > On Tue, Nov 18, 2025 at 2:26 PM Yosry Ahmed <yosry.ahmed@linux.dev> wrote:
> > > > > diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
> > > > > index 358143bf8dd0d..8bacb74c00053 100644
> > > > > --- a/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > > > +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > > > @@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
> > > > > uint64_t ept_paddr;
> > > > > struct eptPageTablePointer eptp = {
> > > > > .memory_type = X86_MEMTYPE_WB,
> > > > > - .page_walk_length = 3, /* + 1 */
> > > > > + .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
> > > >
> > > > LA57 does not imply support for 5-level EPT. (SRF, IIRC)
> >
> > Yuuuup. And similarly, MAXPHYADDR=52 doesn't imply 5-level EPT (thank you TDX!).
> >
> > > Huh, that's annoying. We can keep the EPTs hardcoded to 4 levels and
> > > pass in the max level to __virt_pg_map() instead of hardcoding
> > > vm->pgtable_levels.
> >
> > I haven't looked at the series in-depth so I don't know exactly what you're trying
> > to do, but why not check MSR_IA32_VMX_EPT_VPID_CAP for PWL5?
>
> The second part of the series reuses __virt_pg_map() to be used for
> nested EPTs (and NPTs). __virt_pg_map() uses vm->pgtable_levels to find
> out how many page table levels we have.
>
> So we need to either:
>
> (a) Always use the same number of levels for page tables and EPTs.
>
> (b) Make __virt_pg_map() take the number of page table levels as a
> parameter, and always pass 4 for EPTs (for now).
>
> I suggested (a) initially, but it doesn't work because we can
> technically have LA57 but not MSR_IA32_VMX_EPT_VPID_CAP, so we need to
> do (b). We can still check MSR_IA32_VMX_EPT_VPID_CAP and use PWL5 for
> EPTs, but that's an orthogonal change at this point.
I choose option (c)
(c) Add a "struct kvm_mmu" and use it to hold the PTE masks, root, root level,
and any other metadata that comes along in the future.
Then we only need to do the core plumbing once, to get "struct kvm_mmu *mmu"
passed in. After that, adding each piece only needs to touch code that actually
cares about those things.
That was going to be my vote even without this particular discussion (I forgot
why I even started reviewing the series, *sigh*), because the root_gpa and
pte_masks should be passed as a single entity. The root+level are even more
tightly coupled.
On Wed, Nov 19, 2025, Yosry Ahmed wrote:
> On Tue, Nov 18, 2025 at 03:49:55PM -0800, Sean Christopherson wrote:
> > On Tue, Nov 18, 2025, Yosry Ahmed wrote:
> > > On Tue, Nov 18, 2025 at 03:00:26PM -0800, Jim Mattson wrote:
> > > > On Tue, Nov 18, 2025 at 2:26 PM Yosry Ahmed <yosry.ahmed@linux.dev> wrote:
> > > > >
> > > > > On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> > > > > > There are multiple selftests exercising nested VMX that are not specific
> > > > > > to VMX (at least not anymore). Extend their coverage to nested SVM.
> > > > > >
> > > > > > This version is significantly different (and longer) than v1 [1], mainly
> > > > > > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> > > > > > mappings instead of extending the existing nested EPT infrastructure. It
> > > > > > also has a lot more fixups and cleanups.
> > > > > >
> > > > > > This series depends on two other series:
> > > > > > - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> > > > > > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
> > > > >
> > > > > v2 of Jim's series switches all tests to use 57-bit by default when
> > > > > available:
> > > > > https://lore.kernel.org/kvm/20251028225827.2269128-4-jmattson@google.com/
> > > > >
> > > > > This breaks moving nested EPT mappings to use __virt_pg_map() because
> > > > > nested EPTs are hardcoded to use 4-level paging, while __virt_pg_map()
> > > > > will assume we're using 5-level paging.
> > > > >
> > > > > Patch #16 ("KVM: selftests: Use __virt_pg_map() for nested EPTs") will
> > > > > need the following diff to make nested EPTs use the same paging level as
> > > > > the guest:
> > > > >
> > > > > diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
> > > > > index 358143bf8dd0d..8bacb74c00053 100644
> > > > > --- a/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > > > +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c
> > > > > @@ -203,7 +203,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
> > > > > uint64_t ept_paddr;
> > > > > struct eptPageTablePointer eptp = {
> > > > > .memory_type = X86_MEMTYPE_WB,
> > > > > - .page_walk_length = 3, /* + 1 */
> > > > > + .page_walk_length = get_cr4() & X86_CR4_LA57 ? 4 : 3, /* + 1 */
> > > >
> > > > LA57 does not imply support for 5-level EPT. (SRF, IIRC)
> >
> > Yuuuup. And similarly, MAXPHYADDR=52 doesn't imply 5-level EPT (thank you TDX!).
> >
> > > Huh, that's annoying. We can keep the EPTs hardcoded to 4 levels and
> > > pass in the max level to __virt_pg_map() instead of hardcoding
> > > vm->pgtable_levels.
> >
> > I haven't looked at the series in-depth so I don't know exactly what you're trying
> > to do, but why not check MSR_IA32_VMX_EPT_VPID_CAP for PWL5?
>
> The second part of the series reuses __virt_pg_map() to be used for
> nested EPTs (and NPTs). __virt_pg_map() uses vm->pgtable_levels to find
> out how many page table levels we have.
>
> So we need to either:
>
> (a) Always use the same number of levels for page tables and EPTs.
>
> (b) Make __virt_pg_map() take the number of page table levels as a
> parameter, and always pass 4 for EPTs (for now).
>
> I suggested (a) initially, but it doesn't work because we can
> technically have LA57 but not MSR_IA32_VMX_EPT_VPID_CAP, so we need to
> do (b). We can still check MSR_IA32_VMX_EPT_VPID_CAP and use PWL5 for
> EPTs, but that's an orthogonal change at this point.
>
> Anyway, do you prefer that I resend the series on top of Jim's v2, or do
> you want to wait and see if you'll fix it up (or apply a part of it
> before I rebase the rest)?
Hold off for now, sending v3 of a 23-patch series at this point isn't likely to
make things go faster :-)
On Tue, Oct 21, 2025, Yosry Ahmed wrote: > There are multiple selftests exercising nested VMX that are not specific > to VMX (at least not anymore). Extend their coverage to nested SVM. > > This version is significantly different (and longer) than v1 [1], mainly > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT > mappings instead of extending the existing nested EPT infrastructure. It > also has a lot more fixups and cleanups. > > This series depends on two other series: > - "KVM: SVM: GIF and EFER.SVME are independent" [2] > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3] > > The dependency on the former is because set_nested_state_test is now > also a regression test for that fix. Uh, then the selftest change absolutely should be sent at the same time as the KVM change. One of the big benefits of selftests over KUT is that selftests are in the same repo as KVM. We should almost never have to coordinate selftests chagnes against KVM changes across different series. > The dependency on the latter is purely to avoid conflicts. Similar to my feedback on your mega-series for KUT, don't bundle unrelated patches without good reason (and no reason _NOT_ to bundle them). I want to immediate take the patches that aren't related to the paging API changes, but that's proving to be difficult because there are superficial dependencies on Jim's LA57 changes, and I need to drop the vmx_set_nested_state_test changes because they belong elsewhere. Bundling these is fine since they're thematically related and do generate superficial conflicts, though even then I would be a-ok with splitting these up (superficial conflicts are trivial to resolve (knock wood), and avoiding such conflicts isn't a good reason to bundle unrelated things). KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM KVM: selftests: Extend nested_invalid_cr3_test to cover SVM KVM: selftests: Move nested invalid CR3 check to its own test KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM KVM: selftests: Extend vmx_close_while_nested_test to cover SVM
On Thu, Nov 20, 2025 at 03:50:10PM -0800, Sean Christopherson wrote: > On Tue, Oct 21, 2025, Yosry Ahmed wrote: > > There are multiple selftests exercising nested VMX that are not specific > > to VMX (at least not anymore). Extend their coverage to nested SVM. > > > > This version is significantly different (and longer) than v1 [1], mainly > > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT > > mappings instead of extending the existing nested EPT infrastructure. It > > also has a lot more fixups and cleanups. > > > > This series depends on two other series: > > - "KVM: SVM: GIF and EFER.SVME are independent" [2] > > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3] > > > > The dependency on the former is because set_nested_state_test is now > > also a regression test for that fix. > > Uh, then the selftest change absolutely should be sent at the same time as the > KVM change. One of the big benefits of selftests over KUT is that selftests are > in the same repo as KVM. We should almost never have to coordinate selftests > chagnes against KVM changes across different series. Yeah that didn't work out well. I saw Jim's fixes as I was working on that test and thought might as well test for Jim's changes. In retrospect I should have split this into two patches. > > > The dependency on the latter is purely to avoid conflicts. > > Similar to my feedback on your mega-series for KUT, don't bundle unrelated patches > without good reason (and no reason _NOT_ to bundle them). Noted. > > I want to immediate take the patches that aren't related to the paging API changes, > but that's proving to be difficult because there are superficial dependencies on > Jim's LA57 changes, and I need to drop the vmx_set_nested_state_test changes because > they belong elsewhere. > > Bundling these is fine since they're thematically related and do generate superficial > conflicts, though even then I would be a-ok with splitting these up (superficial > conflicts are trivial to resolve (knock wood), and avoiding such conflicts isn't > a good reason to bundle unrelated things). > > KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM > KVM: selftests: Extend nested_invalid_cr3_test to cover SVM > KVM: selftests: Move nested invalid CR3 check to its own test > KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM > KVM: selftests: Extend vmx_close_while_nested_test to cover SVM Not sure I understand how you to proceed. Do you want me to respin these patches separately (as series A), on top of kvm-x86/next, and then respin the rest of the series separately (as series B, with your struct kvm_mmu suggestion)? As for set_nested_state, if you plan to pickup Jim's EFER fixes I can just include it as-is in series (A). If not, I can include generalization of the test, and send covering Jim's fix separately. Series B will still need to depend on Jim's selftests changes, if you're planning to pick those up soon I can base my changes on whatever branch you'll use. Otherwise I can resend both together, maybe?
On Fri, Nov 21, 2025, Yosry Ahmed wrote: > On Thu, Nov 20, 2025 at 03:50:10PM -0800, Sean Christopherson wrote: > > KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM > > KVM: selftests: Extend nested_invalid_cr3_test to cover SVM > > KVM: selftests: Move nested invalid CR3 check to its own test > > KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM > > KVM: selftests: Extend vmx_close_while_nested_test to cover SVM > > Not sure I understand how you to proceed. Do you want me to respin these > patches separately (as series A), on top of kvm-x86/next, and then > respin the rest of the series separately (as series B, with your struct > kvm_mmu suggestion)? I'm going to apply a subset "soon", hopefully they'll show up in kvm-x86/next tomorrow. I think it's patches 3-9? > As for set_nested_state, if you plan to pickup Jim's EFER fixes I can > just include it as-is in series (A). If not, I can include > generalization of the test, and send covering Jim's fix separately. We're likely going to need a v3 of Jim's GIF series no matter what, so let's plan on bundling patches 1-2 with v3 of that series. That leaves the paging patches. Unless you're super duper speedy, I should get patches 3-9 and Jim's LA57 changes+test pushed to kvm-x86 before you're ready to post the next version of those patches. So: Fold 1-2 into Jim's GIF series. Do nothing for 3-9. Spin a new version of 10+ (the paging patches) after kvm-x86/next is refreshed
On Thu, Nov 20, 2025 at 04:24:20PM -0800, Sean Christopherson wrote: > On Fri, Nov 21, 2025, Yosry Ahmed wrote: > > On Thu, Nov 20, 2025 at 03:50:10PM -0800, Sean Christopherson wrote: > > > KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM > > > KVM: selftests: Extend nested_invalid_cr3_test to cover SVM > > > KVM: selftests: Move nested invalid CR3 check to its own test > > > KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM > > > KVM: selftests: Extend vmx_close_while_nested_test to cover SVM > > > > Not sure I understand how you to proceed. Do you want me to respin these > > patches separately (as series A), on top of kvm-x86/next, and then > > respin the rest of the series separately (as series B, with your struct > > kvm_mmu suggestion)? > > I'm going to apply a subset "soon", hopefully they'll show up in kvm-x86/next > tomorrow. I think it's patches 3-9? I think 10 and 11 should also be good to go, unless you have reason to think otherwise. > > > As for set_nested_state, if you plan to pickup Jim's EFER fixes I can > > just include it as-is in series (A). If not, I can include > > generalization of the test, and send covering Jim's fix separately. > > We're likely going to need a v3 of Jim's GIF series no matter what, so let's plan > on bundling patches 1-2 with v3 of that series. > > That leaves the paging patches. Unless you're super duper speedy, I should get > patches 3-9 and Jim's LA57 changes+test pushed to kvm-x86 before you're ready to > post the next version of those patches. > > So: > Fold 1-2 into Jim's GIF series. > Do nothing for 3-9. > Spin a new version of 10+ (the paging patches) after kvm-x86/next is refreshed Makes sense, I will coordinate with Jim. Thanks!
On Tue, Oct 21, 2025, Yosry Ahmed wrote: > There are multiple selftests exercising nested VMX that are not specific > to VMX (at least not anymore). Extend their coverage to nested SVM. > > This version is significantly different (and longer) than v1 [1], mainly > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT > mappings instead of extending the existing nested EPT infrastructure. It > also has a lot more fixups and cleanups. > > This series depends on two other series: > - "KVM: SVM: GIF and EFER.SVME are independent" [2] > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3] No, it depends on local commits that are very similar to [3], but not precisely [3]. In the future, please provide a link to a git repo+branch when posting series with dependencies. It took me several attempts and a bit of conflict resolution to get this series applied. > [1]https://lore.kernel.org/kvm/20251001145816.1414855-1-yosry.ahmed@linux.dev/ > [2]https://lore.kernel.org/kvm/20251009223153.3344555-1-jmattson@google.com/ > [3]https://lore.kernel.org/kvm/20250917215031.2567566-1-jmattson@google.com/
On Thu, Nov 20, 2025 at 03:23:23PM -0800, Sean Christopherson wrote: > On Tue, Oct 21, 2025, Yosry Ahmed wrote: > > There are multiple selftests exercising nested VMX that are not specific > > to VMX (at least not anymore). Extend their coverage to nested SVM. > > > > This version is significantly different (and longer) than v1 [1], mainly > > due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT > > mappings instead of extending the existing nested EPT infrastructure. It > > also has a lot more fixups and cleanups. > > > > This series depends on two other series: > > - "KVM: SVM: GIF and EFER.SVME are independent" [2] > > - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3] > > No, it depends on local commits that are very similar to [3], but not precisely > [3]. Hmm I just applied that series with b4 without local changes, on top of kvm-x86/next at that time, which was kvm-x86-next-2025.09.30. Maybe you had v2 or it was the patches that landed between kvm-x86-next-2025.09.30 and the current tip of kvm-x86/next? > In the future, please provide a link to a git repo+branch when posting > series with dependencies. It took me several attempts and a bit of conflict > resolution to get this series applied. Yeah I can do that, although I think it wouldn't have helped in this case as the same conflicts would apply. Perhaps mentioning that this is based on kvm-x86-next-2025.09.30 would have helped? > > > [1]https://lore.kernel.org/kvm/20251001145816.1414855-1-yosry.ahmed@linux.dev/ > > [2]https://lore.kernel.org/kvm/20251009223153.3344555-1-jmattson@google.com/ > > [3]https://lore.kernel.org/kvm/20250917215031.2567566-1-jmattson@google.com/
On Tue, 21 Oct 2025 07:47:13 +0000, Yosry Ahmed wrote:
> There are multiple selftests exercising nested VMX that are not specific
> to VMX (at least not anymore). Extend their coverage to nested SVM.
>
> This version is significantly different (and longer) than v1 [1], mainly
> due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> mappings instead of extending the existing nested EPT infrastructure. It
> also has a lot more fixups and cleanups.
>
> [...]
Applied 3-11 to kvm-x86 selftests, thanks!
[03/23] KVM: selftests: Extend vmx_close_while_nested_test to cover SVM
https://github.com/kvm-x86/linux/commit/0a9eb2afa185
[04/23] KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM
https://github.com/kvm-x86/linux/commit/e6bcdd212238
[05/23] KVM: selftests: Move nested invalid CR3 check to its own test
https://github.com/kvm-x86/linux/commit/4d256d00e44e
[06/23] KVM: selftests: Extend nested_invalid_cr3_test to cover SVM
https://github.com/kvm-x86/linux/commit/91423b041d3c
[07/23] KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM
https://github.com/kvm-x86/linux/commit/3c40777f0ed8
[08/23] KVM: selftests: Stop hardcoding PAGE_SIZE in x86 selftests
https://github.com/kvm-x86/linux/commit/28b2dced8ba4
[09/23] KVM: selftests: Remove the unused argument to prepare_eptp()
https://github.com/kvm-x86/linux/commit/ff736dba478c
[10/23] KVM: selftests: Stop using __virt_pg_map() directly in tests
https://github.com/kvm-x86/linux/commit/1de4dc15baa1
[11/23] KVM: selftests: Make sure vm->vpages_mapped is always up-to-date
https://github.com/kvm-x86/linux/commit/d2e50389ab44
--
https://github.com/kvm-x86/linux/tree/next
On Tue, Oct 21, 2025 at 07:47:13AM +0000, Yosry Ahmed wrote:
> There are multiple selftests exercising nested VMX that are not specific
> to VMX (at least not anymore). Extend their coverage to nested SVM.
>
> This version is significantly different (and longer) than v1 [1], mainly
> due to the change of direction to reuse __virt_pg_map() for nested EPT/NPT
> mappings instead of extending the existing nested EPT infrastructure. It
> also has a lot more fixups and cleanups.
>
> This series depends on two other series:
> - "KVM: SVM: GIF and EFER.SVME are independent" [2]
> - "KVM: selftests: Add test of SET_NESTED_STATE with 48-bit L2 on 57-bit L1" [3]
>
> The dependency on the former is because set_nested_state_test is now
> also a regression test for that fix. The dependency on the latter is
> purely to avoid conflicts.
>
> The patch ordering is not perfect, I did some cleanups toward the end
> that arguably should have been moved to the beginning, but I had to stop
> rebasing and send the patches out at some point:
>
> Block #1 (patch 1 to patch 7):
> - Direct successors to the first 6 patches in v1, addressing review
> comments from Jim and collecting his review tags. These patch extend 5
> of the nVMX tests to cover nSVM.
>
> Block #2 (patch 8 to patch 11):
> - Miscellaneous fixups and cleanups.
>
> Block #3 (patch 11 to patch 17):
> - Moving nested EPT mapping functions to use __virt_pg_map(), patches 11
> to 15 do the prep work, and patch 16 does the switch. Patch 17 is a
> minor cleanup on top (which arguably fits better in block #2).
>
> Block #4 (patch 18 to 23):
> - Patches 18 to 22 are prep work to generalize the nested EPT mapping
> code to work with nested NPT, and patch 23 finally extends the nested
> dirty logging test to work with nSVM using the nested NPT
> infrastructure. Patch 19 is admittedly an imposter in this block and
> should have been in block #2.
Hi Sean,
Any thoughts on the current version? Is this what you had in mind for
reusing __virt_pg_map()?
>
> [1]https://lore.kernel.org/kvm/20251001145816.1414855-1-yosry.ahmed@linux.dev/
> [2]https://lore.kernel.org/kvm/20251009223153.3344555-1-jmattson@google.com/
> [3]https://lore.kernel.org/kvm/20250917215031.2567566-1-jmattson@google.com/
>
> Yosry Ahmed (23):
> KVM: selftests: Minor improvements to asserts in
> test_vmx_nested_state()
> KVM: selftests: Extend vmx_set_nested_state_test to cover SVM
> KVM: selftests: Extend vmx_close_while_nested_test to cover SVM
> KVM: selftests: Extend vmx_nested_tsc_scaling_test to cover SVM
> KVM: selftests: Move nested invalid CR3 check to its own test
> KVM: selftests: Extend nested_invalid_cr3_test to cover SVM
> KVM: selftests: Extend vmx_tsc_adjust_test to cover SVM
> KVM: selftests: Stop hardcoding PAGE_SIZE in x86 selftests
> KVM: selftests: Remove the unused argument to prepare_eptp()
> KVM: selftests: Stop using __virt_pg_map() directly in tests
> KVM: selftests: Make sure vm->vpages_mapped is always up-to-date
> KVM: selftests: Parameterize the PTE bitmasks for virt mapping
> functions
> KVM: selftests: Pass the root GPA into virt_get_pte()
> KVM: selftests: Pass the root GPA into __virt_pg_map()
> KVM: selftests: Stop setting AD bits on nested EPTs on creation
> KVM: selftests: Use __virt_pg_map() for nested EPTs
> KVM: selftests: Kill eptPageTablePointer
> KVM: selftests: Generalize nested mapping functions
> KVM: selftests: Move nested MMU mapping functions outside of vmx.c
> KVM: selftests: Stop passing a memslot to nested_map_memslot()
> KVM: selftests: Allow kvm_cpu_has_ept() to be called on AMD CPUs
> KVM: selftests: Set the user bit on nested MMU PTEs
> KVM: selftests: Extend vmx_dirty_log_test to cover SVM
>
> tools/testing/selftests/kvm/Makefile.kvm | 11 +-
> .../testing/selftests/kvm/include/kvm_util.h | 1 +
> .../selftests/kvm/include/x86/processor.h | 34 ++-
> .../selftests/kvm/include/x86/svm_util.h | 8 +
> tools/testing/selftests/kvm/include/x86/vmx.h | 15 +-
> tools/testing/selftests/kvm/lib/kvm_util.c | 3 -
> .../testing/selftests/kvm/lib/x86/memstress.c | 6 +-
> .../testing/selftests/kvm/lib/x86/processor.c | 184 +++++++++++---
> tools/testing/selftests/kvm/lib/x86/svm.c | 19 ++
> tools/testing/selftests/kvm/lib/x86/vmx.c | 232 +++---------------
> tools/testing/selftests/kvm/mmu_stress_test.c | 6 +-
> ...ested_test.c => close_while_nested_test.c} | 42 +++-
> .../selftests/kvm/x86/hyperv_features.c | 2 +-
> tools/testing/selftests/kvm/x86/hyperv_ipi.c | 18 +-
> .../selftests/kvm/x86/hyperv_tlb_flush.c | 2 +-
> ...rty_log_test.c => nested_dirty_log_test.c} | 102 +++++---
> .../kvm/x86/nested_invalid_cr3_test.c | 118 +++++++++
> ...adjust_test.c => nested_tsc_adjust_test.c} | 79 +++---
> ...aling_test.c => nested_tsc_scaling_test.c} | 48 +++-
> ...d_state_test.c => set_nested_state_test.c} | 135 +++++++++-
> .../selftests/kvm/x86/sev_smoke_test.c | 2 +-
> tools/testing/selftests/kvm/x86/state_test.c | 2 +-
> .../selftests/kvm/x86/userspace_io_test.c | 2 +-
> 23 files changed, 695 insertions(+), 376 deletions(-)
> rename tools/testing/selftests/kvm/x86/{vmx_close_while_nested_test.c => close_while_nested_test.c} (64%)
> rename tools/testing/selftests/kvm/x86/{vmx_dirty_log_test.c => nested_dirty_log_test.c} (57%)
> create mode 100644 tools/testing/selftests/kvm/x86/nested_invalid_cr3_test.c
> rename tools/testing/selftests/kvm/x86/{vmx_tsc_adjust_test.c => nested_tsc_adjust_test.c} (61%)
> rename tools/testing/selftests/kvm/x86/{vmx_nested_tsc_scaling_test.c => nested_tsc_scaling_test.c} (83%)
> rename tools/testing/selftests/kvm/x86/{vmx_set_nested_state_test.c => set_nested_state_test.c} (67%)
>
> --
> 2.51.0.869.ge66316f041-goog
>
© 2016 - 2025 Red Hat, Inc.