RDMA/restrack: Support all QP types
authorLeon Romanovsky <leonro@mellanox.com>
Tue, 17 Nov 2020 07:01:48 +0000 (09:01 +0200)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 27 Nov 2020 15:38:46 +0000 (11:38 -0400)
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>
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_std_types_qp.c
drivers/infiniband/core/verbs.c
include/rdma/ib_verbs.h

index 7c4752c47f80efb788b2618adadfa9689e52f8f6..baa86c86efad5d3b750b00e9514e420dd901999f 100644 (file)
@@ -318,15 +318,12 @@ struct ib_device *ib_device_get_by_index(const struct net *net, u32 index);
 void nldev_init(void);
 void nldev_exit(void);
 
-static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
-                                         struct ib_pd *pd,
-                                         struct ib_qp_init_attr *attr,
-                                         struct ib_udata *udata,
-                                         struct ib_uqp_object *uobj)
+static inline struct ib_qp *
+_ib_create_qp(struct ib_device *dev, struct ib_pd *pd,
+             struct ib_qp_init_attr *attr, struct ib_udata *udata,
+             struct ib_uqp_object *uobj, const char *caller)
 {
-       enum ib_qp_type qp_type = attr->qp_type;
        struct ib_qp *qp;
-       bool is_xrc;
 
        if (!dev->ops.create_qp)
                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->rwq_ind_tbl = attr->rwq_ind_tbl;
        qp->event_handler = attr->event_handler;
-       qp->qp_type = attr->qp_type;
        qp->port = attr->port_num;
 
        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);
 
        rdma_restrack_new(&qp->res, RDMA_RESTRACK_QP);
-       /*
-        * We don't track XRC QPs for now, because they don't have PD
-        * and more importantly they are created internaly by driver,
-        * 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);
-       }
+       WARN_ONCE(!udata && !caller, "Missing kernel QP owner");
+       rdma_restrack_set_name(&qp->res, udata ? NULL : caller);
+       rdma_restrack_add(&qp->res);
        return qp;
 }
 
index 92c9d2a548f31ae42380893cb25a22f258595db9..402d0b8bf58e7225c99d364352a5324c4f897c62 100644 (file)
@@ -1400,8 +1400,8 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
        if (cmd->qp_type == IB_QPT_XRC_TGT)
                qp = ib_create_qp(pd, &attr);
        else
-               qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata,
-                                  obj);
+               qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata, obj,
+                                  NULL);
 
        if (IS_ERR(qp)) {
                ret = PTR_ERR(qp);
index 294cd29d5cede707bfa542d2815c20ff2352cbb3..c00cfb5ed3879cbdfd3b2e636bdf7fa2da6aad3d 100644 (file)
@@ -251,8 +251,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QP_CREATE)(
        if (attr.qp_type == IB_QPT_XRC_TGT)
                qp = ib_create_qp(pd, &attr);
        else
-               qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata,
-                                  obj);
+               qp = _ib_create_qp(device, pd, &attr, &attrs->driver_udata, obj,
+                                  NULL);
 
        if (IS_ERR(qp)) {
                ret = PTR_ERR(qp);
index 33778f8674a14580844874cf0d5dba0415f5862e..5d4c7c263665cb4ca475cd475e22cdfe15ae29f7 100644 (file)
@@ -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.
  * @pd: The protection domain associated with the QP.
  * @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!
  */
-struct ib_qp *ib_create_qp(struct ib_pd *pd,
-                          struct ib_qp_init_attr *qp_init_attr)
+struct ib_qp *ib_create_named_qp(struct ib_pd *pd,
+                                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_qp *qp;
@@ -1226,7 +1227,7 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
        if (qp_init_attr->cap.max_rdma_ctxs)
                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))
                return qp;
 
@@ -1292,7 +1293,7 @@ err:
        return ERR_PTR(ret);
 
 }
-EXPORT_SYMBOL(ib_create_qp);
+EXPORT_SYMBOL(ib_create_named_qp);
 
 static const struct {
        int                     valid;
index 174c1bffa00c8b39d1137edf4e8c6fac9116119e..7bee8abae35cf4c53426e566bba76141d83d1bfb 100644 (file)
@@ -3618,8 +3618,14 @@ static inline int ib_post_srq_recv(struct ib_srq *srq,
                                              bad_recv_wr ? : &dummy);
 }
 
-struct ib_qp *ib_create_qp(struct ib_pd *pd,
-                          struct ib_qp_init_attr *qp_init_attr);
+struct ib_qp *ib_create_named_qp(struct ib_pd *pd,
+                                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.