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

IB/hfi1: Move normal functions from hfi1_devdata to const array

The current implementation precludes having receive context specific
packet type receive handlers.

Fix this by adding adding c99 const array for the existing handlers and
remove the current 72 bytes of pointers from devdata.

A new pointer in hfi1_ctxtdata will point to the const array.
Reviewed-by: default avatarMichael J. Ruhl <michael.j.ruhl@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 avatarJason Gunthorpe <jgg@mellanox.com>
parent c59450c4
...@@ -757,7 +757,7 @@ static inline int process_rcv_packet(struct hfi1_packet *packet, int thread) ...@@ -757,7 +757,7 @@ static inline int process_rcv_packet(struct hfi1_packet *packet, int thread)
* crashing down. There is no need to eat another * crashing down. There is no need to eat another
* comparison in this performance critical code. * comparison in this performance critical code.
*/ */
packet->rcd->dd->rhf_rcv_function_map[packet->etype](packet); packet->rcd->rhf_rcv_function_map[packet->etype](packet);
packet->numpkt++; packet->numpkt++;
/* Set up for the next packet */ /* Set up for the next packet */
...@@ -1575,7 +1575,7 @@ void handle_eflags(struct hfi1_packet *packet) ...@@ -1575,7 +1575,7 @@ void handle_eflags(struct hfi1_packet *packet)
* The following functions are called by the interrupt handler. They are type * The following functions are called by the interrupt handler. They are type
* specific handlers for each packet type. * specific handlers for each packet type.
*/ */
int process_receive_ib(struct hfi1_packet *packet) static int process_receive_ib(struct hfi1_packet *packet)
{ {
if (hfi1_setup_9B_packet(packet)) if (hfi1_setup_9B_packet(packet))
return RHF_RCV_CONTINUE; return RHF_RCV_CONTINUE;
...@@ -1607,7 +1607,7 @@ static inline bool hfi1_is_vnic_packet(struct hfi1_packet *packet) ...@@ -1607,7 +1607,7 @@ static inline bool hfi1_is_vnic_packet(struct hfi1_packet *packet)
return false; return false;
} }
int process_receive_bypass(struct hfi1_packet *packet) static int process_receive_bypass(struct hfi1_packet *packet)
{ {
struct hfi1_devdata *dd = packet->rcd->dd; struct hfi1_devdata *dd = packet->rcd->dd;
...@@ -1649,7 +1649,7 @@ int process_receive_bypass(struct hfi1_packet *packet) ...@@ -1649,7 +1649,7 @@ int process_receive_bypass(struct hfi1_packet *packet)
return RHF_RCV_CONTINUE; return RHF_RCV_CONTINUE;
} }
int process_receive_error(struct hfi1_packet *packet) static int process_receive_error(struct hfi1_packet *packet)
{ {
/* KHdrHCRCErr -- KDETH packet with a bad HCRC */ /* KHdrHCRCErr -- KDETH packet with a bad HCRC */
if (unlikely( if (unlikely(
...@@ -1668,7 +1668,7 @@ int process_receive_error(struct hfi1_packet *packet) ...@@ -1668,7 +1668,7 @@ int process_receive_error(struct hfi1_packet *packet)
return RHF_RCV_CONTINUE; return RHF_RCV_CONTINUE;
} }
int kdeth_process_expected(struct hfi1_packet *packet) static int kdeth_process_expected(struct hfi1_packet *packet)
{ {
hfi1_setup_9B_packet(packet); hfi1_setup_9B_packet(packet);
if (unlikely(hfi1_dbg_should_fault_rx(packet))) if (unlikely(hfi1_dbg_should_fault_rx(packet)))
...@@ -1682,7 +1682,7 @@ int kdeth_process_expected(struct hfi1_packet *packet) ...@@ -1682,7 +1682,7 @@ int kdeth_process_expected(struct hfi1_packet *packet)
return RHF_RCV_CONTINUE; return RHF_RCV_CONTINUE;
} }
int kdeth_process_eager(struct hfi1_packet *packet) static int kdeth_process_eager(struct hfi1_packet *packet)
{ {
hfi1_setup_9B_packet(packet); hfi1_setup_9B_packet(packet);
if (unlikely(hfi1_dbg_should_fault_rx(packet))) if (unlikely(hfi1_dbg_should_fault_rx(packet)))
...@@ -1695,7 +1695,7 @@ int kdeth_process_eager(struct hfi1_packet *packet) ...@@ -1695,7 +1695,7 @@ int kdeth_process_eager(struct hfi1_packet *packet)
return RHF_RCV_CONTINUE; return RHF_RCV_CONTINUE;
} }
int process_receive_invalid(struct hfi1_packet *packet) static int process_receive_invalid(struct hfi1_packet *packet)
{ {
dd_dev_err(packet->rcd->dd, "Invalid packet type %d. Dropping\n", dd_dev_err(packet->rcd->dd, "Invalid packet type %d. Dropping\n",
rhf_rcv_type(packet->rhf)); rhf_rcv_type(packet->rhf));
...@@ -1760,3 +1760,14 @@ void seqfile_dump_rcd(struct seq_file *s, struct hfi1_ctxtdata *rcd) ...@@ -1760,3 +1760,14 @@ void seqfile_dump_rcd(struct seq_file *s, struct hfi1_ctxtdata *rcd)
update_ps_mdata(&mdata, rcd); update_ps_mdata(&mdata, rcd);
} }
} }
const rhf_rcv_function_ptr normal_rhf_rcv_functions[] = {
[RHF_RCV_TYPE_EXPECTED] = kdeth_process_expected,
[RHF_RCV_TYPE_EAGER] = kdeth_process_eager,
[RHF_RCV_TYPE_IB] = process_receive_ib,
[RHF_RCV_TYPE_ERROR] = process_receive_error,
[RHF_RCV_TYPE_BYPASS] = process_receive_bypass,
[RHF_RCV_TYPE_INVALID5] = process_receive_invalid,
[RHF_RCV_TYPE_INVALID6] = process_receive_invalid,
[RHF_RCV_TYPE_INVALID7] = process_receive_invalid,
};
...@@ -191,6 +191,7 @@ struct exp_tid_set { ...@@ -191,6 +191,7 @@ struct exp_tid_set {
u32 count; u32 count;
}; };
typedef int (*rhf_rcv_function_ptr)(struct hfi1_packet *packet);
struct hfi1_ctxtdata { struct hfi1_ctxtdata {
/* shadow the ctxt's RcvCtrl register */ /* shadow the ctxt's RcvCtrl register */
u64 rcvctrl; u64 rcvctrl;
...@@ -259,6 +260,8 @@ struct hfi1_ctxtdata { ...@@ -259,6 +260,8 @@ struct hfi1_ctxtdata {
char comm[TASK_COMM_LEN]; char comm[TASK_COMM_LEN];
/* so file ops can get at unit */ /* so file ops can get at unit */
struct hfi1_devdata *dd; struct hfi1_devdata *dd;
/* per context recv functions */
const rhf_rcv_function_ptr *rhf_rcv_function_map;
/* so functions that need physical port can get it easily */ /* so functions that need physical port can get it easily */
struct hfi1_pportdata *ppd; struct hfi1_pportdata *ppd;
/* associated msix interrupt */ /* associated msix interrupt */
...@@ -897,12 +900,11 @@ struct hfi1_pportdata { ...@@ -897,12 +900,11 @@ struct hfi1_pportdata {
u64 vl_xmit_flit_cnt[C_VL_COUNT + 1]; u64 vl_xmit_flit_cnt[C_VL_COUNT + 1];
}; };
typedef int (*rhf_rcv_function_ptr)(struct hfi1_packet *packet);
typedef void (*opcode_handler)(struct hfi1_packet *packet); typedef void (*opcode_handler)(struct hfi1_packet *packet);
typedef void (*hfi1_make_req)(struct rvt_qp *qp, typedef void (*hfi1_make_req)(struct rvt_qp *qp,
struct hfi1_pkt_state *ps, struct hfi1_pkt_state *ps,
struct rvt_swqe *wqe); struct rvt_swqe *wqe);
extern const rhf_rcv_function_ptr normal_rhf_rcv_functions[];
/* return values for the RHF receive functions */ /* return values for the RHF receive functions */
...@@ -1289,8 +1291,6 @@ struct hfi1_devdata { ...@@ -1289,8 +1291,6 @@ struct hfi1_devdata {
u64 sw_cce_err_status_aggregate; u64 sw_cce_err_status_aggregate;
/* Software counter that aggregates all bypass packet rcv errors */ /* Software counter that aggregates all bypass packet rcv errors */
u64 sw_rcv_bypass_packet_errors; u64 sw_rcv_bypass_packet_errors;
/* receive interrupt function */
rhf_rcv_function_ptr normal_rhf_rcv_functions[8];
/* Save the enabled LCB error bits */ /* Save the enabled LCB error bits */
u64 lcb_err_en; u64 lcb_err_en;
...@@ -1329,8 +1329,6 @@ struct hfi1_devdata { ...@@ -1329,8 +1329,6 @@ struct hfi1_devdata {
/* seqlock for sc2vl */ /* seqlock for sc2vl */
seqlock_t sc2vl_lock ____cacheline_aligned_in_smp; seqlock_t sc2vl_lock ____cacheline_aligned_in_smp;
u64 sc2vl[4]; u64 sc2vl[4];
/* receive interrupt functions */
rhf_rcv_function_ptr *rhf_rcv_function_map;
u64 __percpu *rcv_limit; u64 __percpu *rcv_limit;
u16 rhf_offset; /* offset of RHF within receive header entry */ u16 rhf_offset; /* offset of RHF within receive header entry */
/* adding a new field here would make it part of this cacheline */ /* adding a new field here would make it part of this cacheline */
...@@ -2021,12 +2019,6 @@ static inline void flush_wc(void) ...@@ -2021,12 +2019,6 @@ static inline void flush_wc(void)
} }
void handle_eflags(struct hfi1_packet *packet); void handle_eflags(struct hfi1_packet *packet);
int process_receive_ib(struct hfi1_packet *packet);
int process_receive_bypass(struct hfi1_packet *packet);
int process_receive_error(struct hfi1_packet *packet);
int kdeth_process_expected(struct hfi1_packet *packet);
int kdeth_process_eager(struct hfi1_packet *packet);
int process_receive_invalid(struct hfi1_packet *packet);
void seqfile_dump_rcd(struct seq_file *s, struct hfi1_ctxtdata *rcd); void seqfile_dump_rcd(struct seq_file *s, struct hfi1_ctxtdata *rcd);
/* global module parameter variables */ /* global module parameter variables */
......
...@@ -367,6 +367,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa, ...@@ -367,6 +367,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
__set_bit(0, rcd->in_use_ctxts); __set_bit(0, rcd->in_use_ctxts);
rcd->numa_id = numa; rcd->numa_id = numa;
rcd->rcv_array_groups = dd->rcv_entries.ngroups; rcd->rcv_array_groups = dd->rcv_entries.ngroups;
rcd->rhf_rcv_function_map = normal_rhf_rcv_functions;
mutex_init(&rcd->exp_mutex); mutex_init(&rcd->exp_mutex);
...@@ -853,24 +854,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit) ...@@ -853,24 +854,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)
struct hfi1_ctxtdata *rcd; struct hfi1_ctxtdata *rcd;
struct hfi1_pportdata *ppd; struct hfi1_pportdata *ppd;
/* Set up recv low level handlers */
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_EXPECTED] =
kdeth_process_expected;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_EAGER] =
kdeth_process_eager;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_IB] = process_receive_ib;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_ERROR] =
process_receive_error;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_BYPASS] =
process_receive_bypass;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_INVALID5] =
process_receive_invalid;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_INVALID6] =
process_receive_invalid;
dd->normal_rhf_rcv_functions[RHF_RCV_TYPE_INVALID7] =
process_receive_invalid;
dd->rhf_rcv_function_map = dd->normal_rhf_rcv_functions;
/* Set up send low level handlers */ /* Set up send low level handlers */
dd->process_pio_send = hfi1_verbs_send_pio; dd->process_pio_send = hfi1_verbs_send_pio;
dd->process_dma_send = hfi1_verbs_send_dma; dd->process_dma_send = hfi1_verbs_send_dma;
......
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