Re: [PATCH v5 07/49] KVM: arm64: gic-v5: Cache host IRS ID registers

[email protected] Fri, 07 Aug 2026 12:27:19 +0000
Newsgroups dev.linux.lists.kvmarm,org.kernel.vger.kvm
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] The hardware-based limit for maximum vCPUs is silently clobbered by a hardcoded maximum in the GICv3 legacy fallback path.
- [Medium] The return type of `vgic_v5_irs_vped_size()` is `u16`, which will silently truncate descriptor sizes of 64KB or larger to 0.
--

--- Patch [7]: [PATCH v5 07/49] KVM: arm64: gic-v5: Cache host IRS ID registers ---
commit d81802dd59faf96c570bb509e00ac335dada7904
Author: Sascha Bischoff <[email protected]>

KVM: arm64: gic-v5: Cache host IRS ID registers
    
This commit caches the GICv5 IRS ID registers to configure virtual-machine
resources based on hardware capabilities rather than extracting individual
fields. It limits the maximum number of vCPUs using the VPE capacity from
the cached IRS_IDR4 register while retaining KVM's upper bound.

> diff --git a/arch/arm64/kvm/vgic/vgic-v5.c b/arch/arm64/kvm/vgic/vgic-v5.c
> index d4789ff3e7402..41ca2098ecb73 100644
> --- a/arch/arm64/kvm/vgic/vgic-v5.c
> +++ b/arch/arm64/kvm/vgic/vgic-v5.c

[ ... ]

> @@ -61,10 +77,12 @@ int vgic_v5_probe(const struct gic_kvm_info *info)
>  		goto skip_v5;
>  	}
>  
> -	kvm_vgic_global_state.max_gic_vcpus = VGIC_V5_MAX_CPUS;
> -
> +	vgic_v5_irs_cache_id_regs(info);
>  	vgic_v5_get_implemented_ppis();
>  
> +	kvm_vgic_global_state.max_gic_vcpus = min(vgic_v5_irs_max_vpes(&irs_caps),
> +						  VGIC_V5_MAX_CPUS);
> +

[Severity: High]
Does the GICv3 legacy fallback path under the skip_v5 label in vgic_v5_probe()
overwrite this dynamically computed hardware limit?

If the max_gic_vcpus limit is later expanded by a static value (like
VGIC_V3_MAX_CPUS via a max() assignment), could it permit userspace to create
more vCPUs for a GICv5 VM than the hardware IRS actually supports (for example,
allowing 512 vCPUs even if the hardware restricts it to 16 VPEs)?

>  	ret = kvm_register_vgic_device(KVM_DEV_TYPE_ARM_VGIC_V5);
>  	if (ret) {
>  		kvm_err("Cannot register GICv5 KVM device.\n");

> diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
> index fe49fb56dc3c9..c6f0ab69f7a2e 100644
> --- a/include/kvm/arm_vgic.h
> +++ b/include/kvm/arm_vgic.h

[ ... ]

> @@ -630,6 +646,65 @@ int vgic_v4_load(struct kvm_vcpu *vcpu);
>  void vgic_v4_commit(struct kvm_vcpu *vcpu);
>  int vgic_v4_put(struct kvm_vcpu *vcpu);
>  

[ ... ]

> +static inline u16 vgic_v5_irs_vped_size(const struct vgic_v5_irs_caps *caps)
> +{
> +	return BIT(FIELD_GET(GICV5_IRS_IDR4_VPED_SZ, caps->idr4));
> +}
> +

[Severity: Medium]
If a hardware implementation reports a size parameter of 16 or greater
(indicating 64KB or more), will the BIT() operation in vgic_v5_irs_vped_size()
result in 65536 and silently truncate to 0 when cast to the u16 return type?

Could this zero-byte size calculation lead to 0-byte allocations or infinite
loops in dependent resource sizing?

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