185 lines
5.9 KiB
Diff
185 lines
5.9 KiB
Diff
From 878e201d94598190fdece0eb9df35c2fab61a0e0 Mon Sep 17 00:00:00 2001
|
|
From: Jian Shen <shenjian15@huawei.com>
|
|
Date: Sat, 24 Jul 2021 15:45:31 +0800
|
|
Subject: [PATCH 094/283] net: hns3: add support for FD counter in debugfs
|
|
|
|
mainline inclusion
|
|
from mainline-v5.14-rc1
|
|
commit 03a92fe8cedb6f619df416d38d0b57fd55070cd7
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMUR
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=03a92fe8cedb6f619df416d38d0b57fd55070cd7
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Previously, the flow director counter is not enabled. To improve the
|
|
maintainability for chechking whether flow director hit or not, enable
|
|
flow director counter for each function, and add debugfs query inerface
|
|
to query the counters for each function.
|
|
|
|
The debugfs command is below:
|
|
cat fd_counter
|
|
func_id hit_times
|
|
pf 0
|
|
vf0 0
|
|
vf1 0
|
|
|
|
Signed-off-by: Jian Shen <shenjian15@huawei.com>
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Reviewed-by: Yongxin Li <liyongxin1@huawei.com>
|
|
Signed-off-by: Junxin Chen <chenjunxin1@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
---
|
|
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 7 ++++
|
|
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 23 ++++++++++++
|
|
.../hisilicon/hns3/hns3pf/hclge_debugfs.c | 37 +++++++++++++++++++
|
|
.../hisilicon/hns3/hns3pf/hclge_main.c | 10 ++++-
|
|
4 files changed, 75 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
|
index 91a063ec9105..6c2decba5ac4 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
|
|
@@ -316,6 +316,13 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
|
|
.buf_len = HNS3_DBG_READ_LEN,
|
|
.init = hns3_dbg_common_file_init,
|
|
},
|
|
+ {
|
|
+ .name = "fd_counter",
|
|
+ .cmd = HNAE3_DBG_CMD_FD_COUNTER,
|
|
+ .dentry = HNS3_DBG_DENTRY_FD,
|
|
+ .buf_len = HNS3_DBG_READ_LEN,
|
|
+ .init = hns3_dbg_common_file_init,
|
|
+ },
|
|
};
|
|
|
|
static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
index 08e02c1c6eb2..75cf58c5f0b3 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
@@ -249,6 +249,8 @@ enum hclge_opcode_type {
|
|
HCLGE_OPC_FD_KEY_CONFIG = 0x1202,
|
|
HCLGE_OPC_FD_TCAM_OP = 0x1203,
|
|
HCLGE_OPC_FD_AD_OP = 0x1204,
|
|
+ HCLGE_OPC_FD_CNT_OP = 0x1205,
|
|
+ HCLGE_OPC_FD_USER_DEF_OP = 0x1207,
|
|
|
|
/* MDIO command */
|
|
HCLGE_OPC_MDIO_CONFIG = 0x1900,
|
|
@@ -1107,6 +1109,27 @@ struct hclge_fd_ad_config_cmd {
|
|
u8 rsv2[8];
|
|
};
|
|
|
|
+struct hclge_fd_ad_cnt_read_cmd {
|
|
+ u8 rsv0[4];
|
|
+ __le16 index;
|
|
+ u8 rsv1[2];
|
|
+ __le64 cnt;
|
|
+ u8 rsv2[8];
|
|
+};
|
|
+
|
|
+#define HCLGE_FD_USER_DEF_OFT_S 0
|
|
+#define HCLGE_FD_USER_DEF_OFT_M GENMASK(14, 0)
|
|
+#define HCLGE_FD_USER_DEF_EN_B 15
|
|
+struct hclge_fd_user_def_cfg_cmd {
|
|
+ __le16 ol2_cfg;
|
|
+ __le16 l2_cfg;
|
|
+ __le16 ol3_cfg;
|
|
+ __le16 l3_cfg;
|
|
+ __le16 ol4_cfg;
|
|
+ __le16 l4_cfg;
|
|
+ u8 rsv[12];
|
|
+};
|
|
+
|
|
struct hclge_get_imp_bd_cmd {
|
|
__le32 bd_num;
|
|
u8 rsv[20];
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
|
index 0517dedae55f..6350ad7353d1 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
|
|
@@ -1629,6 +1629,39 @@ static int hclge_dbg_dump_fd_tcam(struct hclge_dev *hdev, char *buf, int len)
|
|
return ret;
|
|
}
|
|
|
|
+static int hclge_dbg_dump_fd_counter(struct hclge_dev *hdev, char *buf, int len)
|
|
+{
|
|
+ u8 func_num = pci_num_vf(hdev->pdev) + 1; /* pf and enabled vf num */
|
|
+ struct hclge_fd_ad_cnt_read_cmd *req;
|
|
+ char str_id[HCLGE_DBG_ID_LEN];
|
|
+ struct hclge_desc desc;
|
|
+ int pos = 0;
|
|
+ int ret;
|
|
+ u64 cnt;
|
|
+ u8 i;
|
|
+
|
|
+ pos += scnprintf(buf + pos, len - pos,
|
|
+ "func_id\thit_times\n");
|
|
+
|
|
+ for (i = 0; i < func_num; i++) {
|
|
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_FD_CNT_OP, true);
|
|
+ req = (struct hclge_fd_ad_cnt_read_cmd *)desc.data;
|
|
+ req->index = cpu_to_le16(i);
|
|
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (ret) {
|
|
+ dev_err(&hdev->pdev->dev, "failed to get fd counter, ret = %d\n",
|
|
+ ret);
|
|
+ return ret;
|
|
+ }
|
|
+ cnt = le64_to_cpu(req->cnt);
|
|
+ hclge_dbg_get_func_id_str(str_id, i);
|
|
+ pos += scnprintf(buf + pos, len - pos,
|
|
+ "%s\t%llu\n", str_id, cnt);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len)
|
|
{
|
|
int pos = 0;
|
|
@@ -2392,6 +2425,10 @@ static const struct hclge_dbg_func hclge_dbg_cmd_func[] = {
|
|
.cmd = HNAE3_DBG_CMD_VLAN_CONFIG,
|
|
.dbg_dump = hclge_dbg_dump_vlan_config,
|
|
},
|
|
+ {
|
|
+ .cmd = HNAE3_DBG_CMD_FD_COUNTER,
|
|
+ .dbg_dump = hclge_dbg_dump_fd_counter,
|
|
+ },
|
|
};
|
|
|
|
int hclge_dbg_read_cmd(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd,
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 047423fd4084..7196dd27e230 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -5641,8 +5641,14 @@ static int hclge_config_action(struct hclge_dev *hdev, u8 stage,
|
|
ad_data.queue_id = rule->queue_id;
|
|
}
|
|
|
|
- ad_data.use_counter = false;
|
|
- ad_data.counter_id = 0;
|
|
+ if (hdev->fd_cfg.cnt_num[HCLGE_FD_STAGE_1]) {
|
|
+ ad_data.use_counter = true;
|
|
+ ad_data.counter_id = rule->vf_id %
|
|
+ hdev->fd_cfg.cnt_num[HCLGE_FD_STAGE_1];
|
|
+ } else {
|
|
+ ad_data.use_counter = false;
|
|
+ ad_data.counter_id = 0;
|
|
+ }
|
|
|
|
ad_data.use_next_stage = false;
|
|
ad_data.next_input_key = 0;
|
|
--
|
|
2.34.1
|
|
|