[PATCH v2 6/6] lib: sbi_irqchip: fix MSI EIID gap and tail allocation logic in register_msi

Anup Patel anup.patel at oss.qualcomm.com
Thu Jul 9 01:38:08 PDT 2026


On Thu, Jun 18, 2026 at 12:16 AM Pawandeep Oza
<pawandeep.oza at oss.qualcomm.com> wrote:
>
> Fix sbi_irqchip_register_msi() that prevented contiguous EIID allocation:
>
> - Gap check condition was inverted: the original `h->first_hwirq -
>   hwirq < num_hwirq` incorrectly set `found = true` when the gap was
>   too small to fit num_hwirq entries. Correct to `>= num_hwirq` so
>   allocation only proceeds when sufficient space exists between
>   registered handlers.
>
> - Tail-space check `!found && !hwirq` never triggered after iteration
>   Replace with `(chip->num_hwirq - hwirq) >= num_hwirq` to correctly
>   allocate if handler list is empty.
>
> Fixes: 79e63bc8348d ("irqchip: add sbi_irqchip_register_msi support")
>
> Signed-off-by: Oza Pawandeep <pawandeep.oza at oss.qualcomm.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

> ---
>  lib/sbi/sbi_irqchip.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
> index 49fa4806..a4480751 100644
> --- a/lib/sbi/sbi_irqchip.c
> +++ b/lib/sbi/sbi_irqchip.c
> @@ -354,7 +354,7 @@ int sbi_irqchip_register_msi(struct sbi_irqchip_device *chip, u32 num_hwirq,
>                 if (h->first_hwirq <= hwirq && hwirq < (h->first_hwirq + h->num_hwirq)) {
>                         hwirq = h->first_hwirq + h->num_hwirq;
>                 } else if (hwirq < h->first_hwirq) {
> -                       if (h->first_hwirq - hwirq < num_hwirq) {
> +                       if (h->first_hwirq - hwirq >= num_hwirq) {
>                                 found = true;
>                                 break;
>                         } else {
> @@ -362,7 +362,7 @@ int sbi_irqchip_register_msi(struct sbi_irqchip_device *chip, u32 num_hwirq,
>                         }
>                 }
>         }
> -       if (!found && !hwirq)
> +       if (!found && (chip->num_hwirq - hwirq) >= num_hwirq)
>                 found = true;
>         if (!found)
>                 return SBI_ENOSPC;
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi

Thanks,
Anup



More information about the opensbi mailing list