IB/rdmavt: Add a send completion helper
This is for use by client drivers to drive send completions into a CQ. A new exported table allows for the mapping of ib_wr_opcode into a ib_wc_opcode. Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
238b1862b4
Коммит
f2dc9cdce8
|
@ -76,6 +76,23 @@ const int ib_rvt_state_ops[IB_QPS_ERR + 1] = {
|
|||
};
|
||||
EXPORT_SYMBOL(ib_rvt_state_ops);
|
||||
|
||||
/*
|
||||
* Translate ib_wr_opcode into ib_wc_opcode.
|
||||
*/
|
||||
const enum ib_wc_opcode ib_rvt_wc_opcode[] = {
|
||||
[IB_WR_RDMA_WRITE] = IB_WC_RDMA_WRITE,
|
||||
[IB_WR_RDMA_WRITE_WITH_IMM] = IB_WC_RDMA_WRITE,
|
||||
[IB_WR_SEND] = IB_WC_SEND,
|
||||
[IB_WR_SEND_WITH_IMM] = IB_WC_SEND,
|
||||
[IB_WR_RDMA_READ] = IB_WC_RDMA_READ,
|
||||
[IB_WR_ATOMIC_CMP_AND_SWP] = IB_WC_COMP_SWAP,
|
||||
[IB_WR_ATOMIC_FETCH_AND_ADD] = IB_WC_FETCH_ADD,
|
||||
[IB_WR_SEND_WITH_INV] = IB_WC_SEND,
|
||||
[IB_WR_LOCAL_INV] = IB_WC_LOCAL_INV,
|
||||
[IB_WR_REG_MR] = IB_WC_REG_MR
|
||||
};
|
||||
EXPORT_SYMBOL(ib_rvt_wc_opcode);
|
||||
|
||||
static void get_map_page(struct rvt_qpn_table *qpt,
|
||||
struct rvt_qpn_map *map,
|
||||
gfp_t gfp)
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#include <rdma/rdma_vt.h>
|
||||
#include <rdma/ib_pack.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/rdmavt_cq.h>
|
||||
/*
|
||||
* Atomic bit definitions for r_aflags.
|
||||
*/
|
||||
|
@ -527,7 +528,44 @@ static inline void rvt_qp_wqe_unreserve(
|
|||
}
|
||||
}
|
||||
|
||||
extern const int ib_rvt_state_ops[];
|
||||
extern const enum ib_wc_opcode ib_rvt_wc_opcode[];
|
||||
|
||||
/**
|
||||
* rvt_qp_swqe_complete() - insert send completion
|
||||
* @qp - the qp
|
||||
* @wqe - the send wqe
|
||||
* @status - completion status
|
||||
*
|
||||
* Insert a send completion into the completion
|
||||
* queue if the qp indicates it should be done.
|
||||
*
|
||||
* See IBTA 10.7.3.1 for info on completion
|
||||
* control.
|
||||
*/
|
||||
static inline void rvt_qp_swqe_complete(
|
||||
struct rvt_qp *qp,
|
||||
struct rvt_swqe *wqe,
|
||||
enum ib_wc_status status)
|
||||
{
|
||||
if (unlikely(wqe->wr.send_flags & RVT_SEND_RESERVE_USED))
|
||||
return;
|
||||
if (!(qp->s_flags & RVT_S_SIGNAL_REQ_WR) ||
|
||||
(wqe->wr.send_flags & IB_SEND_SIGNALED) ||
|
||||
status != IB_WC_SUCCESS) {
|
||||
struct ib_wc wc;
|
||||
|
||||
memset(&wc, 0, sizeof(wc));
|
||||
wc.wr_id = wqe->wr.wr_id;
|
||||
wc.status = status;
|
||||
wc.opcode = ib_rvt_wc_opcode[wqe->wr.opcode];
|
||||
wc.qp = &qp->ibqp;
|
||||
wc.byte_len = wqe->length;
|
||||
rvt_cq_enter(ibcq_to_rvtcq(qp->ibqp.send_cq), &wc,
|
||||
status != IB_WC_SUCCESS);
|
||||
}
|
||||
}
|
||||
|
||||
extern const int ib_rvt_state_ops[];
|
||||
|
||||
struct rvt_dev_info;
|
||||
int rvt_error_qp(struct rvt_qp *qp, enum ib_wc_status err);
|
||||
|
|
Загрузка…
Ссылка в новой задаче