verbs.c

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

C
823
字号
/* * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved. * Copyright (c) 2004 Infinicon Corporation.  All rights reserved. * Copyright (c) 2004 Intel Corporation.  All rights reserved. * Copyright (c) 2004 Topspin Corporation.  All rights reserved. * Copyright (c) 2004 Voltaire Corporation.  All rights reserved. * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved. * * This software is available to you under a choice of one of two * licenses.  You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * *     Redistribution and use in source and binary forms, with or *     without modification, are permitted provided that the following *     conditions are met: * *      - Redistributions of source code must retain the above *        copyright notice, this list of conditions and the following *        disclaimer. * *      - Redistributions in binary form must reproduce the above *        copyright notice, this list of conditions and the following *        disclaimer in the documentation and/or other materials *        provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * $Id: verbs.c 1349 2004-12-16 21:09:43Z roland $ */#include <linux/errno.h>#include <linux/err.h>#include <linux/string.h>#include <rdma/ib_verbs.h>#include <rdma/ib_cache.h>int ib_rate_to_mult(enum ib_rate rate){	switch (rate) {	case IB_RATE_2_5_GBPS: return  1;	case IB_RATE_5_GBPS:   return  2;	case IB_RATE_10_GBPS:  return  4;	case IB_RATE_20_GBPS:  return  8;	case IB_RATE_30_GBPS:  return 12;	case IB_RATE_40_GBPS:  return 16;	case IB_RATE_60_GBPS:  return 24;	case IB_RATE_80_GBPS:  return 32;	case IB_RATE_120_GBPS: return 48;	default:	       return -1;	}}EXPORT_SYMBOL(ib_rate_to_mult);enum ib_rate mult_to_ib_rate(int mult){	switch (mult) {	case 1:  return IB_RATE_2_5_GBPS;	case 2:  return IB_RATE_5_GBPS;	case 4:  return IB_RATE_10_GBPS;	case 8:  return IB_RATE_20_GBPS;	case 12: return IB_RATE_30_GBPS;	case 16: return IB_RATE_40_GBPS;	case 24: return IB_RATE_60_GBPS;	case 32: return IB_RATE_80_GBPS;	case 48: return IB_RATE_120_GBPS;	default: return IB_RATE_PORT_CURRENT;	}}EXPORT_SYMBOL(mult_to_ib_rate);/* Protection domains */struct ib_pd *ib_alloc_pd(struct ib_device *device){	struct ib_pd *pd;	pd = device->alloc_pd(device, NULL, NULL);	if (!IS_ERR(pd)) {		pd->device  = device;		pd->uobject = NULL;		atomic_set(&pd->usecnt, 0);	}	return pd;}EXPORT_SYMBOL(ib_alloc_pd);int ib_dealloc_pd(struct ib_pd *pd){	if (atomic_read(&pd->usecnt))		return -EBUSY;	return pd->device->dealloc_pd(pd);}EXPORT_SYMBOL(ib_dealloc_pd);/* Address handles */struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr){	struct ib_ah *ah;	ah = pd->device->create_ah(pd, ah_attr);	if (!IS_ERR(ah)) {		ah->device  = pd->device;		ah->pd      = pd;		ah->uobject = NULL;		atomic_inc(&pd->usecnt);	}	return ah;}EXPORT_SYMBOL(ib_create_ah);struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc,				   struct ib_grh *grh, u8 port_num){	struct ib_ah_attr ah_attr;	u32 flow_class;	u16 gid_index;	int ret;	memset(&ah_attr, 0, sizeof ah_attr);	ah_attr.dlid = wc->slid;	ah_attr.sl = wc->sl;	ah_attr.src_path_bits = wc->dlid_path_bits;	ah_attr.port_num = port_num;	if (wc->wc_flags & IB_WC_GRH) {		ah_attr.ah_flags = IB_AH_GRH;		ah_attr.grh.dgid = grh->sgid;		ret = ib_find_cached_gid(pd->device, &grh->dgid, &port_num,					 &gid_index);		if (ret)			return ERR_PTR(ret);		ah_attr.grh.sgid_index = (u8) gid_index;		flow_class = be32_to_cpu(grh->version_tclass_flow);		ah_attr.grh.flow_label = flow_class & 0xFFFFF;		ah_attr.grh.traffic_class = (flow_class >> 20) & 0xFF;		ah_attr.grh.hop_limit = grh->hop_limit;	}	return ib_create_ah(pd, &ah_attr);}EXPORT_SYMBOL(ib_create_ah_from_wc);int ib_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr){	return ah->device->modify_ah ?		ah->device->modify_ah(ah, ah_attr) :		-ENOSYS;}EXPORT_SYMBOL(ib_modify_ah);int ib_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr){	return ah->device->query_ah ?		ah->device->query_ah(ah, ah_attr) :		-ENOSYS;}EXPORT_SYMBOL(ib_query_ah);int ib_destroy_ah(struct ib_ah *ah){	struct ib_pd *pd;	int ret;	pd = ah->pd;	ret = ah->device->destroy_ah(ah);	if (!ret)		atomic_dec(&pd->usecnt);	return ret;}EXPORT_SYMBOL(ib_destroy_ah);/* Shared receive queues */struct ib_srq *ib_create_srq(struct ib_pd *pd,			     struct ib_srq_init_attr *srq_init_attr){	struct ib_srq *srq;	if (!pd->device->create_srq)		return ERR_PTR(-ENOSYS);	srq = pd->device->create_srq(pd, srq_init_attr, NULL);	if (!IS_ERR(srq)) {		srq->device    	   = pd->device;		srq->pd        	   = pd;		srq->uobject       = NULL;		srq->event_handler = srq_init_attr->event_handler;		srq->srq_context   = srq_init_attr->srq_context;		atomic_inc(&pd->usecnt);		atomic_set(&srq->usecnt, 0);	}	return srq;}EXPORT_SYMBOL(ib_create_srq);int ib_modify_srq(struct ib_srq *srq,		  struct ib_srq_attr *srq_attr,		  enum ib_srq_attr_mask srq_attr_mask){	return srq->device->modify_srq(srq, srq_attr, srq_attr_mask);}EXPORT_SYMBOL(ib_modify_srq);int ib_query_srq(struct ib_srq *srq,		 struct ib_srq_attr *srq_attr){	return srq->device->query_srq ?		srq->device->query_srq(srq, srq_attr) : -ENOSYS;}EXPORT_SYMBOL(ib_query_srq);int ib_destroy_srq(struct ib_srq *srq){	struct ib_pd *pd;	int ret;	if (atomic_read(&srq->usecnt))		return -EBUSY;	pd = srq->pd;	ret = srq->device->destroy_srq(srq);	if (!ret)		atomic_dec(&pd->usecnt);	return ret;}EXPORT_SYMBOL(ib_destroy_srq);/* Queue pairs */struct ib_qp *ib_create_qp(struct ib_pd *pd,			   struct ib_qp_init_attr *qp_init_attr){	struct ib_qp *qp;	qp = pd->device->create_qp(pd, qp_init_attr, NULL);	if (!IS_ERR(qp)) {		qp->device     	  = pd->device;		qp->pd         	  = pd;		qp->send_cq    	  = qp_init_attr->send_cq;		qp->recv_cq    	  = qp_init_attr->recv_cq;		qp->srq	       	  = qp_init_attr->srq;		qp->uobject       = NULL;		qp->event_handler = qp_init_attr->event_handler;		qp->qp_context    = qp_init_attr->qp_context;		qp->qp_type	  = qp_init_attr->qp_type;		atomic_inc(&pd->usecnt);		atomic_inc(&qp_init_attr->send_cq->usecnt);		atomic_inc(&qp_init_attr->recv_cq->usecnt);		if (qp_init_attr->srq)			atomic_inc(&qp_init_attr->srq->usecnt);	}	return qp;}EXPORT_SYMBOL(ib_create_qp);static const struct {	int			valid;	enum ib_qp_attr_mask	req_param[IB_QPT_RAW_ETY + 1];	enum ib_qp_attr_mask	opt_param[IB_QPT_RAW_ETY + 1];} qp_state_table[IB_QPS_ERR + 1][IB_QPS_ERR + 1] = {	[IB_QPS_RESET] = {		[IB_QPS_RESET] = { .valid = 1 },		[IB_QPS_ERR]   = { .valid = 1 },		[IB_QPS_INIT]  = {			.valid = 1,			.req_param = {				[IB_QPT_UD]  = (IB_QP_PKEY_INDEX		|						IB_QP_PORT			|						IB_QP_QKEY),				[IB_QPT_UC]  = (IB_QP_PKEY_INDEX		|						IB_QP_PORT			|						IB_QP_ACCESS_FLAGS),				[IB_QPT_RC]  = (IB_QP_PKEY_INDEX		|						IB_QP_PORT			|						IB_QP_ACCESS_FLAGS),				[IB_QPT_SMI] = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),				[IB_QPT_GSI] = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),			}		},	},	[IB_QPS_INIT]  = {		[IB_QPS_RESET] = { .valid = 1 },		[IB_QPS_ERR] =   { .valid = 1 },		[IB_QPS_INIT]  = {			.valid = 1,			.opt_param = {				[IB_QPT_UD]  = (IB_QP_PKEY_INDEX		|						IB_QP_PORT			|						IB_QP_QKEY),				[IB_QPT_UC]  = (IB_QP_PKEY_INDEX		|						IB_QP_PORT			|						IB_QP_ACCESS_FLAGS),				[IB_QPT_RC]  = (IB_QP_PKEY_INDEX		|						IB_QP_PORT			|						IB_QP_ACCESS_FLAGS),				[IB_QPT_SMI] = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),				[IB_QPT_GSI] = (IB_QP_PKEY_INDEX		|						IB_QP_QKEY),			}		},		[IB_QPS_RTR]   = {			.valid = 1,			.req_param = {				[IB_QPT_UC]  = (IB_QP_AV			|						IB_QP_PATH_MTU			|						IB_QP_DEST_QPN			|						IB_QP_RQ_PSN),				[IB_QPT_RC]  = (IB_QP_AV			|						IB_QP_PATH_MTU			|						IB_QP_DEST_QPN			|						IB_QP_RQ_PSN			|						IB_QP_MAX_DEST_RD_ATOMIC	|						IB_QP_MIN_RNR_TIMER),			},			.opt_param = {				 [IB_QPT_UD]  = (IB_QP_PKEY_INDEX		|						 IB_QP_QKEY),				 [IB_QPT_UC]  = (IB_QP_ALT_PATH			|						 IB_QP_ACCESS_FLAGS		|						 IB_QP_PKEY_INDEX),				 [IB_QPT_RC]  = (IB_QP_ALT_PATH			|						 IB_QP_ACCESS_FLAGS		|						 IB_QP_PKEY_INDEX),				 [IB_QPT_SMI] = (IB_QP_PKEY_INDEX		|						 IB_QP_QKEY),				 [IB_QPT_GSI] = (IB_QP_PKEY_INDEX		|						 IB_QP_QKEY),			 }		}	},	[IB_QPS_RTR]   = {		[IB_QPS_RESET] = { .valid = 1 },		[IB_QPS_ERR] =   { .valid = 1 },		[IB_QPS_RTS]   = {			.valid = 1,			.req_param = {				[IB_QPT_UD]  = IB_QP_SQ_PSN,				[IB_QPT_UC]  = IB_QP_SQ_PSN,				[IB_QPT_RC]  = (IB_QP_TIMEOUT			|						IB_QP_RETRY_CNT			|						IB_QP_RNR_RETRY			|						IB_QP_SQ_PSN			|						IB_QP_MAX_QP_RD_ATOMIC),				[IB_QPT_SMI] = IB_QP_SQ_PSN,				[IB_QPT_GSI] = IB_QP_SQ_PSN,			},			.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_RTS]   = {		[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_QP_ALT_PATH			|						IB_QP_PATH_MIG_STATE),				[IB_QPT_RC]  = (IB_QP_CUR_STATE			|						IB_QP_ACCESS_FLAGS		|						IB_QP_ALT_PATH			|						IB_QP_PATH_MIG_STATE		|						IB_QP_MIN_RNR_TIMER),				[IB_QPT_SMI] = (IB_QP_CUR_STATE			|

⌨️ 快捷键说明

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