Skip to content

Commit d210eeb

Browse files
mdrothsean-jc
authored andcommitted
KVM: selftests: Add support for protected vm_vaddr_* allocations
Test programs may wish to allocate shared vaddrs for things like sharing memory with the guest. Since protected vms will have their memory encrypted by default an interface is needed to explicitly request shared pages. Implement this by splitting the common code out from vm_vaddr_alloc() and introducing a new vm_vaddr_alloc_shared(). Cc: Paolo Bonzini <[email protected]> Cc: Sean Christopherson <[email protected]> Cc: Vishal Annapurve <[email protected]> Cc: Ackerly Tng <[email protected]> cc: Andrew Jones <[email protected]> Cc: Tom Lendacky <[email protected]> Cc: Michael Roth <[email protected]> Reviewed-by: Itaru Kitayama <[email protected]> Tested-by: Carlos Bilbao <[email protected]> Signed-off-by: Michael Roth <[email protected]> Signed-off-by: Peter Gonda <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent cd8eb29 commit d210eeb

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

tools/testing/selftests/kvm/include/kvm_util_base.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,9 @@ vm_vaddr_t vm_vaddr_unused_gap(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_mi
586586
vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min);
587587
vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
588588
enum kvm_mem_region_type type);
589+
vm_vaddr_t vm_vaddr_alloc_shared(struct kvm_vm *vm, size_t sz,
590+
vm_vaddr_t vaddr_min,
591+
enum kvm_mem_region_type type);
589592
vm_vaddr_t vm_vaddr_alloc_pages(struct kvm_vm *vm, int nr_pages);
590593
vm_vaddr_t __vm_vaddr_alloc_page(struct kvm_vm *vm,
591594
enum kvm_mem_region_type type);

tools/testing/selftests/kvm/lib/kvm_util.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,15 +1380,17 @@ vm_vaddr_t vm_vaddr_unused_gap(struct kvm_vm *vm, size_t sz,
13801380
return pgidx_start * vm->page_size;
13811381
}
13821382

1383-
vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
1384-
enum kvm_mem_region_type type)
1383+
static vm_vaddr_t ____vm_vaddr_alloc(struct kvm_vm *vm, size_t sz,
1384+
vm_vaddr_t vaddr_min,
1385+
enum kvm_mem_region_type type,
1386+
bool protected)
13851387
{
13861388
uint64_t pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
13871389

13881390
virt_pgd_alloc(vm);
1389-
vm_paddr_t paddr = vm_phy_pages_alloc(vm, pages,
1390-
KVM_UTIL_MIN_PFN * vm->page_size,
1391-
vm->memslots[type]);
1391+
vm_paddr_t paddr = __vm_phy_pages_alloc(vm, pages,
1392+
KVM_UTIL_MIN_PFN * vm->page_size,
1393+
vm->memslots[type], protected);
13921394

13931395
/*
13941396
* Find an unused range of virtual page addresses of at least
@@ -1408,6 +1410,20 @@ vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
14081410
return vaddr_start;
14091411
}
14101412

1413+
vm_vaddr_t __vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min,
1414+
enum kvm_mem_region_type type)
1415+
{
1416+
return ____vm_vaddr_alloc(vm, sz, vaddr_min, type,
1417+
vm_arch_has_protected_memory(vm));
1418+
}
1419+
1420+
vm_vaddr_t vm_vaddr_alloc_shared(struct kvm_vm *vm, size_t sz,
1421+
vm_vaddr_t vaddr_min,
1422+
enum kvm_mem_region_type type)
1423+
{
1424+
return ____vm_vaddr_alloc(vm, sz, vaddr_min, type, false);
1425+
}
1426+
14111427
/*
14121428
* VM Virtual Address Allocate
14131429
*

0 commit comments

Comments
 (0)