From: Michael Chan <michael.chan@broadcom.com>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, andrew+netdev@lunn.ch,
pavan.chebbi@broadcom.com, andrew.gospodarek@broadcom.com
Subject: [PATCH net-next v4 1/8] bnxt_en: Clear bp->total_irqs when disabling IRQs
Date: Thu, 15 Oct 2026 23:44:20 -0700 [thread overview]
Message-ID: <20261016064427.496944-2-michael.chan@broadcom.com> (raw)
In-Reply-To: <20261016064427.496944-1-michael.chan@broadcom.com>
bnxt_init_int_mode() and bnxt_clear_int_mode() will free bp->irq_tbl
but bp->total_irqs retains the old value. If a subsequent
reinitialization happens, bnxt_reserve_rings() may see that
bp->total_irqs does not match a new irqs_required. It will then
try to adjust if dynamic MSI-X is supported and call
bnxt_change_msix(). It will then crash when dereferencing the NULL
bp->irq_tbl.
Fix it by clearing bp->total_irqs when freeing bp->irq_tbl. Dynamic
MSI-X adjustments should only proceed if bp->irq_tbl is valid which
means that MSI-X has been initialized and can be adjusted.
bnxt_ulp_irq_restart() also needs a similar check.
Add a bp->irq_tbl_size to prevent OOB bp->irq_tbl[] array access in
case MSI-X capabilities change during re-init. For dynamic MSI-X,
allocate the biggest bp->irq_tbl that FW supports without clamping it
with maximum CP/NQ rings to allow dynamic MSI-X to grow to the max.
In the AER path, if MSI-X capabilities change, bnxt_reserve_rings()
will initialize MSI-X if BNXT_NEW_RM() is true. Add a check in
bnxt_io_resume() to skip doing it again later.
Fixes: e68256c8a73c ("bnxt_en: Support dynamic MSIX")
Fixes: c2d20a3814d1 ("bnxt_en: delay pci_alloc_irq_vectors() in the AER path")
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
v4:
Clear bp->total_irqs in bnxt_clear_int_mode() to fix a possible NULL
bp->irq_tbl issue reported by Sashiko and Gregory Price on patch #8.
v3:
Added an additional Fixes tag.
https://lore.kernel.org/netdev/20261012220827.340998-2-michael.chan@broadcom.com/
v2:
https://lore.kernel.org/netdev/20260928041712.3467803-2-michael.chan@broadcom.com/
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 19 +++++++++++++++----
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 +
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 2 +-
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index c1d3fcc7ae84..19b4d3b92352 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -11510,6 +11510,12 @@ static int bnxt_change_msix(struct bnxt *bp, int total)
struct msi_map map;
int i;
+ if (!bp->irq_tbl)
+ return 0;
+
+ if (total > bp->irq_tbl_size)
+ return bp->total_irqs;
+
/* add MSIX to the end if needed */
for (i = bp->total_irqs; i < total; i++) {
map = pci_msix_alloc_irq_at(bp->pdev, i, NULL);
@@ -11652,12 +11658,13 @@ static int bnxt_init_int_mode(struct bnxt *bp)
tbl_size = total_vecs;
if (pci_msix_can_alloc_dyn(bp->pdev))
- tbl_size = max;
+ tbl_size = bp->hw_resc.max_irqs;
bp->irq_tbl = kzalloc_objs(*bp->irq_tbl, tbl_size);
if (!bp->irq_tbl) {
rc = -ENOMEM;
goto msix_setup_exit;
}
+ bp->irq_tbl_size = tbl_size;
for (i = 0; i < total_vecs; i++)
bp->irq_tbl[i].vector = pci_irq_vector(bp->pdev, i);
@@ -11680,6 +11687,8 @@ static int bnxt_init_int_mode(struct bnxt *bp)
netdev_err(bp->dev, "bnxt_init_int_mode err: %x\n", rc);
kfree(bp->irq_tbl);
bp->irq_tbl = NULL;
+ bp->total_irqs = 0;
+ bp->irq_tbl_size = 0;
pci_free_irq_vectors(bp->pdev);
return rc;
}
@@ -11690,6 +11699,8 @@ static void bnxt_clear_int_mode(struct bnxt *bp)
kfree(bp->irq_tbl);
bp->irq_tbl = NULL;
+ bp->total_irqs = 0;
+ bp->irq_tbl_size = 0;
}
int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
@@ -11716,7 +11727,7 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
if (irq_re_init && BNXT_NEW_RM(bp) && irqs_required != bp->total_irqs) {
irq_change = true;
- if (!pci_msix_can_alloc_dyn(bp->pdev)) {
+ if (!pci_msix_can_alloc_dyn(bp->pdev) || !bp->irq_tbl) {
bnxt_ulp_irq_stop(bp);
bnxt_clear_int_mode(bp);
irq_cleared = true;
@@ -15080,7 +15091,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
hwr.cp += bnxt_get_ulp_msix_num(bp);
hwr.cp = min_t(int, hwr.cp, bnxt_get_max_func_irqs(bp));
}
- if (hwr.cp > bp->total_irqs) {
+ if (bp->irq_tbl && hwr.cp > bp->total_irqs) {
int total_msix = bnxt_change_msix(bp, hwr.cp);
if (total_msix < hwr.cp) {
@@ -17743,7 +17754,7 @@ static void bnxt_io_resume(struct pci_dev *pdev)
err = bnxt_open(netdev);
} else {
err = bnxt_reserve_rings(bp, true);
- if (!err)
+ if (!err && !bp->irq_tbl)
err = bnxt_init_int_mode(bp);
}
}
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 41d05efd6307..75428a585577 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -2489,6 +2489,7 @@ struct bnxt {
*/
unsigned long *ring_affinity_set;
int max_irqs;
+ int irq_tbl_size;
int total_irqs;
int ulp_num_msix_want;
u8 mac_addr[ETH_ALEN];
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
index a515c368bac0..9b7bc508fae7 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
@@ -396,7 +396,7 @@ void bnxt_ulp_irq_restart(struct bnxt *bp, int err)
if (!ops || !ops->ulp_irq_restart)
return;
- if (!err) {
+ if (!err && bp->irq_tbl) {
ent = kzalloc_objs(*ent, ulp->msix_requested);
if (!ent)
return;
--
2.51.0
next prev parent reply other threads:[~2026-10-16 6:45 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 6:44 [PATCH net-next v4 0/8] bnxt_en: Ring accounting fixes Michael Chan
2026-10-16 6:44 ` Michael Chan [this message]
2026-10-16 6:44 ` [PATCH net-next v4 2/8] bnxt_en: Fix bnxt_reinit_features() when irq_re_init is true Michael Chan
2026-10-16 6:44 ` [PATCH net-next v4 3/8] bnxt_en: Refactor RSS table check logic Michael Chan
2026-10-16 6:44 ` [PATCH net-next v4 4/8] bnxt_en: Refactor IRQs required logic Michael Chan
2026-10-16 6:44 ` [PATCH net-next v4 5/8] bnxt_en: Reinit IRQ when configuring LRO/GRO/HDS Michael Chan
2026-10-16 6:44 ` [PATCH net-next v4 6/8] bnxt_en: Remove support for the old NITRO A0 chip Michael Chan
2026-10-16 6:44 ` [PATCH net-next v4 7/8] bnxt_en: Refactor bnxt_num_cp_to_tx()/bnxt_num_tx_to_cp() helpers Michael Chan
2026-10-16 6:44 ` [PATCH net-next v4 8/8] bnxt_en: Fix ring accounting and validation when rings are constrained Michael Chan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261016064427.496944-2-michael.chan@broadcom.com \
--to=michael.chan@broadcom.com \
--cc=andrew+netdev@lunn.ch \
--cc=andrew.gospodarek@broadcom.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox