[infiniband] Allow completion queue operations to be optional
authorMichael Brown <mcb30@etherboot.org>
Wed, 8 Jul 2009 10:50:47 +0000 (11:50 +0100)
committerMichael Brown <mcb30@etherboot.org>
Fri, 17 Jul 2009 22:06:34 +0000 (23:06 +0100)
The send completion handler typically will just free the I/O buffer,
so allow this common case to be handled by the Infiniband core.

src/net/infiniband.c
src/net/infiniband/ib_gma.c

index 38aaf9f..f7f86ca 100644 (file)
@@ -424,7 +424,12 @@ int ib_post_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
  */
 void ib_complete_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
                        struct io_buffer *iobuf, int rc ) {
  */
 void ib_complete_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
                        struct io_buffer *iobuf, int rc ) {
-       qp->send.cq->op->complete_send ( ibdev, qp, iobuf, rc );
+
+       if ( qp->send.cq->op->complete_send ) {
+               qp->send.cq->op->complete_send ( ibdev, qp, iobuf, rc );
+       } else {
+               free_iob ( iobuf );
+       }
        qp->send.fill--;
 }
 
        qp->send.fill--;
 }
 
@@ -440,7 +445,12 @@ void ib_complete_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
 void ib_complete_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
                        struct ib_address_vector *av,
                        struct io_buffer *iobuf, int rc ) {
 void ib_complete_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
                        struct ib_address_vector *av,
                        struct io_buffer *iobuf, int rc ) {
-       qp->recv.cq->op->complete_recv ( ibdev, qp, av, iobuf, rc );
+
+       if ( qp->recv.cq->op->complete_recv ) {
+               qp->recv.cq->op->complete_recv ( ibdev, qp, av, iobuf, rc );
+       } else {
+               free_iob ( iobuf );
+       }
        qp->recv.fill--;
 }
 
        qp->recv.fill--;
 }
 
index 405d786..649533a 100644 (file)
@@ -207,30 +207,8 @@ static void ib_gma_complete_recv ( struct ib_device *ibdev,
        free_iob ( iobuf );
 }
 
        free_iob ( iobuf );
 }
 
-/**
- * Complete GMA send
- *
- *
- * @v ibdev            Infiniband device
- * @v qp               Queue pair
- * @v iobuf            I/O buffer
- * @v rc               Completion status code
- */
-static void ib_gma_complete_send ( struct ib_device *ibdev __unused,
-                                  struct ib_queue_pair *qp,
-                                  struct io_buffer *iobuf, int rc ) {
-       struct ib_gma *gma = ib_qp_get_ownerdata ( qp );
-
-       if ( rc != 0 ) {
-               DBGC ( gma, "GMA %p send completion error: %s\n",
-                      gma, strerror ( rc ) );
-       }
-       free_iob ( iobuf );
-}
-
 /** GMA completion operations */
 static struct ib_completion_queue_operations ib_gma_completion_ops = {
 /** GMA completion operations */
 static struct ib_completion_queue_operations ib_gma_completion_ops = {
-       .complete_send = ib_gma_complete_send,
        .complete_recv = ib_gma_complete_recv,
 };
 
        .complete_recv = ib_gma_complete_recv,
 };