diff mbox series

[net-next,1/7] bnxt_en: Fix and simplify bnxt_get_avail_msix() calls

Message ID 20240430224438.91494-2-michael.chan@broadcom.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series bnxt_en: Updates for net-next | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 926 this patch: 926
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers fail 1 blamed authors not CCed: jacob.e.keller@intel.com; 1 maintainers not CCed: jacob.e.keller@intel.com
netdev/build_clang success Errors and warnings before: 937 this patch: 937
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 941 this patch: 941
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 54 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 2 this patch: 2
netdev/source_inline success Was 0 now: 0

Commit Message

Michael Chan April 30, 2024, 10:44 p.m. UTC
David reported this issue of the driver not initializing on an older
chip not running in the new resource manager mode (!BNXT_NEW_RM()).

Sample dmesg:

bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): Able to reserve only 0 out of 9 requested RX rings
bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): Unable to reserve tx rings
bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): 2nd rings reservation failed.
bnxt_en 0000:02:00.0 (unnamed net_device) (uninitialized): Not enough rings available.
bnxt_en 0000:02:00.0: probe with driver bnxt_en failed with error -12

This is a regression caused by a recent commit that adds a call to
bnxt_get_avail_msix() before MSIX is initialized:

bnxt_set_dflt_rings()
  __bnxt_reserve_rings()
    bnxt_get_avail_msix()

bnxt_get_avail_msix() returns a negative number if !BNXT_NEW_RM() and
when MSIX is not initialized.  This causes __bnxt_reserve_rings() to
fail in this call sequence and the driver aborts initialization.

Before this commit in 2022:

303432211324 ("bnxt_en: Remove runtime interrupt vector allocation")

MSIX allocation for RoCE was dynamic and bnxt_get_avail_msix() was
used to determine the available run-time MSIX available for RoCE.

Today, bnxt_get_avail_msix() is only used to reserve some available
MSIX ahead of time to be ready when the RoCE driver loads.  It
only needs to be called when BNXT_NEW_RM() is true because older
chips do not require reservations for MSIX.  Simplify
bnxt_get_avail_msix() to only consider the BNXT_NEW_RM() case and
only make this call if BNXT_NEW_RM() is true.

Also change bnxt_get_avail_msix() to static since it is only used
in bnxt.c.

Reported-by: David Wei <dw@davidwei.uk>
Fixes: d630624ebd70 ("bnxt_en: Utilize ulp client resources if RoCE is not registered")
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
Cc: David Wei <dw@davidwei.uk>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 20 ++++++++------------
 drivers/net/ethernet/broadcom/bnxt/bnxt.h |  1 -
 2 files changed, 8 insertions(+), 13 deletions(-)

Comments

Jakub Kicinski April 30, 2024, 11:19 p.m. UTC | #1
On Tue, 30 Apr 2024 15:44:32 -0700 Michael Chan wrote:
> Reported-by: David Wei <dw@davidwei.uk>
> Fixes: d630624ebd70 ("bnxt_en: Utilize ulp client resources if RoCE is not registered")

He hasn't reported it, he sent you a patch.
And instead of giving him feedback you posted your own fix.
Why?
This sort of behavior is really discouraging to contributors.
Michael Chan April 30, 2024, 11:35 p.m. UTC | #2
On Tue, Apr 30, 2024 at 4:19 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Tue, 30 Apr 2024 15:44:32 -0700 Michael Chan wrote:
> > Reported-by: David Wei <dw@davidwei.uk>
> > Fixes: d630624ebd70 ("bnxt_en: Utilize ulp client resources if RoCE is not registered")
>
> He hasn't reported it, he sent you a patch.
> And instead of giving him feedback you posted your own fix.
> Why?
> This sort of behavior is really discouraging to contributors.

Sorry, I wanted to get this fixed ASAP and did not quite understand
the subtlety on how to handle this properly.  I will work with David
to get the fix in.
Jakub Kicinski April 30, 2024, 11:44 p.m. UTC | #3
On Tue, 30 Apr 2024 16:35:51 -0700 Michael Chan wrote:
> > On Tue, 30 Apr 2024 15:44:32 -0700 Michael Chan wrote:  
> > > Reported-by: David Wei <dw@davidwei.uk>
> > > Fixes: d630624ebd70 ("bnxt_en: Utilize ulp client resources if RoCE is not registered")  
> >
> > He hasn't reported it, he sent you a patch.
> > And instead of giving him feedback you posted your own fix.
> > Why?
> > This sort of behavior is really discouraging to contributors.  
> 
> Sorry, I wanted to get this fixed ASAP and did not quite understand
> the subtlety on how to handle this properly.  I will work with David
> to get the fix in.

Thank you, feel free to repost the other 6 patches without the 24h wait.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index be96bb494ae6..0eb880766012 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -7459,6 +7459,8 @@  static bool bnxt_rings_ok(struct bnxt *bp, struct bnxt_hw_rings *hwr)
 	       hwr->stat && (hwr->cp_p5 || !(bp->flags & BNXT_FLAG_CHIP_P5_PLUS));
 }
 
+static int bnxt_get_avail_msix(struct bnxt *bp, int num);
+
 static int __bnxt_reserve_rings(struct bnxt *bp)
 {
 	struct bnxt_hw_rings hwr = {0};
@@ -7471,7 +7473,7 @@  static int __bnxt_reserve_rings(struct bnxt *bp)
 	if (!bnxt_need_reserve_rings(bp))
 		return 0;
 
-	if (!bnxt_ulp_registered(bp->edev)) {
+	if (!bnxt_ulp_registered(bp->edev) && BNXT_NEW_RM(bp)) {
 		ulp_msix = bnxt_get_avail_msix(bp, bp->ulp_num_msix_want);
 		if (!ulp_msix)
 			bnxt_set_ulp_stat_ctxs(bp, 0);
@@ -10474,19 +10476,13 @@  unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp)
 	return bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_func_stat_ctxs(bp);
 }
 
-int bnxt_get_avail_msix(struct bnxt *bp, int num)
+/* Only called if BNXT_NEW_RM() is true to get the available MSIX to
+ * reserve ahead of time before RoCE is registered.
+ */
+static int bnxt_get_avail_msix(struct bnxt *bp, int num)
 {
-	int max_cp = bnxt_get_max_func_cp_rings(bp);
 	int max_irq = bnxt_get_max_func_irqs(bp);
 	int total_req = bp->cp_nr_rings + num;
-	int max_idx, avail_msix;
-
-	max_idx = bp->total_irqs;
-	if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
-		max_idx = min_t(int, bp->total_irqs, max_cp);
-	avail_msix = max_idx - bp->cp_nr_rings;
-	if (!BNXT_NEW_RM(bp) || avail_msix >= num)
-		return avail_msix;
 
 	if (max_irq < total_req) {
 		num = max_irq - bp->cp_nr_rings;
@@ -10619,7 +10615,7 @@  int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
 	if (!bnxt_need_reserve_rings(bp))
 		return 0;
 
-	if (!bnxt_ulp_registered(bp->edev)) {
+	if (!bnxt_ulp_registered(bp->edev) && BNXT_NEW_RM(bp)) {
 		int ulp_msix = bnxt_get_avail_msix(bp, bp->ulp_num_msix_want);
 
 		if (ulp_msix > bp->ulp_num_msix_want)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index ad57ef051798..0c680032ab66 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -2736,7 +2736,6 @@  unsigned int bnxt_get_max_func_stat_ctxs(struct bnxt *bp);
 unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp);
 unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp);
 unsigned int bnxt_get_avail_cp_rings_for_en(struct bnxt *bp);
-int bnxt_get_avail_msix(struct bnxt *bp, int num);
 int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init);
 void bnxt_tx_disable(struct bnxt *bp);
 void bnxt_tx_enable(struct bnxt *bp);