Commit c8314811 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Jason Gunthorpe

IB/hfi1: Cleanup of exp_rcv

The knowledge of the internal workings of the expect receive
is too distributed.

Fix by:
- right size several rcd fields associated with
  expect receive
- making an init entrance to init all the lists
- consolidate all the allocations into an array anchored
  in the rcd
Reviewed-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
Reviewed-by: default avatarKaike Wan <kaike.wan@intel.com>
Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 43a68c35
...@@ -52,12 +52,23 @@ ...@@ -52,12 +52,23 @@
* exp_tid_group_init - initialize exp_tid_set * exp_tid_group_init - initialize exp_tid_set
* @set - the 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); INIT_LIST_HEAD(&set->list);
set->count = 0; 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 * alloc_ctxt_rcv_groups - initialize expected receive groups
* @rcd - the context to add the groupings to * @rcd - the context to add the groupings to
...@@ -68,13 +79,17 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) ...@@ -68,13 +79,17 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
u32 tidbase; u32 tidbase;
struct tid_group *grp; struct tid_group *grp;
int i; 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; tidbase = rcd->expected_base;
for (i = 0; i < rcd->expected_count / for (i = 0; i < ngroups; i++) {
dd->rcv_entries.group_size; i++) { grp = &rcd->groups[i];
grp = kzalloc(sizeof(*grp), GFP_KERNEL);
if (!grp)
goto bail;
grp->size = dd->rcv_entries.group_size; grp->size = dd->rcv_entries.group_size;
grp->base = tidbase; grp->base = tidbase;
tid_group_add_tail(grp, &rcd->tid_group_list); tid_group_add_tail(grp, &rcd->tid_group_list);
...@@ -82,9 +97,6 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) ...@@ -82,9 +97,6 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
} }
return 0; return 0;
bail:
hfi1_free_ctxt_rcv_groups(rcd);
return -ENOMEM;
} }
/** /**
...@@ -100,15 +112,12 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) ...@@ -100,15 +112,12 @@ int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd)
*/ */
void hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) 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_full_list));
WARN_ON(!EXP_TID_SET_EMPTY(rcd->tid_used_list)); WARN_ON(!EXP_TID_SET_EMPTY(rcd->tid_used_list));
list_for_each_entry_safe(grp, gptr, &rcd->tid_group_list.list, list) { kfree(rcd->groups);
tid_group_remove(grp, &rcd->tid_group_list); rcd->groups = NULL;
kfree(grp); hfi1_exp_tid_group_init(rcd);
}
hfi1_clear_tids(rcd); hfi1_clear_tids(rcd);
} }
...@@ -183,8 +183,30 @@ static inline u32 rcventry2tidinfo(u32 rcventry) ...@@ -183,8 +183,30 @@ static inline u32 rcventry2tidinfo(u32 rcventry)
EXP_TID_SET(CTRL, 1 << (rcventry - pair)); EXP_TID_SET(CTRL, 1 << (rcventry - pair));
} }
/**
* hfi1_tid_group_to_idx - convert an index to a group
* @rcd - the receive context
* @grp - the group pointer
*/
static inline u16
hfi1_tid_group_to_idx(struct hfi1_ctxtdata *rcd, struct tid_group *grp)
{
return grp - &rcd->groups[0];
}
/**
* hfi1_idx_to_tid_group - convert a group to an index
* @rcd - the receive context
* @idx - the index
*/
static inline struct tid_group *
hfi1_idx_to_tid_group(struct hfi1_ctxtdata *rcd, u16 idx)
{
return &rcd->groups[idx];
}
int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd); int hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd);
void hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd); void hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd);
void hfi1_exp_tid_group_init(struct exp_tid_set *set); void hfi1_exp_tid_group_init(struct hfi1_ctxtdata *rcd);
#endif /* _HFI1_EXP_RCV_H */ #endif /* _HFI1_EXP_RCV_H */
...@@ -231,13 +231,15 @@ struct hfi1_ctxtdata { ...@@ -231,13 +231,15 @@ struct hfi1_ctxtdata {
/* job key */ /* job key */
u16 jkey; u16 jkey;
/* number of RcvArray groups for this context. */ /* number of RcvArray groups for this context. */
u32 rcv_array_groups; u16 rcv_array_groups;
/* index of first eager TID entry. */ /* index of first eager TID entry. */
u32 eager_base; u16 eager_base;
/* number of expected TID entries */ /* number of expected TID entries */
u32 expected_count; u16 expected_count;
/* index of first expected TID entry. */ /* index of first expected TID entry. */
u32 expected_base; u16 expected_base;
/* array of tid_groups */
struct tid_group *groups;
struct exp_tid_set tid_group_list; struct exp_tid_set tid_group_list;
struct exp_tid_set tid_used_list; struct exp_tid_set tid_used_list;
...@@ -282,7 +284,7 @@ struct hfi1_ctxtdata { ...@@ -282,7 +284,7 @@ struct hfi1_ctxtdata {
/* interrupt handling */ /* interrupt handling */
u64 imask; /* clear interrupt mask */ u64 imask; /* clear interrupt mask */
int ireg; /* clear interrupt register */ int ireg; /* clear interrupt register */
unsigned numa_id; /* numa node of this context */ int numa_id; /* numa node of this context */
/* verbs rx_stats per rcd */ /* verbs rx_stats per rcd */
struct hfi1_opcode_stats_perctx *opstats; struct hfi1_opcode_stats_perctx *opstats;
...@@ -909,9 +911,9 @@ typedef void (*hfi1_make_req)(struct rvt_qp *qp, ...@@ -909,9 +911,9 @@ typedef void (*hfi1_make_req)(struct rvt_qp *qp,
#define RHF_RCV_REPROCESS 2 /* stop. retain this packet */ #define RHF_RCV_REPROCESS 2 /* stop. retain this packet */
struct rcv_array_data { struct rcv_array_data {
u8 group_size;
u16 ngroups; u16 ngroups;
u16 nctxt_extra; u16 nctxt_extra;
u8 group_size;
}; };
struct per_vl_data { struct per_vl_data {
......
...@@ -361,9 +361,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa, ...@@ -361,9 +361,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
} }
INIT_LIST_HEAD(&rcd->qp_wait_list); INIT_LIST_HEAD(&rcd->qp_wait_list);
hfi1_exp_tid_group_init(&rcd->tid_group_list); hfi1_exp_tid_group_init(rcd);
hfi1_exp_tid_group_init(&rcd->tid_used_list);
hfi1_exp_tid_group_init(&rcd->tid_full_list);
rcd->ppd = ppd; rcd->ppd = ppd;
rcd->dd = dd; rcd->dd = dd;
__set_bit(0, rcd->in_use_ctxts); __set_bit(0, rcd->in_use_ctxts);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment