[PATCH 12/20] KVM: arm64: Handle huge mappings in __pkvm_host_force_reclaim_page_guest()

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


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

[...]

> -static void hyp_poison_page(phys_addr_t phys)
> +static void __hyp_poison_page(void *addr, size_t size)
>  {
> -	void *addr = hyp_fixmap_map(phys);
> -
> -	memset(addr, 0, PAGE_SIZE);
> +	memset(addr, 0, size);
>  	/*
>  	 * Prefer kvm_flush_dcache_to_poc() over __clean_dcache_guest_page()
>  	 * here as the latter may elide the CMO under the assumption that FWB
> @@ -1304,19 +1302,15 @@ static void hyp_poison_page(phys_addr_t phys)
>  	 * host stage-2 and would otherwise lead to a malicious host potentially
>  	 * being able to read the contents of newly reclaimed guest pages.
>  	 */
> -	kvm_flush_dcache_to_poc(addr, PAGE_SIZE);
> -	hyp_fixmap_unmap();
> +	kvm_flush_dcache_to_poc(addr, size);
>  }
>  
>  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);
> +	__apply_guest_page(__hyp_va(phys), size, __hyp_poison_page);
>  }

Patch 8 introduces hyp_poison_range(), and it is reimplemented in
another way here. Maybe just do it this way in the first time?

>  
> -static int host_stage2_get_guest_info(phys_addr_t phys, struct pkvm_hyp_vm **vm,
> +static int host_stage2_get_guest_info(phys_addr_t phys, u64 *size, struct pkvm_hyp_vm **vm,
>  				      u64 *gfn)
>  {
>  	enum pkvm_page_state state;
> @@ -1344,34 +1338,43 @@ static int host_stage2_get_guest_info(phys_addr_t phys, struct pkvm_hyp_vm **vm,
>  	if (ret)
>  		return ret;
>  
> -	if (WARN_ON(level != KVM_PGTABLE_LAST_LEVEL))
> -		return -EINVAL;
> +	/* We only support either PAGE_SIZE or PMD_SIZE */
> +	if (level < KVM_PGTABLE_LAST_LEVEL - 1)
> +		return -E2BIG;
>  
> -	return host_stage2_decode_gfn_meta(pte, vm, gfn);
> +	ret = host_stage2_decode_gfn_meta(pte, vm, gfn);
> +	if (ret)
> +		return ret;
> +
> +	*size = kvm_granule_size(level);
> +
> +	return 0;

This can also be moved into its own patch with get_valid_guest_pte(),
hyp_poison_range() changes in my opinion.

Thanks,
Wei-Lin Chang

[...]



More information about the linux-arm-kernel mailing list