From: Bhargava Marreddy <bhargava.marreddy@broadcom.com>
To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
michael.chan@broadcom.com, pavan.chebbi@broadcom.com,
vsrama-krishna.nemani@broadcom.com, vikas.gupta@broadcom.com,
Bhargava Marreddy <bhargava.marreddy@broadcom.com>,
Dharmender Garg <dharmender.garg@broadcom.com>,
Kumar Mudide <kumar.mudide@broadcom.com>,
Ramakrishna Koduri <ramakrishna.koduri@broadcom.com>
Subject: [PATCH net-next v3 3/5] bnge: add bnge_for_each_open_nq() iterator
Date: Wed, 14 Oct 2026 01:36:43 +0530 [thread overview]
Message-ID: <20261013200645.1346299-4-bhargava.marreddy@broadcom.com> (raw)
In-Reply-To: <20261013200645.1346299-1-bhargava.marreddy@broadcom.com>
Add BNGE_FIRST_OPEN_NQ and bnge_for_each_open_nq(), and use them in the
loops that will need to skip the NQ that is created at probe once it is
split out. The "open" NQs are the ones created in ndo_open() and
destroyed in ndo_stop(), i.e. all NQs from index BNGE_FIRST_OPEN_NQ on.
The loop that carves the bnge_napi instances out of the bn->bnapi
allocation in bnge_alloc_core() is converted as well; its allocation
size will be reduced by BNGE_FIRST_OPEN_NQ when the probe-time NQ moves
out of it.
The loops over the completion rings, over the per-NQ stats and ring
group state, and the interrupt disable/sync loops are intentionally
left alone, as they still cover all NQs. The latter must mask and
synchronize the IRQ of the probe-time NQ before its completion rings
are freed.
In bnge_hwrm_ring_free(), split the NQ free out of the completion ring
loop so that it can use the iterator, mirroring bnge_hwrm_ring_alloc().
This changes the order of the firmware commands: previously each NQ was
freed right after its own completion rings, now all completion rings
are freed first and all NQs after. Each completion ring is still freed
before the NQ it belongs to.
BNGE_FIRST_OPEN_NQ is 0 for now, i.e. every NQ is an open NQ, so the
macro expands to the loops it replaces. Apart from the firmware command
order above, no functional change.
Signed-off-by: Bhargava Marreddy <bhargava.marreddy@broadcom.com>
Reviewed-by: Dharmender Garg <dharmender.garg@broadcom.com>
Reviewed-by: Kumar Mudide <kumar.mudide@broadcom.com>
Reviewed-by: Ramakrishna Koduri <ramakrishna.koduri@broadcom.com>
---
drivers/net/ethernet/broadcom/bnge/bnge.h | 9 ++++++
.../net/ethernet/broadcom/bnge/bnge_netdev.c | 29 ++++++++++---------
2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethernet/broadcom/bnge/bnge.h
index e76ba4e063bb..fdd8bca01440 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge.h
+++ b/drivers/net/ethernet/broadcom/bnge/bnge.h
@@ -238,6 +238,15 @@ struct bnge_dev {
#define bnge_warn(bd, fmt, ...) bnge_log(warn, bd, fmt, ##__VA_ARGS__)
#define bnge_dbg(bd, fmt, ...) bnge_log(dbg, bd, fmt, ##__VA_ARGS__)
+/* Index of the first NQ created in ndo_open() and destroyed in ndo_stop().
+ * NQs below it are created at probe and destroyed at remove. It starts at 0,
+ * i.e. all NQs are open NQs, until NQ0 moves to probe.
+ */
+#define BNGE_FIRST_OPEN_NQ 0
+
+#define bnge_for_each_open_nq(i, bd) \
+ for ((i) = BNGE_FIRST_OPEN_NQ; (i) < (bd)->nq_nr_rings; (i)++)
+
static inline bool bnge_is_roce_en(struct bnge_dev *bd)
{
return bd->flags & BNGE_EN_ROCE;
diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
index f8f81f3f7cd9..0d98223cd703 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
+++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
@@ -548,7 +548,7 @@ static void bnge_free_nqs(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i;
- for (i = 0; i < bd->nq_nr_rings; i++)
+ bnge_for_each_open_nq(i, bd)
bnge_free_nq(bn, bn->bnapi[i]);
}
@@ -557,7 +557,7 @@ static int bnge_alloc_nqs(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i, rc;
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
rc = bnge_alloc_nq(bn, bn->bnapi[i]);
if (rc)
goto err_free_nqs;
@@ -565,7 +565,7 @@ static int bnge_alloc_nqs(struct bnge_net *bn)
return 0;
err_free_nqs:
- while (--i >= 0)
+ while (--i >= BNGE_FIRST_OPEN_NQ)
bnge_free_nq(bn, bn->bnapi[i]);
return rc;
}
@@ -1249,10 +1249,11 @@ static int bnge_alloc_core(struct bnge_net *bn)
bn->bnapi = bnapi;
bnapi += arr_size;
- for (i = 0; i < bd->nq_nr_rings; i++, bnapi += size) {
+ bnge_for_each_open_nq(i, bd) {
bn->bnapi[i] = bnapi;
bn->bnapi[i]->index = i;
bn->bnapi[i]->bn = bn;
+ bnapi += size;
}
bn->rx_ring = kzalloc_objs(struct bnge_rx_ring_info, bd->rx_nr_rings);
@@ -1970,7 +1971,7 @@ static int bnge_hwrm_ring_alloc(struct bnge_net *bn)
int i, rc = 0;
agg_rings = !!(bnge_is_agg_reqd(bd));
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
struct bnge_napi *bnapi = bn->bnapi[i];
struct bnge_ring_struct *ring = &bnapi->nq_ring.ring_struct;
@@ -2426,7 +2427,7 @@ static void bnge_enable_int(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i;
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
struct bnge_napi *bnapi = bn->bnapi[i];
struct bnge_nq_ring_info *nqr;
@@ -2443,7 +2444,7 @@ static void bnge_disable_napi(struct bnge_net *bn)
if (test_and_set_bit(BNGE_STATE_NAPI_DISABLED, &bn->state))
return;
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
struct bnge_napi *bnapi = bn->bnapi[i];
napi_disable_locked(&bnapi->napi);
@@ -2456,7 +2457,7 @@ static void bnge_enable_napi(struct bnge_net *bn)
int i;
clear_bit(BNGE_STATE_NAPI_DISABLED, &bn->state);
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
struct bnge_napi *bnapi = bn->bnapi[i];
bnapi->in_reset = false;
@@ -2609,7 +2610,9 @@ static void bnge_hwrm_ring_free(struct bnge_net *bn, bool close_path)
for (j = 0; j < nqr->cp_ring_count && nqr->cp_ring_arr; j++)
bnge_hwrm_cp_ring_free(bn, &nqr->cp_ring_arr[j]);
+ }
+ bnge_for_each_open_nq(i, bd) {
bnge_hwrm_nq_free(bn, bn->bnapi[i]);
bn->grp_info[i].nq_fw_ring_id = INVALID_HW_RING_ID;
}
@@ -2622,7 +2625,7 @@ static void bnge_setup_msix(struct bnge_net *bn)
int len, i;
len = sizeof(bd->irq_tbl[0].name);
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
int map_idx = bnge_cp_num_to_irq_num(bn, i);
char *attr;
@@ -2707,7 +2710,7 @@ static void bnge_free_irq(struct bnge_net *bn)
struct bnge_dev *bd = bn->bd;
int i;
- for (i = 0; i < bd->nq_nr_rings; i++)
+ bnge_for_each_open_nq(i, bd)
bnge_nq_free_irq(bn, bn->bnapi[i]);
}
@@ -2721,7 +2724,7 @@ static int bnge_request_irq(struct bnge_net *bn)
netdev_err(bn->netdev, "bnge_setup_interrupts err: %d\n", rc);
return rc;
}
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
rc = bnge_nq_request_irq(bn, bn->bnapi[i]);
if (rc)
goto err_free_irq;
@@ -2840,7 +2843,7 @@ static void bnge_init_napi(struct bnge_net *bn)
struct bnge_napi *bnapi;
int i;
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
bnapi = bn->bnapi[i];
netif_napi_add_config_locked(bn->netdev, &bnapi->napi,
bnge_napi_poll, bnapi->index);
@@ -2857,7 +2860,7 @@ static void bnge_del_napi(struct bnge_net *bn)
for (i = 0; i < bd->tx_nr_rings; i++)
netif_queue_set_napi(bn->netdev, i, NETDEV_QUEUE_TYPE_TX, NULL);
- for (i = 0; i < bd->nq_nr_rings; i++) {
+ bnge_for_each_open_nq(i, bd) {
struct bnge_napi *bnapi = bn->bnapi[i];
__netif_napi_del_locked(&bnapi->napi);
--
2.47.3
next prev parent reply other threads:[~2026-10-13 20:08 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 20:06 [PATCH net-next v3 0/5] bnge: Make NQ0 persistent across open/close Bhargava Marreddy
2026-10-13 20:06 ` [PATCH net-next v3 1/5] bnge: factor out per-NQ alloc/free helpers Bhargava Marreddy
2026-10-13 20:06 ` [PATCH net-next v3 2/5] bnge: add bnge_err()/bnge_warn()/bnge_dbg() logging helpers Bhargava Marreddy
2026-10-13 20:06 ` Bhargava Marreddy [this message]
2026-10-13 20:06 ` [PATCH net-next v3 4/5] bnge: make irq_tbl layout depend on BNGE_FIRST_OPEN_NQ Bhargava Marreddy
2026-10-13 20:06 ` [PATCH net-next v3 5/5] bnge: make NQ0 persistent across open/stop cycles Bhargava Marreddy
2026-10-18 15:32 ` Bhargava Chenna Marreddy
2026-10-18 17:20 ` Bhargava Chenna Marreddy
2026-10-20 20:34 ` Jakub Kicinski
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=20261013200645.1346299-4-bhargava.marreddy@broadcom.com \
--to=bhargava.marreddy@broadcom.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=dharmender.garg@broadcom.com \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=kumar.mudide@broadcom.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michael.chan@broadcom.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=ramakrishna.koduri@broadcom.com \
--cc=vikas.gupta@broadcom.com \
--cc=vsrama-krishna.nemani@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