lkml.org 
[lkml]   [2022]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 52/70] bnxt_en: Fix possible bnxt_open() failure caused by wrong RFS flag
    Date
    From: Somnath Kotur <somnath.kotur@broadcom.com>

    commit 13ba794397e45e52893cfc21d7a69cb5f341b407 upstream.

    bnxt_open() can fail in this code path, especially on a VF when
    it fails to reserve default rings:

    bnxt_open()
    __bnxt_open_nic()
    bnxt_clear_int_mode()
    bnxt_init_dflt_ring_mode()

    RX rings would be set to 0 when we hit this error path.

    It is possible for a subsequent bnxt_open() call to potentially succeed
    with a code path like this:

    bnxt_open()
    bnxt_hwrm_if_change()
    bnxt_fw_init_one()
    bnxt_fw_init_one_p3()
    bnxt_set_dflt_rfs()
    bnxt_rfs_capable()
    bnxt_hwrm_reserve_rings()

    On older chips, RFS is capable if we can reserve the number of vnics that
    is equal to RX rings + 1. But since RX rings is still set to 0 in this
    code path, we may mistakenly think that RFS is supported for 0 RX rings.

    Later, when the default RX rings are reserved and we try to enable
    RFS, it would fail and cause bnxt_open() to fail unnecessarily.

    We fix this in 2 places. bnxt_rfs_capable() will always return false if
    RX rings is not yet set. bnxt_init_dflt_ring_mode() will call
    bnxt_set_dflt_rfs() which will always clear the RFS flags if RFS is not
    supported.

    Fixes: 20d7d1c5c9b1 ("bnxt_en: reliably allocate IRQ table on reset to avoid crash")
    Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 ++++-----
    1 file changed, 4 insertions(+), 5 deletions(-)

    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    @@ -10453,7 +10453,7 @@ static bool bnxt_rfs_capable(struct bnxt

    if (bp->flags & BNXT_FLAG_CHIP_P5)
    return bnxt_rfs_supported(bp);
    - if (!(bp->flags & BNXT_FLAG_MSIX_CAP) || !bnxt_can_reserve_rings(bp))
    + if (!(bp->flags & BNXT_FLAG_MSIX_CAP) || !bnxt_can_reserve_rings(bp) || !bp->rx_nr_rings)
    return false;

    vnics = 1 + bp->rx_nr_rings;
    @@ -12481,10 +12481,9 @@ static int bnxt_init_dflt_ring_mode(stru
    goto init_dflt_ring_err;

    bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
    - if (bnxt_rfs_supported(bp) && bnxt_rfs_capable(bp)) {
    - bp->flags |= BNXT_FLAG_RFS;
    - bp->dev->features |= NETIF_F_NTUPLE;
    - }
    +
    + bnxt_set_dflt_rfs(bp);
    +
    init_dflt_ring_err:
    bnxt_ulp_irq_restart(bp, rc);
    return rc;

    \
     
     \ /
      Last update: 2022-05-10 15:58    [W:4.486 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site