]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
IB/mlx5: Change debugfs to have per port contents
authorParav Pandit <parav@mellanox.com>
Thu, 4 Jan 2018 15:25:39 +0000 (17:25 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 8 Jan 2018 18:42:22 +0000 (11:42 -0700)
When there are multiple ports for single IB(RoCE) device, support
debugfs entries to be available for each port.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Daniel Jurgens <danielj@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/cong.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h

index 2d32b519bb611b8f58a7645ed8cd27caa9e8dee5..985fa2637390ef51e42a7a2c593d6054d9e866ae 100644 (file)
@@ -247,21 +247,30 @@ static void mlx5_ib_set_cc_param_mask_val(void *field, int offset,
        }
 }
 
-static int mlx5_ib_get_cc_params(struct mlx5_ib_dev *dev, int offset, u32 *var)
+static int mlx5_ib_get_cc_params(struct mlx5_ib_dev *dev, u8 port_num,
+                                int offset, u32 *var)
 {
        int outlen = MLX5_ST_SZ_BYTES(query_cong_params_out);
        void *out;
        void *field;
        int err;
        enum mlx5_ib_cong_node_type node;
+       struct mlx5_core_dev *mdev;
+
+       /* Takes a 1-based port number */
+       mdev = mlx5_ib_get_native_port_mdev(dev, port_num + 1, NULL);
+       if (!mdev)
+               return -ENODEV;
 
        out = kvzalloc(outlen, GFP_KERNEL);
-       if (!out)
-               return -ENOMEM;
+       if (!out) {
+               err = -ENOMEM;
+               goto alloc_err;
+       }
 
        node = mlx5_ib_param_to_node(offset);
 
-       err = mlx5_cmd_query_cong_params(dev->mdev, node, out, outlen);
+       err = mlx5_cmd_query_cong_params(mdev, node, out, outlen);
        if (err)
                goto free;
 
@@ -270,21 +279,32 @@ static int mlx5_ib_get_cc_params(struct mlx5_ib_dev *dev, int offset, u32 *var)
 
 free:
        kvfree(out);
+alloc_err:
+       mlx5_ib_put_native_port_mdev(dev, port_num + 1);
        return err;
 }
 
-static int mlx5_ib_set_cc_params(struct mlx5_ib_dev *dev, int offset, u32 var)
+static int mlx5_ib_set_cc_params(struct mlx5_ib_dev *dev, u8 port_num,
+                                int offset, u32 var)
 {
        int inlen = MLX5_ST_SZ_BYTES(modify_cong_params_in);
        void *in;
        void *field;
        enum mlx5_ib_cong_node_type node;
+       struct mlx5_core_dev *mdev;
        u32 attr_mask = 0;
        int err;
 
+       /* Takes a 1-based port number */
+       mdev = mlx5_ib_get_native_port_mdev(dev, port_num + 1, NULL);
+       if (!mdev)
+               return -ENODEV;
+
        in = kvzalloc(inlen, GFP_KERNEL);
-       if (!in)
-               return -ENOMEM;
+       if (!in) {
+               err = -ENOMEM;
+               goto alloc_err;
+       }
 
        MLX5_SET(modify_cong_params_in, in, opcode,
                 MLX5_CMD_OP_MODIFY_CONG_PARAMS);
@@ -299,8 +319,10 @@ static int mlx5_ib_set_cc_params(struct mlx5_ib_dev *dev, int offset, u32 var)
        MLX5_SET(field_select_r_roce_rp, field, field_select_r_roce_rp,
                 attr_mask);
 
-       err = mlx5_cmd_modify_cong_params(dev->mdev, in, inlen);
+       err = mlx5_cmd_modify_cong_params(mdev, in, inlen);
        kvfree(in);
+alloc_err:
+       mlx5_ib_put_native_port_mdev(dev, port_num + 1);
        return err;
 }
 
@@ -324,7 +346,7 @@ static ssize_t set_param(struct file *filp, const char __user *buf,
        if (kstrtou32(lbuf, 0, &var))
                return -EINVAL;
 
-       ret = mlx5_ib_set_cc_params(param->dev, offset, var);
+       ret = mlx5_ib_set_cc_params(param->dev, param->port_num, offset, var);
        return ret ? ret : count;
 }
 
@@ -340,7 +362,7 @@ static ssize_t get_param(struct file *filp, char __user *buf, size_t count,
        if (*pos)
                return 0;
 
-       ret = mlx5_ib_get_cc_params(param->dev, offset, &var);
+       ret = mlx5_ib_get_cc_params(param->dev, param->port_num, offset, &var);
        if (ret)
                return ret;
 
@@ -362,44 +384,51 @@ static const struct file_operations dbg_cc_fops = {
        .read   = get_param,
 };
 
-void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev)
+void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num)
 {
        if (!mlx5_debugfs_root ||
-           !dev->dbg_cc_params ||
-           !dev->dbg_cc_params->root)
+           !dev->port[port_num].dbg_cc_params ||
+           !dev->port[port_num].dbg_cc_params->root)
                return;
 
-       debugfs_remove_recursive(dev->dbg_cc_params->root);
-       kfree(dev->dbg_cc_params);
-       dev->dbg_cc_params = NULL;
+       debugfs_remove_recursive(dev->port[port_num].dbg_cc_params->root);
+       kfree(dev->port[port_num].dbg_cc_params);
+       dev->port[port_num].dbg_cc_params = NULL;
 }
 
-int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev)
+int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num)
 {
        struct mlx5_ib_dbg_cc_params *dbg_cc_params;
+       struct mlx5_core_dev *mdev;
        int i;
 
        if (!mlx5_debugfs_root)
                goto out;
 
-       if (!MLX5_CAP_GEN(dev->mdev, cc_query_allowed) ||
-           !MLX5_CAP_GEN(dev->mdev, cc_modify_allowed))
+       /* Takes a 1-based port number */
+       mdev = mlx5_ib_get_native_port_mdev(dev, port_num + 1, NULL);
+       if (!mdev)
                goto out;
 
+       if (!MLX5_CAP_GEN(mdev, cc_query_allowed) ||
+           !MLX5_CAP_GEN(mdev, cc_modify_allowed))
+               goto put_mdev;
+
        dbg_cc_params = kzalloc(sizeof(*dbg_cc_params), GFP_KERNEL);
        if (!dbg_cc_params)
-               goto out;
+               goto err;
 
-       dev->dbg_cc_params = dbg_cc_params;
+       dev->port[port_num].dbg_cc_params = dbg_cc_params;
 
        dbg_cc_params->root = debugfs_create_dir("cc_params",
-                                                dev->mdev->priv.dbg_root);
+                                                mdev->priv.dbg_root);
        if (!dbg_cc_params->root)
                goto err;
 
        for (i = 0; i < MLX5_IB_DBG_CC_MAX; i++) {
                dbg_cc_params->params[i].offset = i;
                dbg_cc_params->params[i].dev = dev;
+               dbg_cc_params->params[i].port_num = port_num;
                dbg_cc_params->params[i].dentry =
                        debugfs_create_file(mlx5_ib_dbg_cc_name[i],
                                            0600, dbg_cc_params->root,
@@ -408,11 +437,17 @@ int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev)
                if (!dbg_cc_params->params[i].dentry)
                        goto err;
        }
-out:   return 0;
+
+put_mdev:
+       mlx5_ib_put_native_port_mdev(dev, port_num + 1);
+out:
+       return 0;
 
 err:
        mlx5_ib_warn(dev, "cong debugfs failure\n");
-       mlx5_ib_cleanup_cong_debugfs(dev);
+       mlx5_ib_cleanup_cong_debugfs(dev, port_num);
+       mlx5_ib_put_native_port_mdev(dev, port_num + 1);
+
        /*
         * We don't want to fail driver if debugfs failed to initialize,
         * so we are not forwarding error to the user.
index 59e26901d935ff29d36c8f84092c24968f6eed5d..2ced365e824719106cdf6faeb389a56cfd50c28a 100644 (file)
@@ -4254,6 +4254,8 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
        int err;
        int i;
 
+       mlx5_ib_cleanup_cong_debugfs(ibdev, port_num);
+
        spin_lock(&port->mp.mpi_lock);
        if (!mpi->ibdev) {
                spin_unlock(&port->mp.mpi_lock);
@@ -4331,6 +4333,10 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
                goto unbind;
        }
 
+       err = mlx5_ib_init_cong_debugfs(ibdev, port_num);
+       if (err)
+               goto unbind;
+
        return true;
 
 unbind:
@@ -4748,12 +4754,14 @@ static void mlx5_ib_stage_counters_cleanup(struct mlx5_ib_dev *dev)
 
 static int mlx5_ib_stage_cong_debugfs_init(struct mlx5_ib_dev *dev)
 {
-       return mlx5_ib_init_cong_debugfs(dev);
+       return mlx5_ib_init_cong_debugfs(dev,
+                                        mlx5_core_native_port_num(dev->mdev) - 1);
 }
 
 static void mlx5_ib_stage_cong_debugfs_cleanup(struct mlx5_ib_dev *dev)
 {
-       mlx5_ib_cleanup_cong_debugfs(dev);
+       mlx5_ib_cleanup_cong_debugfs(dev,
+                                    mlx5_core_native_port_num(dev->mdev) - 1);
 }
 
 static int mlx5_ib_stage_uar_init(struct mlx5_ib_dev *dev)
index a70a4c02e3969b3e5f0b206032c55e7d2ca8d4c2..92faba9a47af6531850af6966bdfdd49d01f2873 100644 (file)
@@ -665,6 +665,7 @@ struct mlx5_ib_multiport {
 struct mlx5_ib_port {
        struct mlx5_ib_counters cnts;
        struct mlx5_ib_multiport mp;
+       struct mlx5_ib_dbg_cc_params    *dbg_cc_params;
 };
 
 struct mlx5_roce {
@@ -684,6 +685,7 @@ struct mlx5_ib_dbg_param {
        int                     offset;
        struct mlx5_ib_dev      *dev;
        struct dentry           *dentry;
+       u8                      port_num;
 };
 
 enum mlx5_ib_dbg_cc_types {
@@ -813,7 +815,6 @@ struct mlx5_ib_dev {
        struct mlx5_sq_bfreg    bfreg;
        struct mlx5_sq_bfreg    fp_bfreg;
        struct mlx5_ib_delay_drop       delay_drop;
-       struct mlx5_ib_dbg_cc_params    *dbg_cc_params;
        const struct mlx5_ib_profile    *profile;
 
        /* protect the user_td */
@@ -1071,8 +1072,8 @@ __be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev, u8 port_num,
 int mlx5_get_roce_gid_type(struct mlx5_ib_dev *dev, u8 port_num,
                           int index, enum ib_gid_type *gid_type);
 
-void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev);
-int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev);
+void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
+int mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
 
 /* GSI QP helper functions */
 struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,