Commit 96104eda authored by Sean Hefty's avatar Sean Hefty Committed by Roland Dreier

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: default avatarSean Hefty <sean.hefty@intel.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 59991f94
...@@ -2013,6 +2013,7 @@ ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment