Re: [PATCH 13/20] KVM: selftests: Add TEST_EXTRA memory region type for "special" memslots
Itaru Kitayama <[email protected]>
| Newsgroups | dev.linux.lists.loongarch,dev.linux.lists.kvmarm,org.infradead.lists.kvm-riscv,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-riscv,org.kernel.vger.kvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <ao--_gaqpfWir9v4@sm-arm-grace07> |
On Wed, Aug 26, 2026 at 04:05:04PM -0700, Sean Christopherson wrote: > And another memory region type to deal with extra, one-off memory regions, > and use the new type to manage x86's SMRAM memslot, as another step towards > taking the region type instead of the raw memslot in the physical page > allocator APIs. > > Alternatively, SMRAM setup could simply use the quad-underscore API to > continue passing in the memslot, but a surprising number of tests use an > "extra" memslot for a variety of reasons. I.e. allocating memory from one > (and exactly one) extra memslot isn't all that rare, and so should be > treated as normal behavior, not as something extraordinary, as > quad-underscore functions typically suggest. > > Opportunistically add comments to document the intended usage of the types, > as the difference between DATA, TEST_DATA, and TEST_EXTRA in particular > isn't exactly obvious. > > Signed-off-by: Sean Christopherson <[email protected]> > --- > .../testing/selftests/kvm/include/kvm_util.h | 37 ++++++++++++++++--- > tools/testing/selftests/kvm/include/x86/smm.h | 2 +- > .../testing/selftests/kvm/lib/x86/processor.c | 7 ++-- > 3 files changed, 37 insertions(+), 9 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h > index 14f87c8a00ec..f4f4f360a10b 100644 > --- a/tools/testing/selftests/kvm/include/kvm_util.h > +++ b/tools/testing/selftests/kvm/include/kvm_util.h > @@ -82,11 +82,43 @@ struct userspace_mem_regions { > DECLARE_HASHTABLE(slot_hash, 9); > }; > > +/* > + * Memory region types are passed to various page allocators to communicate > + * various properties and metadata related to the allocation. Note, the > + * descriptions below described the primary usage of each type. Individual > + * tests may allocate memory for other purposes. > + * > + * By default, all regions are mapped to memslot '0'. Tests can override the > + * memslot for any or all types, e.g. so that all test data is allocated from a > + * curated memslot. > + */ This is helpful as it wasn't so obvious to me. Thanks for adding the comments on the default behaviour. Thanks, Itaru. > enum kvm_mem_region_type { > + /* > + * The CODE region is used by lib/elf when loading the test's code into > + * guest memory. > + */ > MEM_REGION_CODE, > + /* > + * The DATA region is used to allocate core data structures, e.g. vCPU > + * stacks, VM exception tables, x86's TSS, etc. > + */ > MEM_REGION_DATA, > + /* > + * The PT region, a.k.a. Page Table region, is used to allocate page > + * table pages. > + */ > MEM_REGION_PT, > + /* > + * The TEST_DATA region is used for allocating test data that is either > + * test specific, and/or isn't considered a "core" data structure. > + */ > MEM_REGION_TEST_DATA, > + /* > + * The TEST_EXTRA region is for special snowflakes, where a test wants > + * to create and use a one-off memslot, without impacting "normal" test > + * data allocations. > + */ > + MEM_REGION_TEST_EXTRA, > NR_MEM_REGIONS, > }; > > @@ -129,11 +161,6 @@ struct kvm_vm { > > struct kvm_binary_stats stats; > > - /* > - * KVM region slots. These are the default memslots used by page > - * allocators, e.g., lib/elf uses the memslots[MEM_REGION_CODE] > - * memslot. > - */ > u32 memslots[NR_MEM_REGIONS]; > }; > > diff --git a/tools/testing/selftests/kvm/include/x86/smm.h b/tools/testing/selftests/kvm/include/x86/smm.h > index 2d1afa09819b..15faaa060126 100644 > --- a/tools/testing/selftests/kvm/include/x86/smm.h > +++ b/tools/testing/selftests/kvm/include/x86/smm.h > @@ -8,7 +8,7 @@ > #define SMRAM_MEMSLOT ((1 << 16) | 1) > #define SMRAM_PAGES (SMRAM_SIZE / PAGE_SIZE) > > -void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, u64 smram_gpa, > +void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, gpa_t smram_gpa, > const void *smi_handler, size_t handler_size); > > void inject_smi(struct kvm_vcpu *vcpu); > diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/selftests/kvm/lib/x86/processor.c > index ea5fa59888af..b988eea373ad 100644 > --- a/tools/testing/selftests/kvm/lib/x86/processor.c > +++ b/tools/testing/selftests/kvm/lib/x86/processor.c > @@ -1468,11 +1468,12 @@ bool kvm_arch_has_default_irqchip(void) > return true; > } > > -void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, u64 smram_gpa, > +void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, gpa_t smram_gpa, > const void *smi_handler, size_t handler_size) > { > - vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, smram_gpa, > - SMRAM_MEMSLOT, SMRAM_PAGES, 0); > + vm_override_mem_region(vm, MEM_REGION_TEST_EXTRA, VM_MEM_SRC_ANONYMOUS, > + smram_gpa, SMRAM_MEMSLOT, SMRAM_PAGES); > + > TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, smram_gpa, > SMRAM_MEMSLOT) == smram_gpa, > "Could not allocate guest physical addresses for SMRAM"); > -- > 2.55.0.887.g758fc8c411-goog >