lkml.org 
[lkml]   [2019]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.1 186/219] bnxt_en: Fix statistics context reservation logic for RDMA driver.
    Date
    From: Michael Chan <michael.chan@broadcom.com>

    [ Upstream commit d77b1ad8e87dc5a6cd0d9158b097a4817946ca3b ]

    The current logic assumes that the RDMA driver uses one statistics
    context adjacent to the ones used by the network driver. This
    assumption is not true and the statistics context used by the
    RDMA driver is tied to its MSIX base vector. This wrong assumption
    can cause RDMA driver failure after changing ethtool rings on the
    network side. Fix the statistics reservation logic accordingly.

    Fixes: 780baad44f0f ("bnxt_en: Reserve 1 stat_ctx for RDMA driver.")
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/broadcom/bnxt/bnxt.c | 17 +++++++++++------
    1 file changed, 11 insertions(+), 6 deletions(-)

    diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    index bf1fd513fa02..09557bf49bb0 100644
    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    @@ -5481,7 +5481,16 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp)

    static int bnxt_get_func_stat_ctxs(struct bnxt *bp)
    {
    - return bp->cp_nr_rings + bnxt_get_ulp_stat_ctxs(bp);
    + int ulp_stat = bnxt_get_ulp_stat_ctxs(bp);
    + int cp = bp->cp_nr_rings;
    +
    + if (!ulp_stat)
    + return cp;
    +
    + if (bnxt_nq_rings_in_use(bp) > cp + bnxt_get_ulp_msix_num(bp))
    + return bnxt_get_ulp_msix_base(bp) + ulp_stat;
    +
    + return cp + ulp_stat;
    }

    static bool bnxt_need_reserve_rings(struct bnxt *bp)
    @@ -7373,11 +7382,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bnxt *bp)

    unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp)
    {
    - unsigned int stat;
    -
    - stat = bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_ulp_stat_ctxs(bp);
    - stat -= bp->cp_nr_rings;
    - return stat;
    + return bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_func_stat_ctxs(bp);
    }

    int bnxt_get_avail_msix(struct bnxt *bp, int num)
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-07-15 17:45    [W:4.414 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site