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);
 | 
					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,
 | 
					static void get_map_page(struct rvt_qpn_table *qpt,
 | 
				
			||||||
			 struct rvt_qpn_map *map,
 | 
								 struct rvt_qpn_map *map,
 | 
				
			||||||
			 gfp_t gfp)
 | 
								 gfp_t gfp)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,6 +51,7 @@
 | 
				
			||||||
#include <rdma/rdma_vt.h>
 | 
					#include <rdma/rdma_vt.h>
 | 
				
			||||||
#include <rdma/ib_pack.h>
 | 
					#include <rdma/ib_pack.h>
 | 
				
			||||||
#include <rdma/ib_verbs.h>
 | 
					#include <rdma/ib_verbs.h>
 | 
				
			||||||
 | 
					#include <rdma/rdmavt_cq.h>
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Atomic bit definitions for r_aflags.
 | 
					 * 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;
 | 
					struct rvt_dev_info;
 | 
				
			||||||
int rvt_error_qp(struct rvt_qp *qp, enum ib_wc_status err);
 | 
					int rvt_error_qp(struct rvt_qp *qp, enum ib_wc_status err);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue