mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
RDMA/restrack: Support all QP types
The latest changes in restrack name handling allowed to simplify the QP creation code to support all types of QPs. For example XRC QP are presented with rdmatool. $ ibv_xsrq_pingpong & $ rdma res show qp link ibp0s9/1 lqpn 0 type SMI state RTS sq-psn 0 comm [ib_core] link ibp0s9/1 lqpn 1 type GSI state RTS sq-psn 0 comm [ib_core] link ibp0s9/1 lqpn 7 type UD state RTS sq-psn 0 comm [mlx5_ib] link ibp0s9/1 lqpn 42 type XRC_TGT state INIT sq-psn 0 path-mig-state MIGRATED comm [ib_uverbs] link ibp0s9/1 lqpn 43 type XRC_INI state INIT sq-psn 0 path-mig-state MIGRATED pdn 197 pid 419 comm ibv_xsrq_pingpong Link: https://lore.kernel.org/r/20201117070148.1974114-4-leon@kernel.org Reviewed-by: Mark Zhang <markz@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
2b1f747071
commit
66f57b871e
@ -318,15 +318,12 @@ struct ib_device *ib_device_get_by_index(const struct net *net, u32 index);
|
|||||||
void nldev_init(void);
|
void nldev_init(void);
|
||||||
void nldev_exit(void);
|
void nldev_exit(void);
|
||||||
|
|
||||||
static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
|
static inline struct ib_qp *
|
||||||
struct ib_pd *pd,
|
_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
|
||||||
struct ib_qp_init_attr *attr,
|
struct ib_qp_init_attr *attr, struct ib_udata *udata,
|
||||||
struct ib_udata *udata,
|
struct ib_uqp_object *uobj, const char *caller)
|
||||||
struct ib_uqp_object *uobj)
|
|
||||||
{
|
{
|
||||||
enum ib_qp_type qp_type = attr->qp_type;
|
|
||||||
struct ib_qp *qp;
|
struct ib_qp *qp;
|
||||||
bool is_xrc;
|
|
||||||
|
|
||||||
if (!dev->ops.create_qp)
|
if (!dev->ops.create_qp)
|
||||||
return ERR_PTR(-EOPNOTSUPP);
|
return ERR_PTR(-EOPNOTSUPP);
|
||||||
@ -347,7 +344,6 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
|
|||||||
qp->srq = attr->srq;
|
qp->srq = attr->srq;
|
||||||
qp->rwq_ind_tbl = attr->rwq_ind_tbl;
|
qp->rwq_ind_tbl = attr->rwq_ind_tbl;
|
||||||
qp->event_handler = attr->event_handler;
|
qp->event_handler = attr->event_handler;
|
||||||
qp->qp_type = attr->qp_type;
|
|
||||||
qp->port = attr->port_num;
|
qp->port = attr->port_num;
|
||||||
|
|
||||||
atomic_set(&qp->usecnt, 0);
|
atomic_set(&qp->usecnt, 0);
|
||||||
@ -356,16 +352,9 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
|
|||||||
INIT_LIST_HEAD(&qp->sig_mrs);
|
INIT_LIST_HEAD(&qp->sig_mrs);
|
||||||
|
|
||||||
rdma_restrack_new(&qp->res, RDMA_RESTRACK_QP);
|
rdma_restrack_new(&qp->res, RDMA_RESTRACK_QP);
|
||||||
/*
|
WARN_ONCE(!udata && !caller, "Missing kernel QP owner");
|
||||||
* We don't track XRC QPs for now, because they don't have PD
|
rdma_restrack_set_name(&qp->res, udata ? NULL : caller);
|
||||||
* and more importantly they are created internaly by driver,
|
rdma_restrack_add(&qp->res);
|
||||||
* see mlx5 create_dev_resources() as an example.
|
|
||||||
*/
|
|
||||||
is_xrc = qp_type == IB_QPT_XRC_INI || qp_type == IB_QPT_XRC_TGT;
|
|
||||||
if ((qp_type < IB_QPT_MAX && !is_xrc) || qp_type == IB_QPT_DRIVER) {
|
|
||||||
rdma_restrack_parent_name(&qp->res, &pd->res);
|
|
||||||
rdma_restrack_add(&qp->res);
|
|
||||||
}
|
|
||||||
return qp;
|
return qp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1400,8 +1400,8 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
|
|||||||
if (cmd->qp_type == IB_QPT_XRC_TGT)
|
if (cmd->qp_type == IB_QPT_XRC_TGT)
|
||||||
qp = ib_create_qp(pd, &attr);
|
qp = ib_create_qp(pd, &attr);
|
||||||
else
|
else
|
||||||
qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata,
|
qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata, obj,
|
||||||
obj);
|
NULL);
|
||||||
|
|
||||||
if (IS_ERR(qp)) {
|
if (IS_ERR(qp)) {
|
||||||
ret = PTR_ERR(qp);
|
ret = PTR_ERR(qp);
|
||||||
|
@ -251,8 +251,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(
|
|||||||
if (attr.qp_type == IB_QPT_XRC_TGT)
|
if (attr.qp_type == IB_QPT_XRC_TGT)
|
||||||
qp = ib_create_qp(pd, &attr);
|
qp = ib_create_qp(pd, &attr);
|
||||||
else
|
else
|
||||||
qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata,
|
qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata, obj,
|
||||||
obj);
|
NULL);
|
||||||
|
|
||||||
if (IS_ERR(qp)) {
|
if (IS_ERR(qp)) {
|
||||||
ret = PTR_ERR(qp);
|
ret = PTR_ERR(qp);
|
||||||
|
@ -1191,7 +1191,7 @@ static struct ib_qp *create_xrc_qp_user(struct ib_qp *qp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ib_create_qp - Creates a kernel QP associated with the specified protection
|
* ib_create_named_qp - Creates a kernel QP associated with the specified protection
|
||||||
* domain.
|
* domain.
|
||||||
* @pd: The protection domain associated with the QP.
|
* @pd: The protection domain associated with the QP.
|
||||||
* @qp_init_attr: A list of initial attributes required to create the
|
* @qp_init_attr: A list of initial attributes required to create the
|
||||||
@ -1200,8 +1200,9 @@ static struct ib_qp *create_xrc_qp_user(struct ib_qp *qp,
|
|||||||
*
|
*
|
||||||
* NOTE: for user qp use ib_create_qp_user with valid udata!
|
* NOTE: for user qp use ib_create_qp_user with valid udata!
|
||||||
*/
|
*/
|
||||||
struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
struct ib_qp *ib_create_named_qp(struct ib_pd *pd,
|
||||||
struct ib_qp_init_attr *qp_init_attr)
|
struct ib_qp_init_attr *qp_init_attr,
|
||||||
|
const char *caller)
|
||||||
{
|
{
|
||||||
struct ib_device *device = pd ? pd->device : qp_init_attr->xrcd->device;
|
struct ib_device *device = pd ? pd->device : qp_init_attr->xrcd->device;
|
||||||
struct ib_qp *qp;
|
struct ib_qp *qp;
|
||||||
@ -1226,7 +1227,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
|||||||
if (qp_init_attr->cap.max_rdma_ctxs)
|
if (qp_init_attr->cap.max_rdma_ctxs)
|
||||||
rdma_rw_init_qp(device, qp_init_attr);
|
rdma_rw_init_qp(device, qp_init_attr);
|
||||||
|
|
||||||
qp = _ib_create_qp(device, pd, qp_init_attr, NULL, NULL);
|
qp = _ib_create_qp(device, pd, qp_init_attr, NULL, NULL, caller);
|
||||||
if (IS_ERR(qp))
|
if (IS_ERR(qp))
|
||||||
return qp;
|
return qp;
|
||||||
|
|
||||||
@ -1292,7 +1293,7 @@ err:
|
|||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ib_create_qp);
|
EXPORT_SYMBOL(ib_create_named_qp);
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
int valid;
|
int valid;
|
||||||
|
@ -3618,8 +3618,14 @@ static inline int ib_post_srq_recv(struct ib_srq *srq,
|
|||||||
bad_recv_wr ? : &dummy);
|
bad_recv_wr ? : &dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
struct ib_qp *ib_create_named_qp(struct ib_pd *pd,
|
||||||
struct ib_qp_init_attr *qp_init_attr);
|
struct ib_qp_init_attr *qp_init_attr,
|
||||||
|
const char *caller);
|
||||||
|
static inline struct ib_qp *ib_create_qp(struct ib_pd *pd,
|
||||||
|
struct ib_qp_init_attr *init_attr)
|
||||||
|
{
|
||||||
|
return ib_create_named_qp(pd, init_attr, KBUILD_MODNAME);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ib_modify_qp_with_udata - Modifies the attributes for the specified QP.
|
* ib_modify_qp_with_udata - Modifies the attributes for the specified QP.
|
||||||
|
Loading…
Reference in New Issue
Block a user