staging/rdma/hfi1: Reduce number of parameters passed to send handlers
authorDennis Dalessandro <dennis.dalessandro@intel.com>
Wed, 11 Nov 2015 05:34:37 +0000 (00:34 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 20 Nov 2015 01:06:47 +0000 (17:06 -0800)
The current send function handlers are passed a bunch of parameters that are
already part of the data structure that is passed in first (qp). This patch
removes all of this and just passes the QP.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rdma/hfi1/diag.c
drivers/staging/rdma/hfi1/hfi.h
drivers/staging/rdma/hfi1/ruc.c
drivers/staging/rdma/hfi1/verbs.c
drivers/staging/rdma/hfi1/verbs.h

index 88414d7..0aaad74 100644 (file)
@@ -1618,14 +1618,12 @@ int snoop_recv_handler(struct hfi1_packet *packet)
 /*
  * Handle snooping and capturing packets when sdma is being used.
  */
-int snoop_send_dma_handler(struct hfi1_qp *qp, struct ahg_ib_header *ibhdr,
-                          u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                          u32 plen, u32 dwords, u64 pbc)
+int snoop_send_dma_handler(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                          u64 pbc)
 {
-       pr_alert("Snooping/Capture of  Send DMA Packets Is Not Supported!\n");
+       pr_alert("Snooping/Capture of Send DMA Packets Is Not Supported!\n");
        snoop_dbg("Unsupported Operation");
-       return hfi1_verbs_send_dma(qp, ibhdr, hdrwords, ss, len, plen, dwords,
-                                 0);
+       return hfi1_verbs_send_dma(qp, ps, 0);
 }
 
 /*
@@ -1633,12 +1631,16 @@ int snoop_send_dma_handler(struct hfi1_qp *qp, struct ahg_ib_header *ibhdr,
  * bypass packets. The only way to send a bypass packet currently is to use the
  * diagpkt interface. When that interface is enable snoop/capture is not.
  */
-int snoop_send_pio_handler(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
-                          u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                          u32 plen, u32 dwords, u64 pbc)
+int snoop_send_pio_handler(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                          u64 pbc)
 {
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
-       struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
+       struct ahg_ib_header *ahdr = qp->s_hdr;
+       u32 hdrwords = qp->s_hdrwords;
+       struct hfi1_sge_state *ss = qp->s_cur_sge;
+       u32 len = qp->s_cur_size;
+       u32 dwords = (len + 3) >> 2;
+       u32 plen = hdrwords + dwords + 2; /* includes pbc */
+       struct hfi1_pportdata *ppd = ps->ppd;
        struct snoop_packet *s_packet = NULL;
        u32 *hdr = (u32 *)&ahdr->ibh;
        u32 length = 0;
@@ -1783,8 +1785,7 @@ int snoop_send_pio_handler(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
                break;
        }
 out:
-       return hfi1_verbs_send_pio(qp, ahdr, hdrwords, ss, len, plen, dwords,
-                                 md.u.pbc);
+       return hfi1_verbs_send_pio(qp, ps, md.u.pbc);
 }
 
 /*
index 1fd1241..b048cf6 100644 (file)
@@ -1048,12 +1048,10 @@ struct hfi1_devdata {
         * Handlers for outgoing data so that snoop/capture does not
         * have to have its hooks in the send path
         */
-       int (*process_pio_send)(struct hfi1_qp *qp, struct ahg_ib_header *ibhdr,
-                               u32 hdrwords, struct hfi1_sge_state *ss,
-                               u32 len, u32 plen, u32 dwords, u64 pbc);
-       int (*process_dma_send)(struct hfi1_qp *qp, struct ahg_ib_header *ibhdr,
-                               u32 hdrwords, struct hfi1_sge_state *ss,
-                               u32 len, u32 plen, u32 dwords, u64 pbc);
+       int (*process_pio_send)(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                               u64 pbc);
+       int (*process_dma_send)(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                               u64 pbc);
        void (*pio_inline_send)(struct hfi1_devdata *dd, struct pio_buf *pbuf,
                                u64 pbc, const void *from, size_t count);
 
@@ -1405,12 +1403,10 @@ void reset_link_credits(struct hfi1_devdata *dd);
 void assign_remote_cm_au_table(struct hfi1_devdata *dd, u8 vcu);
 
 int snoop_recv_handler(struct hfi1_packet *packet);
-int snoop_send_dma_handler(struct hfi1_qp *qp, struct ahg_ib_header *ibhdr,
-                          u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                          u32 plen, u32 dwords, u64 pbc);
-int snoop_send_pio_handler(struct hfi1_qp *qp, struct ahg_ib_header *ibhdr,
-                          u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                          u32 plen, u32 dwords, u64 pbc);
+int snoop_send_dma_handler(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                          u64 pbc);
+int snoop_send_pio_handler(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                          u64 pbc);
 void snoop_inline_pio_send(struct hfi1_devdata *dd, struct pio_buf *pbuf,
                           u64 pbc, const void *from, size_t count);
 
index 863092b..317bf6f 100644 (file)
@@ -809,16 +809,20 @@ void hfi1_do_send(struct work_struct *work)
 {
        struct iowait *wait = container_of(work, struct iowait, iowork);
        struct hfi1_qp *qp = container_of(wait, struct hfi1_qp, s_iowait);
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
-       struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
+       struct hfi1_pkt_state ps;
        int (*make_req)(struct hfi1_qp *qp);
        unsigned long flags;
        unsigned long timeout;
 
+       ps.dev = to_idev(qp->ibqp.device);
+       ps.ibp = to_iport(qp->ibqp.device, qp->port_num);
+       ps.ppd = ppd_from_ibp(ps.ibp);
+
        if ((qp->ibqp.qp_type == IB_QPT_RC ||
             qp->ibqp.qp_type == IB_QPT_UC) &&
            !loopback &&
-           (qp->remote_ah_attr.dlid & ~((1 << ppd->lmc) - 1)) == ppd->lid) {
+           (qp->remote_ah_attr.dlid & ~((1 << ps.ppd->lmc) - 1)) ==
+           ps.ppd->lid) {
                ruc_loopback(qp);
                return;
        }
@@ -850,8 +854,7 @@ void hfi1_do_send(struct work_struct *work)
                         * If the packet cannot be sent now, return and
                         * the send tasklet will be woken up later.
                         */
-                       if (hfi1_verbs_send(qp, qp->s_hdr, qp->s_hdrwords,
-                                           qp->s_cur_sge, qp->s_cur_size))
+                       if (hfi1_verbs_send(qp, &ps))
                                break;
                        /* Record that s_hdr is empty. */
                        qp->s_hdrwords = 0;
@@ -860,7 +863,7 @@ void hfi1_do_send(struct work_struct *work)
                /* allow other tasks to run */
                if (unlikely(time_after(jiffies, timeout))) {
                        cond_resched();
-                       ppd->dd->verbs_dev.n_send_schedule++;
+                       ps.ppd->dd->verbs_dev.n_send_schedule++;
                        timeout = jiffies + SEND_RESCHED_TIMEOUT;
                }
        } while (make_req(qp));
index 296b7cb..ef0feaa 100644 (file)
@@ -1001,13 +1001,16 @@ bail_txadd:
        return ret;
 }
 
-int hfi1_verbs_send_dma(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
-                       u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                       u32 plen, u32 dwords, u64 pbc)
+int hfi1_verbs_send_dma(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                       u64 pbc)
 {
-       struct hfi1_ibdev *dev = to_idev(qp->ibqp.device);
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
-       struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
+       struct ahg_ib_header *ahdr = qp->s_hdr;
+       u32 hdrwords = qp->s_hdrwords;
+       struct hfi1_sge_state *ss = qp->s_cur_sge;
+       u32 len = qp->s_cur_size;
+       u32 plen = hdrwords + ((len + 3) >> 2) + 2; /* includes pbc */
+       struct hfi1_ibdev *dev = ps->dev;
+       struct hfi1_pportdata *ppd = ps->ppd;
        struct verbs_txreq *tx;
        struct sdma_txreq *stx;
        u64 pbc_flags = 0;
@@ -1120,12 +1123,16 @@ struct send_context *qp_to_send_context(struct hfi1_qp *qp, u8 sc5)
        return dd->vld[vl].sc;
 }
 
-int hfi1_verbs_send_pio(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
-                       u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                       u32 plen, u32 dwords, u64 pbc)
+int hfi1_verbs_send_pio(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                       u64 pbc)
 {
-       struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num);
-       struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
+       struct ahg_ib_header *ahdr = qp->s_hdr;
+       u32 hdrwords = qp->s_hdrwords;
+       struct hfi1_sge_state *ss = qp->s_cur_sge;
+       u32 len = qp->s_cur_size;
+       u32 dwords = (len + 3) >> 2;
+       u32 plen = hdrwords + dwords + 2; /* includes pbc */
+       struct hfi1_pportdata *ppd = ps->ppd;
        u32 *hdr = (u32 *)&ahdr->ibh;
        u64 pbc_flags = 0;
        u32 sc5;
@@ -1297,23 +1304,18 @@ bad:
 /**
  * hfi1_verbs_send - send a packet
  * @qp: the QP to send on
- * @ahdr: the packet header
- * @hdrwords: the number of 32-bit words in the header
- * @ss: the SGE to send
- * @len: the length of the packet in bytes
+ * @ps: the state of the packet to send
  *
  * Return zero if packet is sent or queued OK.
  * Return non-zero and clear qp->s_flags HFI1_S_BUSY otherwise.
  */
-int hfi1_verbs_send(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
-                   u32 hdrwords, struct hfi1_sge_state *ss, u32 len)
+int hfi1_verbs_send(struct hfi1_qp *qp, struct hfi1_pkt_state *ps)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(qp->ibqp.device);
-       u32 plen;
+       struct ahg_ib_header *ahdr = qp->s_hdr;
        int ret;
        int pio = 0;
        unsigned long flags = 0;
-       u32 dwords = (len + 3) >> 2;
 
        /*
         * VL15 packets (IB_QPT_SMI) will always use PIO, so we
@@ -1344,23 +1346,16 @@ int hfi1_verbs_send(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
                return -EINVAL;
        }
 
-       /*
-        * Calculate the send buffer trigger address.
-        * The +2 counts for the pbc control qword
-        */
-       plen = hdrwords + dwords + 2;
-
        if (pio) {
-               ret = dd->process_pio_send(
-                       qp, ahdr, hdrwords, ss, len, plen, dwords, 0);
+               ret = dd->process_pio_send(qp, ps, 0);
        } else {
 #ifdef CONFIG_SDMA_VERBOSITY
                dd_dev_err(dd, "CONFIG SDMA %s:%d %s()\n",
                           slashstrip(__FILE__), __LINE__, __func__);
-               dd_dev_err(dd, "SDMA hdrwords = %u, len = %u\n", hdrwords, len);
+               dd_dev_err(dd, "SDMA hdrwords = %u, len = %u\n", qp->s_hdrwords,
+                          qp->s_cur_size);
 #endif
-               ret = dd->process_dma_send(
-                       qp, ahdr, hdrwords, ss, len, plen, dwords, 0);
+               ret = dd->process_dma_send(qp, ps, 0);
        }
 
        return ret;
index cdc844f..7e27531 100644 (file)
@@ -546,6 +546,16 @@ struct hfi1_qp {
 };
 
 /*
+ * This structure is used to hold commonly lookedup and computed values during
+ * the send engine progress.
+ */
+struct hfi1_pkt_state {
+       struct hfi1_ibdev *dev;
+       struct hfi1_ibport *ibp;
+       struct hfi1_pportdata *ppd;
+};
+
+/*
  * Atomic bit definitions for r_aflags.
  */
 #define HFI1_R_WRID_VALID        0
@@ -930,8 +940,7 @@ int hfi1_mcast_tree_empty(struct hfi1_ibport *ibp);
 struct verbs_txreq;
 void hfi1_put_txreq(struct verbs_txreq *tx);
 
-int hfi1_verbs_send(struct hfi1_qp *qp, struct ahg_ib_header *ahdr,
-                   u32 hdrwords, struct hfi1_sge_state *ss, u32 len);
+int hfi1_verbs_send(struct hfi1_qp *qp, struct hfi1_pkt_state *ps);
 
 void hfi1_copy_sge(struct hfi1_sge_state *ss, void *data, u32 length,
                   int release);
@@ -1102,13 +1111,11 @@ void hfi1_ib_rcv(struct hfi1_packet *packet);
 
 unsigned hfi1_get_npkeys(struct hfi1_devdata *);
 
-int hfi1_verbs_send_dma(struct hfi1_qp *qp, struct ahg_ib_header *hdr,
-                       u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                       u32 plen, u32 dwords, u64 pbc);
+int hfi1_verbs_send_dma(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                       u64 pbc);
 
-int hfi1_verbs_send_pio(struct hfi1_qp *qp, struct ahg_ib_header *hdr,
-                       u32 hdrwords, struct hfi1_sge_state *ss, u32 len,
-                       u32 plen, u32 dwords, u64 pbc);
+int hfi1_verbs_send_pio(struct hfi1_qp *qp, struct hfi1_pkt_state *ps,
+                       u64 pbc);
 
 struct send_context *qp_to_send_context(struct hfi1_qp *qp, u8 sc5);