79 lines · c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause2/*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_set11 * @set: the set12 */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 receive21 * @rcd: the rcd22 */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 groups32 * @rcd: the context to add the groupings to33 */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 groups62 * @rcd: the context to free63 *64 * The routine dismantles the expect receive linked65 * list and clears any tids associated with the receive66 * context.67 *68 * This should only be called for kernel contexts and the69 * 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