|
@@ -52,12 +52,23 @@
|
|
|
* exp_tid_group_init - initialize exp_tid_set
|
|
|
* @set - the set
|
|
|
*/
|
|
|
-void hfi1_exp_tid_group_init(struct exp_tid_set *set)
|
|
|
+static void hfi1_exp_tid_set_init(struct exp_tid_set *set)
|
|
|
{
|
|
|
INIT_LIST_HEAD(&set->list);
|
|
|
set->count = 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * hfi1_exp_tid_group_init - initialize rcd expected receive
|
|
|
+ * @rcd - the rcd
|
|
|
+ */
|
|
|
+void hfi1_exp_tid_group_init(struct hfi1_ctxtdata *rcd)
|
|
|
+{
|
|
|
+ hfi1_exp_tid_set_init(&rcd->tid_group_list);
|
|
|
+ hfi1_exp_tid_set_init(&rcd->tid_used_list);
|
|
|
+ hfi1_exp_tid_set_init(&rcd->tid_full_list);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* alloc_ctxt_rcv_groups - initialize expected receive groups
|
|
|
* @rcd - the context to add the groupings to
|
|
@@ -68,13 +79,17 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
|
|
|
u32 tidbase;
|
|
|
struct tid_group *grp;
|
|
|
int i;
|
|
|
+ u32 ngroups;
|
|
|
|
|
|
+ ngroups = rcd->expected_count / dd->rcv_entries.group_size;
|
|
|
+ rcd->groups =
|
|
|
+ kcalloc_node(ngroups, sizeof(*rcd->groups),
|
|
|
+ GFP_KERNEL, rcd->numa_id);
|
|
|
+ if (!rcd->groups)
|
|
|
+ return -ENOMEM;
|
|
|
tidbase = rcd->expected_base;
|
|
|
- for (i = 0; i < rcd->expected_count /
|
|
|
- dd->rcv_entries.group_size; i++) {
|
|
|
- grp = kzalloc(sizeof(*grp), GFP_KERNEL);
|
|
|
- if (!grp)
|
|
|
- goto bail;
|
|
|
+ for (i = 0; i < ngroups; i++) {
|
|
|
+ grp = &rcd->groups[i];
|
|
|
grp->size = dd->rcv_entries.group_size;
|
|
|
grp->base = tidbase;
|
|
|
tid_group_add_tail(grp, &rcd->tid_group_list);
|
|
@@ -82,9 +97,6 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
-bail:
|
|
|
- hfi1_free_ctxt_rcv_groups(rcd);
|
|
|
- return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -100,15 +112,12 @@ bail:
|
|
|
*/
|
|
|
void hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
|
|
|
{
|
|
|
- struct tid_group *grp, *gptr;
|
|
|
-
|
|
|
WARN_ON(!EXP_TID_SET_EMPTY(rcd->tid_full_list));
|
|
|
WARN_ON(!EXP_TID_SET_EMPTY(rcd->tid_used_list));
|
|
|
|
|
|
- list_for_each_entry_safe(grp, gptr, &rcd->tid_group_list.list, list) {
|
|
|
- tid_group_remove(grp, &rcd->tid_group_list);
|
|
|
- kfree(grp);
|
|
|
- }
|
|
|
+ kfree(rcd->groups);
|
|
|
+ rcd->groups = NULL;
|
|
|
+ hfi1_exp_tid_group_init(rcd);
|
|
|
|
|
|
hfi1_clear_tids(rcd);
|
|
|
}
|