[PATCH 08/20] KVM: arm64: Add a range to __pkvm_host_reclaim_page_guest()

Wei-Lin Chang weilin.chang at arm.com
Mon Sep 7 07:52:34 PDT 2026


On Mon, Aug 03, 2026 at 11:08:52AM +0100, Vincent Donnefort wrote:

[...]

> +int __pkvm_host_reclaim_page_guest(u64 gfn, u64 nr_pages, struct pkvm_hyp_vm *vm);
>  int __pkvm_host_share_guest(u64 pfn, u64 gfn, u64 nr_pages, struct pkvm_hyp_vcpu *vcpu,
>  			    enum kvm_pgtable_prot prot);
>  int __pkvm_host_unshare_guest(u64 gfn, u64 nr_pages, struct pkvm_hyp_vm *hyp_vm);
> diff --git a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h
> index f04cea5ff389..0d17e59d5335 100644
> --- a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h
> +++ b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h
> @@ -74,7 +74,7 @@ int __pkvm_init_vm(struct kvm *host_kvm, unsigned long vm_hva,
>  int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu,
>  		     unsigned long vcpu_hva);
>  
> -int __pkvm_reclaim_dying_guest_page(pkvm_handle_t handle, u64 gfn);
> +int __pkvm_reclaim_dying_guest_page(pkvm_handle_t handle, u64 gfn, u64 nr_pages);

I feel like __pkvm_host_reclaim_"page"_guest(),
__pkvm_reclaim_dying_guest_"page"() aren't good names since they deal
with multiple pages now.

[...]

>  
> -static int get_valid_guest_pte(struct pkvm_hyp_vm *vm, u64 ipa, kvm_pte_t *ptep, u64 *physp)
> +static int __get_valid_guest_pte(struct pkvm_hyp_vm *vm, u64 ipa,
> +				 kvm_pte_t *ptep, u64 *physp, s8 *levelp)
>  {
>  	kvm_pte_t pte;
>  	u64 phys;
> @@ -905,20 +906,32 @@ static int get_valid_guest_pte(struct pkvm_hyp_vm *vm, u64 ipa, kvm_pte_t *ptep,
>  		return -EHWPOISON;
>  	if (!kvm_pte_valid(pte))
>  		return -ENOENT;
> -	if (level != KVM_PGTABLE_LAST_LEVEL)
> -		return -E2BIG;
>  
>  	phys = kvm_pte_to_phys(pte);
> -	ret = check_range_allowed_memory(phys, phys + PAGE_SIZE);
> +	ret = check_range_allowed_memory(phys, phys + kvm_granule_size(level));
>  	if (WARN_ON(ret))
>  		return ret;
>  
>  	*ptep = pte;
>  	*physp = phys;
> +	*levelp = level;
>  
>  	return 0;
>  }
>  
> +static int get_valid_guest_pte(struct pkvm_hyp_vm *vm, u64 ipa, u64 size,
> +			       kvm_pte_t *ptep, u64 *physp)
> +{
> +	s8 level;
> +	int ret;
> +
> +	ret = __get_valid_guest_pte(vm, ipa, ptep, physp, &level);
> +	if (ret)
> +		return ret;
> +
> +	return kvm_granule_size(level) == size ? 0 : -E2BIG;
> +}
> +
>  int __pkvm_vcpu_in_poison_fault(struct pkvm_hyp_vcpu *hyp_vcpu)
>  {
>  	struct pkvm_hyp_vm *vm = pkvm_hyp_vcpu_to_hyp_vm(hyp_vcpu);
> @@ -1001,7 +1014,7 @@ int __pkvm_guest_share_host(struct pkvm_hyp_vcpu *vcpu, u64 gfn)
>  	host_lock_component();
>  	guest_lock_component(vm);
>  
> -	ret = get_valid_guest_pte(vm, ipa, &pte, &phys);
> +	ret = get_valid_guest_pte(vm, ipa, PAGE_SIZE, &pte, &phys);
>  	if (ret)
>  		goto unlock;
>  
> @@ -1033,7 +1046,7 @@ int __pkvm_guest_unshare_host(struct pkvm_hyp_vcpu *vcpu, u64 gfn)
>  	host_lock_component();
>  	guest_lock_component(vm);
>  
> -	ret = get_valid_guest_pte(vm, ipa, &pte, &phys);
> +	ret = get_valid_guest_pte(vm, ipa, PAGE_SIZE, &pte, &phys);
>  	if (ret)
>  		goto unlock;
>  
> @@ -1285,6 +1298,14 @@ static void hyp_poison_page(phys_addr_t phys)
>  	hyp_fixmap_unmap();
>  }
>  
> +static void hyp_poison_range(phys_addr_t phys, u64 size)
> +{
> +	u64 offset;
> +
> +	for (offset = 0; offset < size; offset += PAGE_SIZE)
> +		hyp_poison_page(phys + offset);
> +}
> +

I believe get_valid_guest_pte and hyp_poison_range changes/addition can
be made into its own patch, focusing on small helpers?
If so I believe it can make reviewing easier.

Thanks,
Wei-Lin Chang

[...]



More information about the linux-arm-kernel mailing list