RDMA/core: Add SRQ type field
Currently, there is only a single ("basic") type of SRQ, but with XRC
support we will add a second.  Prepare for this by defining an SRQ type
and setting all current users to IB_SRQT_BASIC.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
	
	
This commit is contained in:
		
					parent
					
						
							
								59991f94eb
							
						
					
				
			
			
				commit
				
					
						96104eda01
					
				
			
		
					 9 changed files with 28 additions and 0 deletions
				
			
		|  | @ -2013,6 +2013,7 @@ ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file, | ||||||
| 
 | 
 | ||||||
| 	attr.event_handler  = ib_uverbs_srq_event_handler; | 	attr.event_handler  = ib_uverbs_srq_event_handler; | ||||||
| 	attr.srq_context    = file; | 	attr.srq_context    = file; | ||||||
|  | 	attr.srq_type       = IB_SRQT_BASIC; | ||||||
| 	attr.attr.max_wr    = cmd.max_wr; | 	attr.attr.max_wr    = cmd.max_wr; | ||||||
| 	attr.attr.max_sge   = cmd.max_sge; | 	attr.attr.max_sge   = cmd.max_sge; | ||||||
| 	attr.attr.srq_limit = cmd.srq_limit; | 	attr.attr.srq_limit = cmd.srq_limit; | ||||||
|  |  | ||||||
|  | @ -250,6 +250,7 @@ struct ib_srq *ib_create_srq(struct ib_pd *pd, | ||||||
| 		srq->uobject       = NULL; | 		srq->uobject       = NULL; | ||||||
| 		srq->event_handler = srq_init_attr->event_handler; | 		srq->event_handler = srq_init_attr->event_handler; | ||||||
| 		srq->srq_context   = srq_init_attr->srq_context; | 		srq->srq_context   = srq_init_attr->srq_context; | ||||||
|  | 		srq->srq_type      = srq_init_attr->srq_type; | ||||||
| 		atomic_inc(&pd->usecnt); | 		atomic_inc(&pd->usecnt); | ||||||
| 		atomic_set(&srq->usecnt, 0); | 		atomic_set(&srq->usecnt, 0); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -977,6 +977,9 @@ struct ib_srq *ehca_create_srq(struct ib_pd *pd, | ||||||
| 	struct hcp_modify_qp_control_block *mqpcb; | 	struct hcp_modify_qp_control_block *mqpcb; | ||||||
| 	u64 hret, update_mask; | 	u64 hret, update_mask; | ||||||
| 
 | 
 | ||||||
|  | 	if (srq_init_attr->srq_type != IB_SRQT_BASIC) | ||||||
|  | 		return ERR_PTR(-ENOSYS); | ||||||
|  | 
 | ||||||
| 	/* For common attributes, internal_create_qp() takes its info
 | 	/* For common attributes, internal_create_qp() takes its info
 | ||||||
| 	 * out of qp_init_attr, so copy all common attrs there. | 	 * out of qp_init_attr, so copy all common attrs there. | ||||||
| 	 */ | 	 */ | ||||||
|  |  | ||||||
|  | @ -107,6 +107,11 @@ struct ib_srq *ipath_create_srq(struct ib_pd *ibpd, | ||||||
| 	u32 sz; | 	u32 sz; | ||||||
| 	struct ib_srq *ret; | 	struct ib_srq *ret; | ||||||
| 
 | 
 | ||||||
|  | 	if (srq_init_attr->srq_type != IB_SRQT_BASIC) { | ||||||
|  | 		ret = ERR_PTR(-ENOSYS); | ||||||
|  | 		goto done; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (srq_init_attr->attr.max_wr == 0) { | 	if (srq_init_attr->attr.max_wr == 0) { | ||||||
| 		ret = ERR_PTR(-EINVAL); | 		ret = ERR_PTR(-EINVAL); | ||||||
| 		goto done; | 		goto done; | ||||||
|  |  | ||||||
|  | @ -81,6 +81,9 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd, | ||||||
| 	int err; | 	int err; | ||||||
| 	int i; | 	int i; | ||||||
| 
 | 
 | ||||||
|  | 	if (init_attr->srq_type != IB_SRQT_BASIC) | ||||||
|  | 		return ERR_PTR(-ENOSYS); | ||||||
|  | 
 | ||||||
| 	/* Sanity check SRQ size before proceeding */ | 	/* Sanity check SRQ size before proceeding */ | ||||||
| 	if (init_attr->attr.max_wr  >= dev->dev->caps.max_srq_wqes || | 	if (init_attr->attr.max_wr  >= dev->dev->caps.max_srq_wqes || | ||||||
| 	    init_attr->attr.max_sge >  dev->dev->caps.max_srq_sge) | 	    init_attr->attr.max_sge >  dev->dev->caps.max_srq_sge) | ||||||
|  |  | ||||||
|  | @ -438,6 +438,9 @@ static struct ib_srq *mthca_create_srq(struct ib_pd *pd, | ||||||
| 	struct mthca_srq *srq; | 	struct mthca_srq *srq; | ||||||
| 	int err; | 	int err; | ||||||
| 
 | 
 | ||||||
|  | 	if (init_attr->srq_type != IB_SRQT_BASIC) | ||||||
|  | 		return ERR_PTR(-ENOSYS); | ||||||
|  | 
 | ||||||
| 	srq = kmalloc(sizeof *srq, GFP_KERNEL); | 	srq = kmalloc(sizeof *srq, GFP_KERNEL); | ||||||
| 	if (!srq) | 	if (!srq) | ||||||
| 		return ERR_PTR(-ENOMEM); | 		return ERR_PTR(-ENOMEM); | ||||||
|  |  | ||||||
|  | @ -107,6 +107,11 @@ struct ib_srq *qib_create_srq(struct ib_pd *ibpd, | ||||||
| 	u32 sz; | 	u32 sz; | ||||||
| 	struct ib_srq *ret; | 	struct ib_srq *ret; | ||||||
| 
 | 
 | ||||||
|  | 	if (srq_init_attr->srq_type != IB_SRQT_BASIC) { | ||||||
|  | 		ret = ERR_PTR(-ENOSYS); | ||||||
|  | 		goto done; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (srq_init_attr->attr.max_sge == 0 || | 	if (srq_init_attr->attr.max_sge == 0 || | ||||||
| 	    srq_init_attr->attr.max_sge > ib_qib_max_srq_sges || | 	    srq_init_attr->attr.max_sge > ib_qib_max_srq_sges || | ||||||
| 	    srq_init_attr->attr.max_wr == 0 || | 	    srq_init_attr->attr.max_wr == 0 || | ||||||
|  |  | ||||||
|  | @ -1496,6 +1496,7 @@ static void ipoib_cm_create_srq(struct net_device *dev, int max_sge) | ||||||
| { | { | ||||||
| 	struct ipoib_dev_priv *priv = netdev_priv(dev); | 	struct ipoib_dev_priv *priv = netdev_priv(dev); | ||||||
| 	struct ib_srq_init_attr srq_init_attr = { | 	struct ib_srq_init_attr srq_init_attr = { | ||||||
|  | 		.srq_type = IB_SRQT_BASIC, | ||||||
| 		.attr = { | 		.attr = { | ||||||
| 			.max_wr  = ipoib_recvq_size, | 			.max_wr  = ipoib_recvq_size, | ||||||
| 			.max_sge = max_sge | 			.max_sge = max_sge | ||||||
|  |  | ||||||
|  | @ -523,6 +523,10 @@ enum ib_cq_notify_flags { | ||||||
| 	IB_CQ_REPORT_MISSED_EVENTS	= 1 << 2, | 	IB_CQ_REPORT_MISSED_EVENTS	= 1 << 2, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | enum ib_srq_type { | ||||||
|  | 	IB_SRQT_BASIC | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| enum ib_srq_attr_mask { | enum ib_srq_attr_mask { | ||||||
| 	IB_SRQ_MAX_WR	= 1 << 0, | 	IB_SRQ_MAX_WR	= 1 << 0, | ||||||
| 	IB_SRQ_LIMIT	= 1 << 1, | 	IB_SRQ_LIMIT	= 1 << 1, | ||||||
|  | @ -538,6 +542,7 @@ struct ib_srq_init_attr { | ||||||
| 	void		      (*event_handler)(struct ib_event *, void *); | 	void		      (*event_handler)(struct ib_event *, void *); | ||||||
| 	void		       *srq_context; | 	void		       *srq_context; | ||||||
| 	struct ib_srq_attr	attr; | 	struct ib_srq_attr	attr; | ||||||
|  | 	enum ib_srq_type	srq_type; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct ib_qp_cap { | struct ib_qp_cap { | ||||||
|  | @ -888,6 +893,7 @@ struct ib_srq { | ||||||
| 	struct ib_uobject      *uobject; | 	struct ib_uobject      *uobject; | ||||||
| 	void		      (*event_handler)(struct ib_event *, void *); | 	void		      (*event_handler)(struct ib_event *, void *); | ||||||
| 	void		       *srq_context; | 	void		       *srq_context; | ||||||
|  | 	enum ib_srq_type	srq_type; | ||||||
| 	atomic_t		usecnt; | 	atomic_t		usecnt; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sean Hefty
				Sean Hefty