> From my interpretation of the spec, it looks like a bug and the immediate data
> should be available in the send wc, since it's not explicitly excluded.  I'll
> verify that this is the intent with the IBTA.

I'm still waiting on feedback from the IBTA, but they are looking into the 
matter.
 
> I haven't traced through the library and driver code to see if mlx4 driver can
> report it.  I'll see if I can do this within the next couple of days.

The following patch to libmlx4 added the immediate data to the send work 
completion for me.  A similar change looks like it would be needed in the 
kernel.

Report immediate data with send work completions

From: Sean Hefty <[email protected]>

Signed-off-by: Sean Hefty <[email protected]>
---
 src/cq.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/src/cq.c b/src/cq.c
index 8226b6b..ad1d20c 100644
--- a/src/cq.c
+++ b/src/cq.c
@@ -46,6 +46,7 @@
 
 #include "mlx4.h"
 #include "doorbell.h"
+#include "wqe.h"
 
 enum {
        MLX4_CQ_DOORBELL                        = 0x20
@@ -194,6 +195,7 @@ static int mlx4_poll_one(struct mlx4_cq *cq,
 {
        struct mlx4_wq *wq;
        struct mlx4_cqe *cqe;
+       struct mlx4_wqe_ctrl_seg *ctrl;
        struct mlx4_srq *srq;
        uint32_t qpn;
        uint32_t g_mlpath_rqpn;
@@ -240,6 +242,8 @@ static int mlx4_poll_one(struct mlx4_cq *cq,
                wq = &(*cur_qp)->sq;
                wqe_index = ntohs(cqe->wqe_index);
                wq->tail += (uint16_t) (wqe_index - (uint16_t) wq->tail);
+               ctrl = (*cur_qp)->buf.buf + (*cur_qp)->sq.offset +
+                       ((wq->tail & (wq->wqe_cnt - 1)) << 
(*cur_qp)->sq.wqe_shift);
                wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
                ++wq->tail;
        } else if ((*cur_qp)->ibv_qp.srq) {
@@ -265,11 +269,13 @@ static int mlx4_poll_one(struct mlx4_cq *cq,
                switch (cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) {
                case MLX4_OPCODE_RDMA_WRITE_IMM:
                        wc->wc_flags |= IBV_WC_WITH_IMM;
+                       wc->imm_data = ctrl->imm;
                case MLX4_OPCODE_RDMA_WRITE:
                        wc->opcode    = IBV_WC_RDMA_WRITE;
                        break;
                case MLX4_OPCODE_SEND_IMM:
                        wc->wc_flags |= IBV_WC_WITH_IMM;
+                       wc->imm_data = ctrl->imm;
                case MLX4_OPCODE_SEND:
                        wc->opcode    = IBV_WC_SEND;
                        break;


--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to