From 7a90f41fb966e48a160637e841b91864e7a2c81c Mon Sep 17 00:00:00 2001 From: Pawandeep Oza Date: Tue, 21 Jul 2026 14:48:30 -0700 Subject: [PATCH] lib: sbi_irqchip: fix MSI EIID gap and tail allocation logic in register_msi 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 Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20260721214833.687361-7-pawandeep.oza@oss.qualcomm.com Signed-off-by: Anup Patel --- 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 d6771fa8..b490a3ad 100644 --- a/lib/sbi/sbi_irqchip.c +++ b/lib/sbi/sbi_irqchip.c @@ -392,7 +392,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 { @@ -400,7 +400,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;