Re: [PATCH] RISC-V: KVM: Use flexible array for APLIC IRQ state

Anup Patel <[email protected]>
Newsgroups org.infradead.lists.kvm-riscv,org.infradead.lists.linux-riscv,org.kernel.vger.kvm,org.kernel.vger.linux-hardening,org.kernel.vger.linux-kernel
Message-ID <CAAhSdy34CXr4cky4cpg6eVV3FdwHvnR=pJqK=Y+ZsLLx0jL1_g@mail.gmail.com>
On Mon, May 11, 2026 at 8:52 AM Rosen Penev <[email protected]> wrote:
>
> Store the per-source APLIC IRQ state in the APLIC allocation instead
> of allocating it separately.
>
> This ties the IRQ state lifetime directly to the APLIC state, removes a
> separate allocation failure path, and lets __counted_by() describe the
> array bounds.
>
> Assisted-by: Codex:GPT-5.5
> Signed-off-by: Rosen Penev <[email protected]>

LGTM.

Reviewed-by: Anup Patel <[email protected]>

Queued this patch for Linux-7.2

Thanks,
Anup


> ---
>  arch/riscv/kvm/aia_aplic.c | 15 +++------------
>  1 file changed, 3 insertions(+), 12 deletions(-)
>
> diff --git a/arch/riscv/kvm/aia_aplic.c b/arch/riscv/kvm/aia_aplic.c
> index 3464f3351df7..748107c347d9 100644
> --- a/arch/riscv/kvm/aia_aplic.c
> +++ b/arch/riscv/kvm/aia_aplic.c
> @@ -35,7 +35,7 @@ struct aplic {
>
>         u32 nr_irqs;
>         u32 nr_words;
> -       struct aplic_irq *irqs;
> +       struct aplic_irq irqs[] __counted_by(nr_irqs);
>  };
>
>  static u32 aplic_read_sourcecfg(struct aplic *aplic, u32 irq)
> @@ -581,7 +581,7 @@ int kvm_riscv_aia_aplic_init(struct kvm *kvm)
>                 return 0;
>
>         /* Allocate APLIC global state */
> -       aplic = kzalloc_obj(*aplic);
> +       aplic = kzalloc_flex(*aplic, irqs, kvm->arch.aia.nr_sources + 1);
>         if (!aplic)
>                 return -ENOMEM;
>         kvm->arch.aia.aplic_state = aplic;
> @@ -589,11 +589,6 @@ int kvm_riscv_aia_aplic_init(struct kvm *kvm)
>         /* Setup APLIC IRQs */
>         aplic->nr_irqs = kvm->arch.aia.nr_sources + 1;
>         aplic->nr_words = DIV_ROUND_UP(aplic->nr_irqs, 32);
> -       aplic->irqs = kzalloc_objs(*aplic->irqs, aplic->nr_irqs);
> -       if (!aplic->irqs) {
> -               ret = -ENOMEM;
> -               goto fail_free_aplic;
> -       }
>         for (i = 0; i < aplic->nr_irqs; i++)
>                 raw_spin_lock_init(&aplic->irqs[i].lock);
>
> @@ -606,7 +601,7 @@ int kvm_riscv_aia_aplic_init(struct kvm *kvm)
>                                       &aplic->iodev);
>         mutex_unlock(&kvm->slots_lock);
>         if (ret)
> -               goto fail_free_aplic_irqs;
> +               goto fail_free_aplic;
>
>         /* Setup default IRQ routing */
>         ret = kvm_riscv_setup_default_irq_routing(kvm, aplic->nr_irqs);
> @@ -619,8 +614,6 @@ int kvm_riscv_aia_aplic_init(struct kvm *kvm)
>         mutex_lock(&kvm->slots_lock);
>         kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &aplic->iodev);
>         mutex_unlock(&kvm->slots_lock);
> -fail_free_aplic_irqs:
> -       kfree(aplic->irqs);
>  fail_free_aplic:
>         kvm->arch.aia.aplic_state = NULL;
>         kfree(aplic);
> @@ -638,8 +631,6 @@ void kvm_riscv_aia_aplic_cleanup(struct kvm *kvm)
>         kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &aplic->iodev);
>         mutex_unlock(&kvm->slots_lock);
>
> -       kfree(aplic->irqs);
> -
>         kvm->arch.aia.aplic_state = NULL;
>         kfree(aplic);
>  }
> --
> 2.54.0
>

-- 
kvm-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kvm-riscv
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.