Skip to contentSkip to conversation

lib: sbi_irqchip: fix device lookup by caps when first is NULL

PATCH Applied David E. Garcia Porras 2 participants 2 messages Jul 1 – Jul 16

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 lib: sbi_irqchip: fix device lookup by caps when first is NULL

lib: sbi_irqchip: fix device lookup by caps when first is NULL

When called with first == NULL, sbi_irqchip_find_device_by_caps() should scan the device list from the start. Instead it always returns NULL: "found" starts false and only flips true when an entry equals "first", but no entry ever equals NULL, so every entry hits "else continue" and nothing is checked.

This breaks MSI detection in sbi_mpxy, which calls it with first == NULL:

  ms->msi_avail = !!sbi_irqchip_find_device_by_caps(SBI_IRQCHIP_CAPS_MSI, NULL);

msi_avail is therefore always false, so mpxy_write_std_attr() silently drops the MSI attributes (MSI_ADDR_LO/HI, MSI_DATA, MSI_CONTROL) while still returning success, and MSI-based MPXY notifications are never delivered.

Initialize "found" from "first" so a NULL "first" scans from the beginning, and always continue in the pre-match branch so a non-NULL "first" resumes after the given device.

Fixes 8570b938444d ("lib: sbi_irqchip: Allow irqchip drivers advertise capabilities")
---
 lib/sbi/sbi_irqchip.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
lib/sbi/sbi_irqchip.c +2 -3
index 6d0df02e..f1bc24ca 100644
@@ -412,14 +412,13 @@ struct sbi_irqchip_device *sbi_irqchip_find_device_by_caps(unsigned long caps,
 							   struct sbi_irqchip_device *first)
 {
 	struct sbi_irqchip_device *chip;
-	bool found = false;
+	bool found = (first == NULL);
 
 	sbi_list_for_each_entry(chip, &irqchip_list, node) {
 		if (!found) {
 			if (first == chip)
 				found = true;
-			else
-				continue;
+			continue;
 		}
 		if ((chip->caps & caps) == caps)
 			return chip;
Signature · 7 lines
2.43.0


-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
Reviewed-by on v1 1/1 Applied
#1 lore raw
Quoted 2 lines · David E. Garcia Porras

lib: sbi_irqchip: fix device lookup by caps when first is NULL

No need to replicate the patch subject over here. I will drop it at the time of merging.

Quoted 14 lines

When called with first == NULL, sbi_irqchip_find_device_by_caps() should scan the device list from the start. Instead it always returns NULL: "found" starts false and only flips true when an entry equals "first", but no entry ever equals NULL, so every entry hits "else continue" and nothing is checked.

This breaks MSI detection in sbi_mpxy, which calls it with first == NULL:

  ms->msi_avail = !!sbi_irqchip_find_device_by_caps(SBI_IRQCHIP_CAPS_MSI, NULL);

msi_avail is therefore always false, so mpxy_write_std_attr() silently drops the MSI attributes (MSI_ADDR_LO/HI, MSI_DATA, MSI_CONTROL) while still returning success, and MSI-based MPXY notifications are never delivered.

Quoted 6 lines

Initialize "found" from "first" so a NULL "first" scans from the beginning, and always continue in the pre-match branch so a non-NULL "first" resumes after the given device.

Fixes 8570b938444d ("lib: sbi_irqchip: Allow irqchip drivers advertise capabilities")

LGTM.

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

Quoted 28 lines
---
 lib/sbi/sbi_irqchip.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
lib/sbi/sbi_irqchip.c +2 -4
index 6d0df02e..f1bc24ca 100644
@@ -412,14 +412,13 @@ struct sbi_irqchip_device *sbi_irqchip_find_device_by_caps(unsigned long caps,
                                                           struct sbi_irqchip_device *first)
 {
        struct sbi_irqchip_device *chip;
-       bool found = false;
+       bool found = (first == NULL);
 
        sbi_list_for_each_entry(chip, &irqchip_list, node) {
                if (!found) {
                        if (first == chip)
                                found = true;
-                       else
-                               continue;
+                       continue;
                }
                if ((chip->caps & caps) == caps)
                        return chip;
--

2.43.0

Signature · 3 lines
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi