net/mlx5e: Add cq info to tx reporter diagnose
authorAya Levin <ayal@mellanox.com>
Sun, 30 Jun 2019 12:08:00 +0000 (15:08 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 20 Aug 2019 20:08:16 +0000 (13:08 -0700)
Add cq information to general diagnose output: CQ size and stride size.
Per SQ add information about the related CQ: cqn and CQ's HW status.

$ devlink health diagnose pci/0000:00:0b.0 reporter tx
 Common Config:
   SQ:
     stride size: 64 size: 1024
   CQ:
     stride size: 64 size: 1024
 SQs:
   channel ix: 0 tc: 0 txq ix: 0 sqn: 4307 HW state: 1 stopped: false cc: 0 pc: 0
   CQ:
     cqn: 1030 HW status: 0
   channel ix: 1 tc: 0 txq ix: 1 sqn: 4312 HW state: 1 stopped: false cc: 0 pc: 0
   CQ:
     cqn: 1034 HW status: 0
   channel ix: 2 tc: 0 txq ix: 2 sqn: 4317 HW state: 1 stopped: false cc: 0 pc: 0
   CQ:
     cqn: 1038 HW status: 0
   channel ix: 3 tc: 0 txq ix: 3 sqn: 4322 HW state: 1 stopped: false cc: 0 pc: 0
   CQ:
     cqn: 1042 HW status: 0

$ devlink health diagnose pci/0000:00:0b.0 reporter tx -jp
{
    "Common Config": {
        "SQ": {
            "stride size": 64,
            "size": 1024
        },
        "CQ": {
            "stride size": 64,
            "size": 1024
        }
    },
    "SQs": [ {
            "channel ix": 0,
            "tc": 0,
            "txq ix": 0,
            "sqn": 4307,
            "HW state": 1,
            "stopped": false,
            "cc": 0,
            "pc": 0,
            "CQ": {
                "cqn": 1030,
                "HW status": 0
            }
        },{
            "channel ix": 1,
            "tc": 0,
            "txq ix": 1,
            "sqn": 4312,
            "HW state": 1,
            "stopped": false,
            "cc": 0,
            "pc": 0,
            "CQ": {
                "cqn": 1034,
                "HW status": 0
            }
        },{
            "channel ix": 2,
            "tc": 0,
            "txq ix": 2,
            "sqn": 4317,
            "HW state": 1,
            "stopped": false,
            "cc": 0,
            "pc": 0,
            "CQ": {
                "cqn": 1038,
                "HW status": 0
            }
        },{
            "channel ix": 3,
            "tc": 0,
            "txq ix": 3,
            "sqn": 4322,
            "HW state": 1,
            "stopped": false,
            "cc": 0,
            "pc": 0,
            "CQ": {
                "cqn": 1042,
                "HW status": 0
        } ]
}

Signed-off-by: Aya Levin <ayal@mellanox.com>
Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en/health.c
drivers/net/ethernet/mellanox/mlx5/core/en/health.h
drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c
drivers/net/ethernet/mellanox/mlx5/core/wq.c
drivers/net/ethernet/mellanox/mlx5/core/wq.h

index dab563f0715746daa1fc63a91c9be111972f43cf..ffd9a7a165a2123a2cf1e54ff9ee311c8d211a76 100644 (file)
@@ -34,6 +34,68 @@ int mlx5e_reporter_named_obj_nest_end(struct devlink_fmsg *fmsg)
        return 0;
 }
 
+int mlx5e_reporter_cq_diagnose(struct mlx5e_cq *cq, struct devlink_fmsg *fmsg)
+{
+       struct mlx5e_priv *priv = cq->channel->priv;
+       u32 out[MLX5_ST_SZ_DW(query_cq_out)] = {};
+       u8 hw_status;
+       void *cqc;
+       int err;
+
+       err = mlx5_core_query_cq(priv->mdev, &cq->mcq, out, sizeof(out));
+       if (err)
+               return err;
+
+       cqc = MLX5_ADDR_OF(query_cq_out, out, cq_context);
+       hw_status = MLX5_GET(cqc, cqc, status);
+
+       err = mlx5e_reporter_named_obj_nest_start(fmsg, "CQ");
+       if (err)
+               return err;
+
+       err = devlink_fmsg_u32_pair_put(fmsg, "cqn", cq->mcq.cqn);
+       if (err)
+               return err;
+
+       err = devlink_fmsg_u8_pair_put(fmsg, "HW status", hw_status);
+       if (err)
+               return err;
+
+       err = mlx5e_reporter_named_obj_nest_end(fmsg);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+int mlx5e_reporter_cq_common_diagnose(struct mlx5e_cq *cq, struct devlink_fmsg *fmsg)
+{
+       u8 cq_log_stride;
+       u32 cq_sz;
+       int err;
+
+       cq_sz = mlx5_cqwq_get_size(&cq->wq);
+       cq_log_stride = mlx5_cqwq_get_log_stride_size(&cq->wq);
+
+       err = mlx5e_reporter_named_obj_nest_start(fmsg, "CQ");
+       if (err)
+               return err;
+
+       err = devlink_fmsg_u64_pair_put(fmsg, "stride size", BIT(cq_log_stride));
+       if (err)
+               return err;
+
+       err = devlink_fmsg_u32_pair_put(fmsg, "size", cq_sz);
+       if (err)
+               return err;
+
+       err = mlx5e_reporter_named_obj_nest_end(fmsg);
+       if (err)
+               return err;
+
+       return 0;
+}
+
 int mlx5e_health_sq_to_ready(struct mlx5e_channel *channel, u32 sqn)
 {
        struct mlx5_core_dev *mdev = channel->mdev;
index 112771ad516c769db143327bd93eba8a0bab7758..6725d417aaf5fe53c9c40786ae2a42bd3ae4aee2 100644 (file)
@@ -11,6 +11,8 @@ void mlx5e_reporter_tx_destroy(struct mlx5e_priv *priv);
 void mlx5e_reporter_tx_err_cqe(struct mlx5e_txqsq *sq);
 int mlx5e_reporter_tx_timeout(struct mlx5e_txqsq *sq);
 
+int mlx5e_reporter_cq_diagnose(struct mlx5e_cq *cq, struct devlink_fmsg *fmsg);
+int mlx5e_reporter_cq_common_diagnose(struct mlx5e_cq *cq, struct devlink_fmsg *fmsg);
 int mlx5e_reporter_named_obj_nest_start(struct devlink_fmsg *fmsg, char *name);
 int mlx5e_reporter_named_obj_nest_end(struct devlink_fmsg *fmsg);
 
index a5d0fcbb85afa3a8ff3d643c2209f5c005a5839e..bfed558637c2ea9d164ecd509312198195e8b926 100644 (file)
@@ -193,6 +193,10 @@ mlx5e_tx_reporter_build_diagnose_output(struct devlink_fmsg *fmsg,
        if (err)
                return err;
 
+       err = mlx5e_reporter_cq_diagnose(&sq->cq, fmsg);
+       if (err)
+               return err;
+
        err = devlink_fmsg_obj_nest_end(fmsg);
        if (err)
                return err;
@@ -233,6 +237,10 @@ static int mlx5e_tx_reporter_diagnose(struct devlink_health_reporter *reporter,
        if (err)
                goto unlock;
 
+       err = mlx5e_reporter_cq_common_diagnose(&generic_sq->cq, fmsg);
+       if (err)
+               goto unlock;
+
        err = mlx5e_reporter_named_obj_nest_end(fmsg);
        if (err)
                goto unlock;
index 953cc8efba695aab4a3703815b2a0bdf83ab4623..dd2315ce4441fefe5db27fdcd5c75bf8e6d9e1be 100644 (file)
@@ -44,6 +44,11 @@ u32 mlx5_cqwq_get_size(struct mlx5_cqwq *wq)
        return wq->fbc.sz_m1 + 1;
 }
 
+u8 mlx5_cqwq_get_log_stride_size(struct mlx5_cqwq *wq)
+{
+       return wq->fbc.log_stride;
+}
+
 u32 mlx5_wq_ll_get_size(struct mlx5_wq_ll *wq)
 {
        return (u32)wq->fbc.sz_m1 + 1;
index f1ec58c9e9e3cffb47056d35571d70e3277e183b..55791f71a7785f461d34fa8b52c7babe85145e5b 100644 (file)
@@ -89,6 +89,7 @@ int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
                     void *cqc, struct mlx5_cqwq *wq,
                     struct mlx5_wq_ctrl *wq_ctrl);
 u32 mlx5_cqwq_get_size(struct mlx5_cqwq *wq);
+u8 mlx5_cqwq_get_log_stride_size(struct mlx5_cqwq *wq);
 
 int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
                      void *wqc, struct mlx5_wq_ll *wq,