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
|
@ -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…
Reference in New Issue