[PATCH 02/20] KVM: arm64: Propagate host stage-2 annotated entries on block split

Wei-Lin Chang weilin.chang at arm.com
Mon Sep 7 06:58:41 PDT 2026


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

[...]

>  static void stage2_map_prefault_idmap(const struct kvm_pgtable_visit_ctx *ctx, kvm_pte_t *ptep)
>  {
>  	kvm_pte_t block_pte = ctx->old;
> +	bool counted, valid;
>  	u64 pa;
>  	int i;
>  
> -	if (!kvm_pte_valid(block_pte))
> +	counted = stage2_pte_is_counted(block_pte);
> +	valid = kvm_pte_valid(block_pte);
> +
> +	if (!valid && !counted)
> +		return;
> +
> +	/*
> +	 * Shared walks not supported: cannot rollback refcounts on break
> +	 * failure.
> +	 */
> +	if (counted && WARN_ON_ONCE(kvm_pgtable_walk_shared(ctx)))

Doesn't patch 1 also need this shared walk check,

>  		return;
>  
>  	pa = ALIGN_DOWN(ctx->addr, kvm_granule_size(ctx->level));
>  	for (i = 0; i < PTRS_PER_PTE; ++i, ++ptep, pa += kvm_granule_size(ctx->level + 1)) {
> -		kvm_pte_t pte = kvm_init_valid_leaf_pte(pa, block_pte, ctx->level + 1);
> +		kvm_pte_t pte = valid ?
> +			kvm_init_valid_leaf_pte(pa, block_pte, ctx->level + 1) :
> +			block_pte;
>  
>  		/*
>  		 * Skip ptes in the range being modified by the caller if we're
> @@ -1053,8 +1066,11 @@ static void stage2_map_prefault_idmap(const struct kvm_pgtable_visit_ctx *ctx, k
>  		 * that should happen very infrequently.
>  		 */
>  		if ((ctx->level < (KVM_PGTABLE_LAST_LEVEL - 1)) ||
> -		    (pa < ctx->addr) || (pa >= ctx->end))
> +		    (pa < ctx->addr) || (pa >= ctx->end)) {
>  			*ptep = pte;
> +			if (counted)
> +				ctx->mm_ops->get_page(ptep);

and this get_page() ?

Thanks,
Wei-Lin Chang

[...]



More information about the linux-arm-kernel mailing list