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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.