linux/drivers/infiniband/hw/hfi1/exp_rcv.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause
   2/*
   3 * Copyright(c) 2017 Intel Corporation.
   4 */
   5
   6#include "exp_rcv.h"
   7#include "trace.h"
   8
   9/**
  10 * hfi1_exp_tid_set_init - initialize exp_tid_set
  11 * @set: the set
  12 */
  13static void hfi1_exp_tid_set_init(struct exp_tid_set *set)
  14{
  15        INIT_LIST_HEAD(&set->list);
  16        set->count = 0;
  17}
  18
  19/**
  20 * hfi1_exp_tid_group_init - initialize rcd expected receive
  21 * @rcd: the rcd
  22 */
  23void hfi1_exp_tid_group_init(struct hfi1_ctxtdata *rcd)
  24{
  25        hfi1_exp_tid_set_init(&rcd->tid_group_list);
  26        hfi1_exp_tid_set_init(&rcd->tid_used_list);
  27        hfi1_exp_tid_set_init(&rcd->tid_full_list);
  28}
  29
  30/**
  31 * hfi1_alloc_ctxt_rcv_groups - initialize expected receive groups
  32 * @rcd: the context to add the groupings to
  33 */
  34int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
  35{
  36        struct hfi1_devdata *dd = rcd->dd;
  37        u32 tidbase;
  38        struct tid_group *grp;
  39        int i;
  40        u32 ngroups;
  41
  42        ngroups = rcd->expected_count / dd->rcv_entries.group_size;
  43        rcd->groups =
  44                kcalloc_node(ngroups, sizeof(*rcd->groups),
  45                             GFP_KERNEL, rcd->numa_id);
  46        if (!rcd->groups)
  47                return -ENOMEM;
  48        tidbase = rcd->expected_base;
  49        for (i = 0; i < ngroups; i++) {
  50                grp = &rcd->groups[i];
  51                grp->size = dd->rcv_entries.group_size;
  52                grp->base = tidbase;
  53                tid_group_add_tail(grp, &rcd->tid_group_list);
  54                tidbase += dd->rcv_entries.group_size;
  55        }
  56
  57        return 0;
  58}
  59
  60/**
  61 * hfi1_free_ctxt_rcv_groups - free  expected receive groups
  62 * @rcd: the context to free
  63 *
  64 * The routine dismantles the expect receive linked
  65 * list and clears any tids associated with the receive
  66 * context.
  67 *
  68 * This should only be called for kernel contexts and the
  69 * a base user context.
  70 */
  71void hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
  72{
  73        kfree(rcd->groups);
  74        rcd->groups = NULL;
  75        hfi1_exp_tid_group_init(rcd);
  76
  77        hfi1_clear_tids(rcd);
  78}
  79