Re: [PATCH v4 14/17] KVM: arm64: Alloc pkvm_hyp_vcpu using pKVM heap allocator

[email protected] Fri, 31 Jul 2026 15:04:25 +0000
Newsgroups dev.linux.lists.kvmarm
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] The dynamic allocation of the hypervisor vCPU and VM state structures via the pKVM heap allocator bypasses memory cgroup (kmemcg) accounting, allowing an unprivileged userspace process to bypass memcg limits.
--

--- Patch [14]: [PATCH v4 14/17] KVM: arm64: Alloc pkvm_hyp_vcpu using pKVM heap allocator ---
commit b0e52464780692d209150dd491713c25a5d1c1c0
Author: Vincent Donnefort <[email protected]>

KVM: arm64: Alloc pkvm_hyp_vcpu using pKVM heap allocator
    
Transition the allocation of the hypervisor vCPU state structure (pkvm_hyp_vcpu)
from the host to the hypervisor using the new pKVM heap allocator. The host now
uses the pkvm_call_hyp_req wrapper to handle top-up requests if the hypervisor
runs out of heap memory.

> diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c
> index a9b85ad37787a..3b29b3f43ffa5 100644
> --- a/arch/arm64/kvm/pkvm.c
> +++ b/arch/arm64/kvm/pkvm.c

[ ... ]

> @@ -153,28 +153,19 @@ static void __pkvm_destroy_hyp_vm(struct kvm *kvm)
>  
>  	kvm->arch.pkvm.handle = 0;
>  	kvm->arch.pkvm.is_created = false;
> -	free_hyp_memcache(&kvm->arch.pkvm.teardown_mc);
>  	free_hyp_memcache(&kvm->arch.pkvm.stage2_teardown_mc);
>  }
>  
>  static int __pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu)
>  {
> -	size_t hyp_vcpu_sz = PAGE_ALIGN(PKVM_HYP_VCPU_SIZE);
>  	pkvm_handle_t handle = vcpu->kvm->arch.pkvm.handle;
> -	void *hyp_vcpu;
>  	int ret;
>  
>  	init_hyp_stage2_memcache(&vcpu->arch.pkvm_memcache);
>  
> -	hyp_vcpu = alloc_pages_exact(hyp_vcpu_sz, GFP_KERNEL_ACCOUNT);
> -	if (!hyp_vcpu)
> -		return -ENOMEM;
> -
> -	ret = kvm_call_hyp_nvhe(__pkvm_init_vcpu, handle, vcpu, hyp_vcpu);
> +	ret = pkvm_call_hyp_req(__pkvm_init_vcpu, handle, vcpu);
[Severity: High]
Does this change unintentionally drop memory cgroup (kmemcg) accounting for
the vCPU state structure?

Previously, this structure was allocated with GFP_KERNEL_ACCOUNT. By switching
to pkvm_call_hyp_req() and relying on the EL2 heap top-up mechanism, it appears
the accounting is bypassed. When the top-up path calls pkvm_hyp_topup(), it uses
init_hyp_memcache() which lacks the HYP_MEMCACHE_ACCOUNT_KMEMCG flag. This
causes the host allocation in hyp_mc_alloc_fn() to fall back to GFP_KERNEL
instead of GFP_KERNEL_ACCOUNT.

Could this allow an unprivileged userspace process to bypass memcg limits by
repeatedly creating VMs and vCPUs, leading to a host out-of-memory condition?

While a previous commit noted that heap donations cannot be accounted for a
specific VM because they are shared and recycled, active VM and vCPU structures
remain in use for the lifetime of the VM and cannot be reclaimed by the new pKVM
shrinker. This might allow a malicious tenant to systematically exhaust host
memory.

>  	if (!ret)
>  		vcpu_set_flag(vcpu, VCPU_PKVM_FINALIZED);
> -	else
> -		free_pages_exact(hyp_vcpu, hyp_vcpu_sz);
>  
>  	return ret;
>  }

-- 
Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=14