]> git.ipfire.org Git - people/ms/linux.git/commitdiff
IB/hfi1: Move normal functions from hfi1_devdata to const array
authorMike Marciniszyn <mike.marciniszyn@intel.com>
Mon, 4 Jun 2018 18:43:29 +0000 (11:43 -0700)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 19 Jun 2018 17:49:45 +0000 (11:49 -0600)
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: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/init.c

index 94dca95db04f405cc528e402705473fc66f99e1c..a77aec4431cd2d9ea67eb43a90505b8628004b16 100644 (file)
@@ -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
         * 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++;
 
        /* Set up for the next packet */
@@ -1575,7 +1575,7 @@ void handle_eflags(struct hfi1_packet *packet)
  * The following functions are called by the interrupt handler. They are 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))
                return RHF_RCV_CONTINUE;
@@ -1607,7 +1607,7 @@ static inline bool hfi1_is_vnic_packet(struct hfi1_packet *packet)
        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;
 
@@ -1649,7 +1649,7 @@ int process_receive_bypass(struct hfi1_packet *packet)
        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 */
        if (unlikely(
@@ -1668,7 +1668,7 @@ int process_receive_error(struct hfi1_packet *packet)
        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);
        if (unlikely(hfi1_dbg_should_fault_rx(packet)))
@@ -1682,7 +1682,7 @@ int kdeth_process_expected(struct hfi1_packet *packet)
        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);
        if (unlikely(hfi1_dbg_should_fault_rx(packet)))
@@ -1695,7 +1695,7 @@ int kdeth_process_eager(struct hfi1_packet *packet)
        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",
                   rhf_rcv_type(packet->rhf));
@@ -1760,3 +1760,14 @@ next:
                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,
+};
index 4ab8b5bfbed131a18c55713e790a08c9e6f16ec3..b0a44222863c4ac2f6312a2d7c1eac2adfffc83c 100644 (file)
@@ -191,6 +191,7 @@ struct exp_tid_set {
        u32 count;
 };
 
+typedef int (*rhf_rcv_function_ptr)(struct hfi1_packet *packet);
 struct hfi1_ctxtdata {
        /* shadow the ctxt's RcvCtrl register */
        u64 rcvctrl;
@@ -259,6 +260,8 @@ struct hfi1_ctxtdata {
        char comm[TASK_COMM_LEN];
        /* so file ops can get at unit */
        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 */
        struct hfi1_pportdata *ppd;
        /* associated msix interrupt */
@@ -897,12 +900,11 @@ struct hfi1_pportdata {
        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 (*hfi1_make_req)(struct rvt_qp *qp,
                              struct hfi1_pkt_state *ps,
                              struct rvt_swqe *wqe);
+extern const rhf_rcv_function_ptr normal_rhf_rcv_functions[];
 
 
 /* return values for the RHF receive functions */
@@ -1289,8 +1291,6 @@ struct hfi1_devdata {
        u64 sw_cce_err_status_aggregate;
        /* Software counter that aggregates all bypass packet rcv 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 */
        u64 lcb_err_en;
@@ -1329,8 +1329,6 @@ struct hfi1_devdata {
        /* seqlock for sc2vl */
        seqlock_t sc2vl_lock ____cacheline_aligned_in_smp;
        u64 sc2vl[4];
-       /* receive interrupt functions */
-       rhf_rcv_function_ptr *rhf_rcv_function_map;
        u64 __percpu *rcv_limit;
        u16 rhf_offset; /* offset of RHF within receive header entry */
        /* adding a new field here would make it part of this cacheline */
@@ -2021,12 +2019,6 @@ static inline void flush_wc(void)
 }
 
 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);
 
 /* global module parameter variables */
index f110842b91f56ba4a95f786df282b1d11cf41be8..0c45924a1e21854aafcc612c3f4458a546e1d977 100644 (file)
@@ -367,6 +367,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
                __set_bit(0, rcd->in_use_ctxts);
                rcd->numa_id = numa;
                rcd->rcv_array_groups = dd->rcv_entries.ngroups;
+               rcd->rhf_rcv_function_map = normal_rhf_rcv_functions;
 
                mutex_init(&rcd->exp_mutex);
 
@@ -853,24 +854,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)
        struct hfi1_ctxtdata *rcd;
        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 */
        dd->process_pio_send = hfi1_verbs_send_pio;
        dd->process_dma_send = hfi1_verbs_send_dma;