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 */ 13 static 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 */ 23 void 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 */ 34 int 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 */ 71 void 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