forked from mirrors/linux
		
	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:
		
							parent
							
								
									238b1862b4
								
							
						
					
					
						commit
						f2dc9cdce8
					
				
					 2 changed files with 56 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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,6 +528,43 @@ static inline void rvt_qp_wqe_unreserve(
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue