Skip to content

Commit 5a87279

Browse files
Chengchang Tangrleon
authored andcommitted
RDMA/hns: Support hns HW stats
Support query hns HW stats for rdma-tool to help debugging. Signed-off-by: Chengchang Tang <[email protected]> Signed-off-by: Junxian Huang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]>
1 parent c4bb187 commit 5a87279

File tree

4 files changed

+159
-0
lines changed

4 files changed

+159
-0
lines changed

drivers/infiniband/hw/hns/hns_roce_device.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,32 @@ enum hns_roce_device_state {
840840
HNS_ROCE_DEVICE_STATE_UNINIT,
841841
};
842842

843+
enum hns_roce_hw_pkt_stat_index {
844+
HNS_ROCE_HW_RX_RC_PKT_CNT,
845+
HNS_ROCE_HW_RX_UC_PKT_CNT,
846+
HNS_ROCE_HW_RX_UD_PKT_CNT,
847+
HNS_ROCE_HW_RX_XRC_PKT_CNT,
848+
HNS_ROCE_HW_RX_PKT_CNT,
849+
HNS_ROCE_HW_RX_ERR_PKT_CNT,
850+
HNS_ROCE_HW_RX_CNP_PKT_CNT,
851+
HNS_ROCE_HW_TX_RC_PKT_CNT,
852+
HNS_ROCE_HW_TX_UC_PKT_CNT,
853+
HNS_ROCE_HW_TX_UD_PKT_CNT,
854+
HNS_ROCE_HW_TX_XRC_PKT_CNT,
855+
HNS_ROCE_HW_TX_PKT_CNT,
856+
HNS_ROCE_HW_TX_ERR_PKT_CNT,
857+
HNS_ROCE_HW_TX_CNP_PKT_CNT,
858+
HNS_ROCE_HW_TRP_GET_MPT_ERR_PKT_CNT,
859+
HNS_ROCE_HW_TRP_GET_IRRL_ERR_PKT_CNT,
860+
HNS_ROCE_HW_ECN_DB_CNT,
861+
HNS_ROCE_HW_RX_BUF_CNT,
862+
HNS_ROCE_HW_TRP_RX_SOF_CNT,
863+
HNS_ROCE_HW_CQ_CQE_CNT,
864+
HNS_ROCE_HW_CQ_POE_CNT,
865+
HNS_ROCE_HW_CQ_NOTIFY_CNT,
866+
HNS_ROCE_HW_CNT_TOTAL
867+
};
868+
843869
struct hns_roce_hw {
844870
int (*cmq_init)(struct hns_roce_dev *hr_dev);
845871
void (*cmq_exit)(struct hns_roce_dev *hr_dev);
@@ -882,6 +908,8 @@ struct hns_roce_hw {
882908
int (*query_cqc)(struct hns_roce_dev *hr_dev, u32 cqn, void *buffer);
883909
int (*query_qpc)(struct hns_roce_dev *hr_dev, u32 qpn, void *buffer);
884910
int (*query_mpt)(struct hns_roce_dev *hr_dev, u32 key, void *buffer);
911+
int (*query_hw_counter)(struct hns_roce_dev *hr_dev,
912+
u64 *stats, u32 port, int *hw_counters);
885913
const struct ib_device_ops *hns_roce_dev_ops;
886914
const struct ib_device_ops *hns_roce_dev_srq_ops;
887915
};

drivers/infiniband/hw/hns/hns_roce_hw_v2.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,6 +1613,56 @@ static int hns_roce_query_func_info(struct hns_roce_dev *hr_dev)
16131613
return 0;
16141614
}
16151615

1616+
static int hns_roce_hw_v2_query_counter(struct hns_roce_dev *hr_dev,
1617+
u64 *stats, u32 port, int *num_counters)
1618+
{
1619+
#define CNT_PER_DESC 3
1620+
struct hns_roce_cmq_desc *desc;
1621+
int bd_idx, cnt_idx;
1622+
__le64 *cnt_data;
1623+
int desc_num;
1624+
int ret;
1625+
int i;
1626+
1627+
if (port > hr_dev->caps.num_ports)
1628+
return -EINVAL;
1629+
1630+
desc_num = DIV_ROUND_UP(HNS_ROCE_HW_CNT_TOTAL, CNT_PER_DESC);
1631+
desc = kcalloc(desc_num, sizeof(*desc), GFP_KERNEL);
1632+
if (!desc)
1633+
return -ENOMEM;
1634+
1635+
for (i = 0; i < desc_num; i++) {
1636+
hns_roce_cmq_setup_basic_desc(&desc[i],
1637+
HNS_ROCE_OPC_QUERY_COUNTER, true);
1638+
if (i != desc_num - 1)
1639+
desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1640+
}
1641+
1642+
ret = hns_roce_cmq_send(hr_dev, desc, desc_num);
1643+
if (ret) {
1644+
ibdev_err(&hr_dev->ib_dev,
1645+
"failed to get counter, ret = %d.\n", ret);
1646+
goto err_out;
1647+
}
1648+
1649+
for (i = 0; i < HNS_ROCE_HW_CNT_TOTAL && i < *num_counters; i++) {
1650+
bd_idx = i / CNT_PER_DESC;
1651+
if (!(desc[bd_idx].flag & HNS_ROCE_CMD_FLAG_NEXT) &&
1652+
bd_idx != HNS_ROCE_HW_CNT_TOTAL / CNT_PER_DESC)
1653+
break;
1654+
1655+
cnt_data = (__le64 *)&desc[bd_idx].data[0];
1656+
cnt_idx = i % CNT_PER_DESC;
1657+
stats[i] = le64_to_cpu(cnt_data[cnt_idx]);
1658+
}
1659+
*num_counters = i;
1660+
1661+
err_out:
1662+
kfree(desc);
1663+
return ret;
1664+
}
1665+
16161666
static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
16171667
{
16181668
struct hns_roce_cmq_desc desc;
@@ -6582,6 +6632,7 @@ static const struct hns_roce_hw hns_roce_hw_v2 = {
65826632
.query_cqc = hns_roce_v2_query_cqc,
65836633
.query_qpc = hns_roce_v2_query_qpc,
65846634
.query_mpt = hns_roce_v2_query_mpt,
6635+
.query_hw_counter = hns_roce_hw_v2_query_counter,
65856636
.hns_roce_dev_ops = &hns_roce_v2_dev_ops,
65866637
.hns_roce_dev_srq_ops = &hns_roce_v2_dev_srq_ops,
65876638
};

drivers/infiniband/hw/hns/hns_roce_hw_v2.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ enum hns_roce_opcode_type {
198198
HNS_ROCE_OPC_QUERY_HW_VER = 0x8000,
199199
HNS_ROCE_OPC_CFG_GLOBAL_PARAM = 0x8001,
200200
HNS_ROCE_OPC_ALLOC_PF_RES = 0x8004,
201+
HNS_ROCE_OPC_QUERY_COUNTER = 0x8206,
201202
HNS_ROCE_OPC_QUERY_PF_RES = 0x8400,
202203
HNS_ROCE_OPC_ALLOC_VF_RES = 0x8401,
203204
HNS_ROCE_OPC_CFG_EXT_LLM = 0x8403,

drivers/infiniband/hw/hns/hns_roce_main.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,83 @@ static void hns_roce_get_fw_ver(struct ib_device *device, char *str)
515515
sub_minor);
516516
}
517517

518+
#define HNS_ROCE_HW_CNT(ename, cname) \
519+
[HNS_ROCE_HW_##ename##_CNT].name = cname
520+
521+
static const struct rdma_stat_desc hns_roce_port_stats_descs[] = {
522+
HNS_ROCE_HW_CNT(RX_RC_PKT, "rx_rc_pkt"),
523+
HNS_ROCE_HW_CNT(RX_UC_PKT, "rx_uc_pkt"),
524+
HNS_ROCE_HW_CNT(RX_UD_PKT, "rx_ud_pkt"),
525+
HNS_ROCE_HW_CNT(RX_XRC_PKT, "rx_xrc_pkt"),
526+
HNS_ROCE_HW_CNT(RX_PKT, "rx_pkt"),
527+
HNS_ROCE_HW_CNT(RX_ERR_PKT, "rx_err_pkt"),
528+
HNS_ROCE_HW_CNT(RX_CNP_PKT, "rx_cnp_pkt"),
529+
HNS_ROCE_HW_CNT(TX_RC_PKT, "tx_rc_pkt"),
530+
HNS_ROCE_HW_CNT(TX_UC_PKT, "tx_uc_pkt"),
531+
HNS_ROCE_HW_CNT(TX_UD_PKT, "tx_ud_pkt"),
532+
HNS_ROCE_HW_CNT(TX_XRC_PKT, "tx_xrc_pkt"),
533+
HNS_ROCE_HW_CNT(TX_PKT, "tx_pkt"),
534+
HNS_ROCE_HW_CNT(TX_ERR_PKT, "tx_err_pkt"),
535+
HNS_ROCE_HW_CNT(TX_CNP_PKT, "tx_cnp_pkt"),
536+
HNS_ROCE_HW_CNT(TRP_GET_MPT_ERR_PKT, "trp_get_mpt_err_pkt"),
537+
HNS_ROCE_HW_CNT(TRP_GET_IRRL_ERR_PKT, "trp_get_irrl_err_pkt"),
538+
HNS_ROCE_HW_CNT(ECN_DB, "ecn_doorbell"),
539+
HNS_ROCE_HW_CNT(RX_BUF, "rx_buffer"),
540+
HNS_ROCE_HW_CNT(TRP_RX_SOF, "trp_rx_sof"),
541+
HNS_ROCE_HW_CNT(CQ_CQE, "cq_cqe"),
542+
HNS_ROCE_HW_CNT(CQ_POE, "cq_poe"),
543+
HNS_ROCE_HW_CNT(CQ_NOTIFY, "cq_notify"),
544+
};
545+
546+
static struct rdma_hw_stats *hns_roce_alloc_hw_port_stats(
547+
struct ib_device *device, u32 port_num)
548+
{
549+
struct hns_roce_dev *hr_dev = to_hr_dev(device);
550+
u32 port = port_num - 1;
551+
552+
if (port > hr_dev->caps.num_ports) {
553+
ibdev_err(device, "invalid port num.\n");
554+
return NULL;
555+
}
556+
557+
if (hr_dev->pci_dev->revision <= PCI_REVISION_ID_HIP08 ||
558+
hr_dev->is_vf)
559+
return NULL;
560+
561+
return rdma_alloc_hw_stats_struct(hns_roce_port_stats_descs,
562+
ARRAY_SIZE(hns_roce_port_stats_descs),
563+
RDMA_HW_STATS_DEFAULT_LIFESPAN);
564+
}
565+
566+
static int hns_roce_get_hw_stats(struct ib_device *device,
567+
struct rdma_hw_stats *stats,
568+
u32 port, int index)
569+
{
570+
struct hns_roce_dev *hr_dev = to_hr_dev(device);
571+
int num_counters = HNS_ROCE_HW_CNT_TOTAL;
572+
int ret;
573+
574+
if (port == 0)
575+
return 0;
576+
577+
if (port > hr_dev->caps.num_ports)
578+
return -EINVAL;
579+
580+
if (hr_dev->pci_dev->revision <= PCI_REVISION_ID_HIP08 ||
581+
hr_dev->is_vf)
582+
return -EOPNOTSUPP;
583+
584+
ret = hr_dev->hw->query_hw_counter(hr_dev, stats->value, port,
585+
&num_counters);
586+
if (ret) {
587+
ibdev_err(device, "failed to query hw counter, ret = %d\n",
588+
ret);
589+
return ret;
590+
}
591+
592+
return num_counters;
593+
}
594+
518595
static void hns_roce_unregister_device(struct hns_roce_dev *hr_dev)
519596
{
520597
struct hns_roce_ib_iboe *iboe = &hr_dev->iboe;
@@ -557,6 +634,8 @@ static const struct ib_device_ops hns_roce_dev_ops = {
557634
.query_pkey = hns_roce_query_pkey,
558635
.query_port = hns_roce_query_port,
559636
.reg_user_mr = hns_roce_reg_user_mr,
637+
.alloc_hw_port_stats = hns_roce_alloc_hw_port_stats,
638+
.get_hw_stats = hns_roce_get_hw_stats,
560639

561640
INIT_RDMA_OBJ_SIZE(ib_ah, hns_roce_ah, ibah),
562641
INIT_RDMA_OBJ_SIZE(ib_cq, hns_roce_cq, ib_cq),

0 commit comments

Comments
 (0)