IB/rdmavt: Add post send and recv stubs
authorDennis Dalessandro <dennis.dalessandro@intel.com>
Wed, 6 Jan 2016 18:01:17 +0000 (10:01 -0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 11 Mar 2016 01:37:10 +0000 (20:37 -0500)
This adds the post sned and recv function stubs.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/sw/rdmavt/qp.c
drivers/infiniband/sw/rdmavt/qp.h
drivers/infiniband/sw/rdmavt/vt.c

index a59f28d1614307e627bcbfcec775cf2fd950c7c0..23a5f686e211515c20416a1c558a8d87df0fbcd5 100644 (file)
@@ -118,3 +118,65 @@ int rvt_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 {
        return -EOPNOTSUPP;
 }
+
+/**
+ * rvt_post_receive - post a receive on a QP
+ * @ibqp: the QP to post the receive on
+ * @wr: the WR to post
+ * @bad_wr: the first bad WR is put here
+ *
+ * This may be called from interrupt context.
+ */
+int rvt_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
+                 struct ib_recv_wr **bad_wr)
+{
+       /*
+        * When a packet arrives the driver needs to call up to rvt to process
+        * the packet. The UD, RC, UC processing will be done in rvt, however
+        * the driver should be able to override this if it so choses. Perhaps a
+        * set of function pointers set up at registration time.
+        */
+
+       return -EOPNOTSUPP;
+}
+
+/**
+ * rvt_post_send - post a send on a QP
+ * @ibqp: the QP to post the send on
+ * @wr: the list of work requests to post
+ * @bad_wr: the first bad WR is put here
+ *
+ * This may be called from interrupt context.
+ */
+int rvt_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
+                 struct ib_send_wr **bad_wr)
+{
+       /*
+        * VT-DRIVER-API: do_send()
+        * Driver needs to have a do_send() call which is a single entry point
+        * to take an already formed packet and throw it out on the wire. Once
+        * the packet is sent the driver needs to make an upcall to rvt so the
+        * completion queue can be notified and/or any other outstanding
+        * work/book keeping can be finished.
+        *
+        * Note that there should also be a way for rvt to protect itself
+        * against hangs in the driver layer. If a send doesn't actually
+        * complete in a timely manor rvt needs to return an error event.
+        */
+
+       return -EOPNOTSUPP;
+}
+
+/**
+ * rvt_post_srq_receive - post a receive on a shared receive queue
+ * @ibsrq: the SRQ to post the receive on
+ * @wr: the list of work requests to post
+ * @bad_wr: A pointer to the first WR to cause a problem is put here
+ *
+ * This may be called from interrupt context.
+ */
+int rvt_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
+                     struct ib_recv_wr **bad_wr)
+{
+       return -EOPNOTSUPP;
+}
index 43acba0ebf5d6ffc78eb1cc592d4002af0946122..10bc636d04230ed293369e769aa9c4b22c5750ab 100644 (file)
@@ -63,5 +63,10 @@ int rvt_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 int rvt_destroy_qp(struct ib_qp *ibqp);
 int rvt_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
                 int attr_mask, struct ib_qp_init_attr *init_attr);
-
+int rvt_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
+                 struct ib_recv_wr **bad_wr);
+int rvt_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
+                 struct ib_send_wr **bad_wr);
+int rvt_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
+                     struct ib_recv_wr **bad_wr);
 #endif          /* DEF_RVTQP_H */
index 7fd879f34725501de3ac1ef7f9965617d13fcea4..367bc45e06e7dd73bbb25a3e15009df43cc045fb 100644 (file)
@@ -232,6 +232,9 @@ int rvt_register_device(struct rvt_dev_info *rdi)
        CHECK_DRIVER_OVERRIDE(rdi, modify_qp);
        CHECK_DRIVER_OVERRIDE(rdi, destroy_qp);
        CHECK_DRIVER_OVERRIDE(rdi, query_qp);
+       CHECK_DRIVER_OVERRIDE(rdi, post_send);
+       CHECK_DRIVER_OVERRIDE(rdi, post_recv);
+       CHECK_DRIVER_OVERRIDE(rdi, post_srq_recv);
 
        /* Address Handle */
        CHECK_DRIVER_OVERRIDE(rdi, create_ah);