Skip to content

Commit c4d99a8

Browse files
vdonnefortMarc Zyngier
authored andcommitted
KVM: arm64: Add a range to __pkvm_host_test_clear_young_guest()
In preparation for supporting stage-2 huge mappings for np-guest. Add a nr_pages argument to the __pkvm_host_test_clear_young_guest hypercall. This range supports only two values: 1 or PMD_SIZE / PAGE_SIZE (that is 512 on a 4K-pages system). Signed-off-by: Vincent Donnefort <vdonnefort@google.com> Link: https://lore.kernel.org/r/20250521124834.1070650-7-vdonnefort@google.com Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent 0eb802b commit c4d99a8

File tree

4 files changed

+13
-8
lines changed

4 files changed

+13
-8
lines changed

arch/arm64/kvm/hyp/include/nvhe/mem_protect.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ int __pkvm_host_share_guest(u64 pfn, u64 gfn, u64 nr_pages, struct pkvm_hyp_vcpu
4343
enum kvm_pgtable_prot prot);
4444
int __pkvm_host_unshare_guest(u64 gfn, u64 nr_pages, struct pkvm_hyp_vm *hyp_vm);
4545
int __pkvm_host_relax_perms_guest(u64 gfn, struct pkvm_hyp_vcpu *vcpu, enum kvm_pgtable_prot prot);
46-
int __pkvm_host_test_clear_young_guest(u64 gfn, bool mkold, struct pkvm_hyp_vm *vm);
4746
int __pkvm_host_wrprotect_guest(u64 gfn, u64 nr_pages, struct pkvm_hyp_vm *hyp_vm);
47+
int __pkvm_host_test_clear_young_guest(u64 gfn, u64 nr_pages, bool mkold, struct pkvm_hyp_vm *vm);
4848
int __pkvm_host_mkyoung_guest(u64 gfn, struct pkvm_hyp_vcpu *vcpu);
4949

5050
bool addr_is_memory(phys_addr_t phys);

arch/arm64/kvm/hyp/nvhe/hyp-main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,8 @@ static void handle___pkvm_host_test_clear_young_guest(struct kvm_cpu_context *ho
331331
{
332332
DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1);
333333
DECLARE_REG(u64, gfn, host_ctxt, 2);
334-
DECLARE_REG(bool, mkold, host_ctxt, 3);
334+
DECLARE_REG(u64, nr_pages, host_ctxt, 3);
335+
DECLARE_REG(bool, mkold, host_ctxt, 4);
335336
struct pkvm_hyp_vm *hyp_vm;
336337
int ret = -EINVAL;
337338

@@ -342,7 +343,7 @@ static void handle___pkvm_host_test_clear_young_guest(struct kvm_cpu_context *ho
342343
if (!hyp_vm)
343344
goto out;
344345

345-
ret = __pkvm_host_test_clear_young_guest(gfn, mkold, hyp_vm);
346+
ret = __pkvm_host_test_clear_young_guest(gfn, nr_pages, mkold, hyp_vm);
346347
put_pkvm_hyp_vm(hyp_vm);
347348
out:
348349
cpu_reg(host_ctxt, 1) = ret;

arch/arm64/kvm/hyp/nvhe/mem_protect.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,17 +1111,21 @@ int __pkvm_host_wrprotect_guest(u64 gfn, u64 nr_pages, struct pkvm_hyp_vm *vm)
11111111
return ret;
11121112
}
11131113

1114-
int __pkvm_host_test_clear_young_guest(u64 gfn, bool mkold, struct pkvm_hyp_vm *vm)
1114+
int __pkvm_host_test_clear_young_guest(u64 gfn, u64 nr_pages, bool mkold, struct pkvm_hyp_vm *vm)
11151115
{
1116-
u64 ipa = hyp_pfn_to_phys(gfn);
1116+
u64 size, ipa = hyp_pfn_to_phys(gfn);
11171117
int ret;
11181118

11191119
if (pkvm_hyp_vm_is_protected(vm))
11201120
return -EPERM;
11211121

1122-
assert_host_shared_guest(vm, ipa, PAGE_SIZE);
1122+
ret = __guest_check_transition_size(0, ipa, nr_pages, &size);
1123+
if (ret)
1124+
return ret;
1125+
1126+
assert_host_shared_guest(vm, ipa, size);
11231127
guest_lock_component(vm);
1124-
ret = kvm_pgtable_stage2_test_clear_young(&vm->pgt, ipa, PAGE_SIZE, mkold);
1128+
ret = kvm_pgtable_stage2_test_clear_young(&vm->pgt, ipa, size, mkold);
11251129
guest_unlock_component(vm);
11261130

11271131
return ret;

arch/arm64/kvm/pkvm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ bool pkvm_pgtable_stage2_test_clear_young(struct kvm_pgtable *pgt, u64 addr, u64
439439
lockdep_assert_held(&kvm->mmu_lock);
440440
for_each_mapping_in_range_safe(pgt, addr, addr + size, mapping)
441441
young |= kvm_call_hyp_nvhe(__pkvm_host_test_clear_young_guest, handle, mapping->gfn,
442-
mkold);
442+
1, mkold);
443443

444444
return young;
445445
}

0 commit comments

Comments
 (0)