verbs.c

来自「LINUX 2.6.17.4的源码」· C语言 代码 · 共 823 行 · 第 1/2 页

C
823
字号
						IB_QP_QKEY),				[IB_QPT_GSI] = (IB_QP_CUR_STATE			|						IB_QP_QKEY),			}		},		[IB_QPS_SQD]   = {			.valid = 1,			.opt_param = {				[IB_QPT_UD]  = IB_QP_EN_SQD_ASYNC_NOTIFY,				[IB_QPT_UC]  = IB_QP_EN_SQD_ASYNC_NOTIFY,				[IB_QPT_RC]  = IB_QP_EN_SQD_ASYNC_NOTIFY,				[IB_QPT_SMI] = IB_QP_EN_SQD_ASYNC_NOTIFY,				[IB_QPT_GSI] = IB_QP_EN_SQD_ASYNC_NOTIFY			}		},	},	[IB_QPS_SQD]   = {		[IB_QPS_RESET] = { .valid = 1 },		[IB_QPS_ERR] =   { .valid = 1 },		[IB_QPS_RTS]   = {			.valid = 1,			.opt_param = {				[IB_QPT_UD]  = (IB_QP_CUR_STATE			|						IB_QP_QKEY),				[IB_QPT_UC]  = (IB_QP_CUR_STATE			|						IB_QP_ALT_PATH			|						IB_QP_ACCESS_FLAGS		|						IB_QP_PATH_MIG_STATE),				[IB_QPT_RC]  = (IB_QP_CUR_STATE			|						IB_QP_ALT_PATH			|						IB_QP_ACCESS_FLAGS		|						IB_QP_MIN_RNR_TIMER		|						IB_QP_PATH_MIG_STATE),				[IB_QPT_SMI] = (IB_QP_CUR_STATE			|						IB_QP_QKEY),				[IB_QPT_GSI] = (IB_QP_CUR_STATE			|						IB_QP_QKEY),			}		},		[IB_QPS_SQD]   = {			.valid = 1,			.opt_param = {				[IB_QPT_UD]  = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),				[IB_QPT_UC]  = (IB_QP_AV			|						IB_QP_ALT_PATH			|						IB_QP_ACCESS_FLAGS		|						IB_QP_PKEY_INDEX		|						IB_QP_PATH_MIG_STATE),				[IB_QPT_RC]  = (IB_QP_PORT			|						IB_QP_AV			|						IB_QP_TIMEOUT			|						IB_QP_RETRY_CNT			|						IB_QP_RNR_RETRY			|						IB_QP_MAX_QP_RD_ATOMIC		|						IB_QP_MAX_DEST_RD_ATOMIC	|						IB_QP_ALT_PATH			|						IB_QP_ACCESS_FLAGS		|						IB_QP_PKEY_INDEX		|						IB_QP_MIN_RNR_TIMER		|						IB_QP_PATH_MIG_STATE),				[IB_QPT_SMI] = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),				[IB_QPT_GSI] = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),			}		}	},	[IB_QPS_SQE]   = {		[IB_QPS_RESET] = { .valid = 1 },		[IB_QPS_ERR] =   { .valid = 1 },		[IB_QPS_RTS]   = {			.valid = 1,			.opt_param = {				[IB_QPT_UD]  = (IB_QP_CUR_STATE			|						IB_QP_QKEY),				[IB_QPT_UC]  = (IB_QP_CUR_STATE			|						IB_QP_ACCESS_FLAGS),				[IB_QPT_SMI] = (IB_QP_CUR_STATE			|						IB_QP_QKEY),				[IB_QPT_GSI] = (IB_QP_CUR_STATE			|						IB_QP_QKEY),			}		}	},	[IB_QPS_ERR] = {		[IB_QPS_RESET] = { .valid = 1 },		[IB_QPS_ERR] =   { .valid = 1 }	}};int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,		       enum ib_qp_type type, enum ib_qp_attr_mask mask){	enum ib_qp_attr_mask req_param, opt_param;	if (cur_state  < 0 || cur_state  > IB_QPS_ERR ||	    next_state < 0 || next_state > IB_QPS_ERR)		return 0;	if (mask & IB_QP_CUR_STATE  &&	    cur_state != IB_QPS_RTR && cur_state != IB_QPS_RTS &&	    cur_state != IB_QPS_SQD && cur_state != IB_QPS_SQE)		return 0;	if (!qp_state_table[cur_state][next_state].valid)		return 0;	req_param = qp_state_table[cur_state][next_state].req_param[type];	opt_param = qp_state_table[cur_state][next_state].opt_param[type];	if ((mask & req_param) != req_param)		return 0;	if (mask & ~(req_param | opt_param | IB_QP_STATE))		return 0;	return 1;}EXPORT_SYMBOL(ib_modify_qp_is_ok);int ib_modify_qp(struct ib_qp *qp,		 struct ib_qp_attr *qp_attr,		 int qp_attr_mask){	return qp->device->modify_qp(qp, qp_attr, qp_attr_mask);}EXPORT_SYMBOL(ib_modify_qp);int ib_query_qp(struct ib_qp *qp,		struct ib_qp_attr *qp_attr,		int qp_attr_mask,		struct ib_qp_init_attr *qp_init_attr){	return qp->device->query_qp ?		qp->device->query_qp(qp, qp_attr, qp_attr_mask, qp_init_attr) :		-ENOSYS;}EXPORT_SYMBOL(ib_query_qp);int ib_destroy_qp(struct ib_qp *qp){	struct ib_pd *pd;	struct ib_cq *scq, *rcq;	struct ib_srq *srq;	int ret;	pd  = qp->pd;	scq = qp->send_cq;	rcq = qp->recv_cq;	srq = qp->srq;	ret = qp->device->destroy_qp(qp);	if (!ret) {		atomic_dec(&pd->usecnt);		atomic_dec(&scq->usecnt);		atomic_dec(&rcq->usecnt);		if (srq)			atomic_dec(&srq->usecnt);	}	return ret;}EXPORT_SYMBOL(ib_destroy_qp);/* Completion queues */struct ib_cq *ib_create_cq(struct ib_device *device,			   ib_comp_handler comp_handler,			   void (*event_handler)(struct ib_event *, void *),			   void *cq_context, int cqe){	struct ib_cq *cq;	cq = device->create_cq(device, cqe, NULL, NULL);	if (!IS_ERR(cq)) {		cq->device        = device;		cq->uobject       = NULL;		cq->comp_handler  = comp_handler;		cq->event_handler = event_handler;		cq->cq_context    = cq_context;		atomic_set(&cq->usecnt, 0);	}	return cq;}EXPORT_SYMBOL(ib_create_cq);int ib_destroy_cq(struct ib_cq *cq){	if (atomic_read(&cq->usecnt))		return -EBUSY;	return cq->device->destroy_cq(cq);}EXPORT_SYMBOL(ib_destroy_cq);int ib_resize_cq(struct ib_cq *cq, int cqe){	return cq->device->resize_cq ?		cq->device->resize_cq(cq, cqe, NULL) : -ENOSYS;}EXPORT_SYMBOL(ib_resize_cq);/* Memory regions */struct ib_mr *ib_get_dma_mr(struct ib_pd *pd, int mr_access_flags){	struct ib_mr *mr;	mr = pd->device->get_dma_mr(pd, mr_access_flags);	if (!IS_ERR(mr)) {		mr->device  = pd->device;		mr->pd      = pd;		mr->uobject = NULL;		atomic_inc(&pd->usecnt);		atomic_set(&mr->usecnt, 0);	}	return mr;}EXPORT_SYMBOL(ib_get_dma_mr);struct ib_mr *ib_reg_phys_mr(struct ib_pd *pd,			     struct ib_phys_buf *phys_buf_array,			     int num_phys_buf,			     int mr_access_flags,			     u64 *iova_start){	struct ib_mr *mr;	mr = pd->device->reg_phys_mr(pd, phys_buf_array, num_phys_buf,				     mr_access_flags, iova_start);	if (!IS_ERR(mr)) {		mr->device  = pd->device;		mr->pd      = pd;		mr->uobject = NULL;		atomic_inc(&pd->usecnt);		atomic_set(&mr->usecnt, 0);	}	return mr;}EXPORT_SYMBOL(ib_reg_phys_mr);int ib_rereg_phys_mr(struct ib_mr *mr,		     int mr_rereg_mask,		     struct ib_pd *pd,		     struct ib_phys_buf *phys_buf_array,		     int num_phys_buf,		     int mr_access_flags,		     u64 *iova_start){	struct ib_pd *old_pd;	int ret;	if (!mr->device->rereg_phys_mr)		return -ENOSYS;	if (atomic_read(&mr->usecnt))		return -EBUSY;	old_pd = mr->pd;	ret = mr->device->rereg_phys_mr(mr, mr_rereg_mask, pd,					phys_buf_array, num_phys_buf,					mr_access_flags, iova_start);	if (!ret && (mr_rereg_mask & IB_MR_REREG_PD)) {		atomic_dec(&old_pd->usecnt);		atomic_inc(&pd->usecnt);	}	return ret;}EXPORT_SYMBOL(ib_rereg_phys_mr);int ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr){	return mr->device->query_mr ?		mr->device->query_mr(mr, mr_attr) : -ENOSYS;}EXPORT_SYMBOL(ib_query_mr);int ib_dereg_mr(struct ib_mr *mr){	struct ib_pd *pd;	int ret;	if (atomic_read(&mr->usecnt))		return -EBUSY;	pd = mr->pd;	ret = mr->device->dereg_mr(mr);	if (!ret)		atomic_dec(&pd->usecnt);	return ret;}EXPORT_SYMBOL(ib_dereg_mr);/* Memory windows */struct ib_mw *ib_alloc_mw(struct ib_pd *pd){	struct ib_mw *mw;	if (!pd->device->alloc_mw)		return ERR_PTR(-ENOSYS);	mw = pd->device->alloc_mw(pd);	if (!IS_ERR(mw)) {		mw->device  = pd->device;		mw->pd      = pd;		mw->uobject = NULL;		atomic_inc(&pd->usecnt);	}	return mw;}EXPORT_SYMBOL(ib_alloc_mw);int ib_dealloc_mw(struct ib_mw *mw){	struct ib_pd *pd;	int ret;	pd = mw->pd;	ret = mw->device->dealloc_mw(mw);	if (!ret)		atomic_dec(&pd->usecnt);	return ret;}EXPORT_SYMBOL(ib_dealloc_mw);/* "Fast" memory regions */struct ib_fmr *ib_alloc_fmr(struct ib_pd *pd,			    int mr_access_flags,			    struct ib_fmr_attr *fmr_attr){	struct ib_fmr *fmr;	if (!pd->device->alloc_fmr)		return ERR_PTR(-ENOSYS);	fmr = pd->device->alloc_fmr(pd, mr_access_flags, fmr_attr);	if (!IS_ERR(fmr)) {		fmr->device = pd->device;		fmr->pd     = pd;		atomic_inc(&pd->usecnt);	}	return fmr;}EXPORT_SYMBOL(ib_alloc_fmr);int ib_unmap_fmr(struct list_head *fmr_list){	struct ib_fmr *fmr;	if (list_empty(fmr_list))		return 0;	fmr = list_entry(fmr_list->next, struct ib_fmr, list);	return fmr->device->unmap_fmr(fmr_list);}EXPORT_SYMBOL(ib_unmap_fmr);int ib_dealloc_fmr(struct ib_fmr *fmr){	struct ib_pd *pd;	int ret;	pd = fmr->pd;	ret = fmr->device->dealloc_fmr(fmr);	if (!ret)		atomic_dec(&pd->usecnt);	return ret;}EXPORT_SYMBOL(ib_dealloc_fmr);/* Multicast groups */int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid){	if (!qp->device->attach_mcast)		return -ENOSYS;	if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD)		return -EINVAL;	return qp->device->attach_mcast(qp, gid, lid);}EXPORT_SYMBOL(ib_attach_mcast);int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid){	if (!qp->device->detach_mcast)		return -ENOSYS;	if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD)		return -EINVAL;	return qp->device->detach_mcast(qp, gid, lid);}EXPORT_SYMBOL(ib_detach_mcast);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?