From: Ashutosh Dixit <ashutosh.dixit@xxxxxxxxx> rkey invalidation from userspace into the kernel is broken for both IB_WR_LOCAL_INV and IB_WR_SEND_WITH_INV opcodes because of (a) mismatch in opcode values between 'enum ib_wr_opcode' in the kernel and 'enum ibv_wr_opcode' in rdma-core libibverbs (b) missing handling of IB_WR_LOCAL_INV in ib_uverbs_post_send(). This patch reorders the kernel enum to match user space, rather than the other way round, because if enum values were changed in rdma-core dynamically linked applications would need to be recompiled before they will work, whereas the kernel is monolithic and all kernel ULP's see the new kernel enum without issues. Also add handling of IB_WR_LOCAL_INV in ib_uverbs_post_send(). Reported-by: Prathap Kumar Valsan <prathap.kumar.valsan@xxxxxxxxx> Reviewed-by: Brian Welty <brian.welty@xxxxxxxxx> Signed-off-by: Ashutosh Dixit <ashutosh.dixit@xxxxxxxxx> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxx> --- drivers/infiniband/core/uverbs_cmd.c | 4 +++- include/rdma/ib_verbs.h | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index a148de3..44f3d9e 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -2260,6 +2260,7 @@ ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file, next = &atomic->wr; } else if (user_wr->opcode == IB_WR_SEND || user_wr->opcode == IB_WR_SEND_WITH_IMM || + user_wr->opcode == IB_WR_LOCAL_INV || user_wr->opcode == IB_WR_SEND_WITH_INV) { next_size = sizeof(*next); next = alloc_wr(next_size, user_wr->num_sge); @@ -2276,7 +2277,8 @@ ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file, user_wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) { next->ex.imm_data = (__be32 __force) user_wr->ex.imm_data; - } else if (user_wr->opcode == IB_WR_SEND_WITH_INV) { + } else if (user_wr->opcode == IB_WR_LOCAL_INV || + user_wr->opcode == IB_WR_SEND_WITH_INV) { next->ex.invalidate_rkey = user_wr->ex.invalidate_rkey; } diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 73b2387..964497b 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1268,10 +1268,11 @@ enum ib_wr_opcode { IB_WR_RDMA_READ, IB_WR_ATOMIC_CMP_AND_SWP, IB_WR_ATOMIC_FETCH_AND_ADD, - IB_WR_LSO, + IB_WR_LOCAL_INV, + IB_WR_RESERVED0, IB_WR_SEND_WITH_INV, + IB_WR_LSO, IB_WR_RDMA_READ_WITH_INV, - IB_WR_LOCAL_INV, IB_WR_REG_MR, IB_WR_MASKED_ATOMIC_CMP_AND_SWP, IB_WR_MASKED_ATOMIC_FETCH_AND_ADD, -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html