diff options
author | Michael Brown <mcb30@etherboot.org> | 2009-07-08 11:50:47 +0100 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2009-07-17 23:06:34 +0100 |
commit | 3f4972db9abd8f5f0099685a112ef859a61a8cce (patch) | |
tree | 75f2ccd776133682f35c0ba7b53acaf7eff7260b | |
parent | 0582a84e660e9dcd42a645bb51892f8c008edf3e (diff) | |
download | ipxe-3f4972db9abd8f5f0099685a112ef859a61a8cce.tar.gz |
[infiniband] Allow completion queue operations to be optional
The send completion handler typically will just free the I/O buffer,
so allow this common case to be handled by the Infiniband core.
-rw-r--r-- | src/net/infiniband.c | 14 | ||||
-rw-r--r-- | src/net/infiniband/ib_gma.c | 22 |
2 files changed, 12 insertions, 24 deletions
diff --git a/src/net/infiniband.c b/src/net/infiniband.c index 38aaf9fc..f7f86cab 100644 --- a/src/net/infiniband.c +++ b/src/net/infiniband.c @@ -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 ) { - 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--; } @@ -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 ) { - 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--; } diff --git a/src/net/infiniband/ib_gma.c b/src/net/infiniband/ib_gma.c index 405d7861..649533ab 100644 --- a/src/net/infiniband/ib_gma.c +++ b/src/net/infiniband/ib_gma.c @@ -207,30 +207,8 @@ static void ib_gma_complete_recv ( struct ib_device *ibdev, 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 = { - .complete_send = ib_gma_complete_send, .complete_recv = ib_gma_complete_recv, }; |