lkml.org 
[lkml]   [2019]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.0 26/79] IB/hfi1: Fix the allocation of RSM table
    Date
    From: Kaike Wan <kaike.wan@intel.com>

    [ Upstream commit d0294344470e6b52d097aa7369173f32d11f2f52 ]

    The receive side mapping (RSM) on hfi1 hardware is a special
    matching mechanism to direct an incoming packet to a given
    hardware receive context. It has 4 instances of matching capabilities
    (RSM0 - RSM3) that share the same RSM table (RMT). The RMT has a total of
    256 entries, each of which points to a receive context.

    Currently, three instances of RSM have been used:
    1. RSM0 by QOS;
    2. RSM1 by PSM FECN;
    3. RSM2 by VNIC.

    Each RSM instance should reserve enough entries in RMT to function
    properly. Since both PSM and VNIC could allocate any receive context
    between dd->first_dyn_alloc_ctxt and dd->num_rcv_contexts, PSM FECN must
    reserve enough RMT entries to cover the entire receive context index
    range (dd->num_rcv_contexts - dd->first_dyn_alloc_ctxt) instead of only
    the user receive contexts allocated for PSM
    (dd->num_user_contexts). Consequently, the sizing of
    dd->num_user_contexts in set_up_context_variables is incorrect.

    Fixes: 2280740f01ae ("IB/hfi1: Virtual Network Interface Controller (VNIC) HW support")
    Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
    Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
    Signed-off-by: Kaike Wan <kaike.wan@intel.com>
    Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/hw/hfi1/chip.c | 26 +++++++++++++++++++-------
    1 file changed, 19 insertions(+), 7 deletions(-)

    diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c
    index b443642eac02..0ae05e9249b3 100644
    --- a/drivers/infiniband/hw/hfi1/chip.c
    +++ b/drivers/infiniband/hw/hfi1/chip.c
    @@ -13219,7 +13219,7 @@ static int set_up_context_variables(struct hfi1_devdata *dd)
    int total_contexts;
    int ret;
    unsigned ngroups;
    - int qos_rmt_count;
    + int rmt_count;
    int user_rmt_reduced;
    u32 n_usr_ctxts;
    u32 send_contexts = chip_send_contexts(dd);
    @@ -13281,10 +13281,20 @@ static int set_up_context_variables(struct hfi1_devdata *dd)
    n_usr_ctxts = rcv_contexts - total_contexts;
    }

    - /* each user context requires an entry in the RMT */
    - qos_rmt_count = qos_rmt_entries(dd, NULL, NULL);
    - if (qos_rmt_count + n_usr_ctxts > NUM_MAP_ENTRIES) {
    - user_rmt_reduced = NUM_MAP_ENTRIES - qos_rmt_count;
    + /*
    + * The RMT entries are currently allocated as shown below:
    + * 1. QOS (0 to 128 entries);
    + * 2. FECN for PSM (num_user_contexts + num_vnic_contexts);
    + * 3. VNIC (num_vnic_contexts).
    + * It should be noted that PSM FECN oversubscribe num_vnic_contexts
    + * entries of RMT because both VNIC and PSM could allocate any receive
    + * context between dd->first_dyn_alloc_text and dd->num_rcv_contexts,
    + * and PSM FECN must reserve an RMT entry for each possible PSM receive
    + * context.
    + */
    + rmt_count = qos_rmt_entries(dd, NULL, NULL) + (num_vnic_contexts * 2);
    + if (rmt_count + n_usr_ctxts > NUM_MAP_ENTRIES) {
    + user_rmt_reduced = NUM_MAP_ENTRIES - rmt_count;
    dd_dev_err(dd,
    "RMT size is reducing the number of user receive contexts from %u to %d\n",
    n_usr_ctxts,
    @@ -14272,9 +14282,11 @@ static void init_user_fecn_handling(struct hfi1_devdata *dd,
    u64 reg;
    int i, idx, regoff, regidx;
    u8 offset;
    + u32 total_cnt;

    /* there needs to be enough room in the map table */
    - if (rmt->used + dd->num_user_contexts >= NUM_MAP_ENTRIES) {
    + total_cnt = dd->num_rcv_contexts - dd->first_dyn_alloc_ctxt;
    + if (rmt->used + total_cnt >= NUM_MAP_ENTRIES) {
    dd_dev_err(dd, "User FECN handling disabled - too many user contexts allocated\n");
    return;
    }
    @@ -14328,7 +14340,7 @@ static void init_user_fecn_handling(struct hfi1_devdata *dd,
    /* add rule 1 */
    add_rsm_rule(dd, RSM_INS_FECN, &rrd);

    - rmt->used += dd->num_user_contexts;
    + rmt->used += total_cnt;
    }

    /* Initialize RSM for VNIC */
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-04-27 03:55    [W:4.153 / U:25.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site