]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Adjust TX rings if reservation is less than requested
authorMichael Chan <michael.chan@broadcom.com>
Mon, 25 Aug 2025 17:59:26 +0000 (10:59 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Sep 2025 13:31:49 +0000 (15:31 +0200)
[ Upstream commit 1ee581c24dfdcbc6de25aac95a48c1f08e9a542c ]

Before we accept an ethtool request to increase a resource (such as
rings), we call the FW to check that the requested resource is likely
available first before we commit.  But it is still possible that
the actual reservation or allocation can fail.  The existing code
is missing the logic to adjust the TX rings in case the reserved
TX rings are less than requested.  Add a warning message (a similar
message for RX rings already exists) and add the logic to adjust
the TX rings.  Without this fix, the number of TX rings reported
to the stack can exceed the actual TX rings and ethtool -l will
report more than the actual TX rings.

Fixes: 674f50a5b026 ("bnxt_en: Implement new method to reserve rings.")
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250825175927.459987-3-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index dc123822771b65f0c68b6d9f9abfc77b46c6704a..b8c6087a5c31e981c454084e4884aee43811260f 100644 (file)
@@ -7788,6 +7788,11 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
                hwr.rx = rx_rings << 1;
        tx_cp = bnxt_num_tx_to_cp(bp, hwr.tx);
        hwr.cp = sh ? max_t(int, tx_cp, rx_rings) : tx_cp + rx_rings;
+       if (hwr.tx != bp->tx_nr_rings) {
+               netdev_warn(bp->dev,
+                           "Able to reserve only %d out of %d requested TX rings\n",
+                           hwr.tx, bp->tx_nr_rings);
+       }
        bp->tx_nr_rings = hwr.tx;
 
        /* If we cannot reserve all the RX rings, reset the RSS map only
@@ -12269,6 +12274,13 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
        if (rc)
                return rc;
 
+       /* Make adjustments if reserved TX rings are less than requested */
+       bp->tx_nr_rings -= bp->tx_nr_rings_xdp;
+       bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
+       if (bp->tx_nr_rings_xdp) {
+               bp->tx_nr_rings_xdp = bp->tx_nr_rings_per_tc;
+               bp->tx_nr_rings += bp->tx_nr_rings_xdp;
+       }
        rc = bnxt_alloc_mem(bp, irq_re_init);
        if (rc) {
                netdev_err(bp->dev, "bnxt_alloc_mem err: %x\n", rc);