[PATCH v2 00/23] Extend test coverage for nested SVM

Yosry Ahmed posted 23 patches 1 month, 3 weeks ago
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%)
[PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 1 month, 3 weeks ago
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
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 4 weeks ago
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
>
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Jim Mattson 4 weeks ago
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)
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 4 weeks ago
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.
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 4 weeks ago
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?
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 4 weeks ago
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)?
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 3 weeks, 5 days ago
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.
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 4 weeks ago
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 :-)
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 3 weeks, 5 days ago
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
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 3 weeks, 5 days ago
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?
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 3 weeks, 5 days ago
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
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 3 weeks, 5 days ago
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!
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 3 weeks, 5 days ago
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/
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 3 weeks, 5 days ago
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/
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Sean Christopherson 3 weeks, 4 days ago
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
Re: [PATCH v2 00/23] Extend test coverage for nested SVM
Posted by Yosry Ahmed 1 month, 2 weeks ago
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
>