提交 01063fb0 编写于 作者: Y Yufeng Mo 提交者: Zheng Zengkai

net: hns3: refactor dump serv info of debugfs

mainline inclusion
from mainline-master
commit 058c3be9
category: feature
bugzilla: 173966
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=058c3be95235a12953d6533ef1486dc3d5879688

----------------------------------------------------------------------

Currently, the debugfs command for serv info is implemented by
"echo xxxx > cmd", and record the inforamtion in dmesg. It's
unnecessary and heavy. To improve it, create a single file
"serv_info" for it, and query it by command "cat serv_info",
return the result to userspace, rather than record in dmesg.

The display style is below:
$ cat service_task_info
local_clock: [  114.203321]
delta: 784(ms)
last_service_task_processed: 4294918512(jiffies)
last_service_task_cnt: 4
Signed-off-by: NYufeng Mo <moyufeng@huawei.com>
Signed-off-by: NHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Reviewed-by: NYongxin Li <liyongxin1@huawei.com>
Signed-off-by: NJunxin Chen <chenjunxin1@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 12a167c6
...@@ -287,6 +287,7 @@ enum hnae3_dbg_cmd { ...@@ -287,6 +287,7 @@ enum hnae3_dbg_cmd {
HNAE3_DBG_CMD_TX_QUEUE_INFO, HNAE3_DBG_CMD_TX_QUEUE_INFO,
HNAE3_DBG_CMD_FD_TCAM, HNAE3_DBG_CMD_FD_TCAM,
HNAE3_DBG_CMD_MAC_TNL_STATUS, HNAE3_DBG_CMD_MAC_TNL_STATUS,
HNAE3_DBG_CMD_SERV_INFO,
HNAE3_DBG_CMD_UNKNOWN, HNAE3_DBG_CMD_UNKNOWN,
}; };
......
...@@ -302,6 +302,13 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = { ...@@ -302,6 +302,13 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
.buf_len = HNS3_DBG_READ_LEN, .buf_len = HNS3_DBG_READ_LEN,
.init = hns3_dbg_common_file_init, .init = hns3_dbg_common_file_init,
}, },
{
.name = "service_task_info",
.cmd = HNAE3_DBG_CMD_SERV_INFO,
.dentry = HNS3_DBG_DENTRY_COMMON,
.buf_len = HNS3_DBG_READ_LEN,
.init = hns3_dbg_common_file_init,
},
}; };
static struct hns3_dbg_cap_info hns3_dbg_cap[] = { static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
......
...@@ -1590,12 +1590,26 @@ int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len) ...@@ -1590,12 +1590,26 @@ int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len)
return 0; return 0;
} }
static void hclge_dbg_dump_serv_info(struct hclge_dev *hdev) static int hclge_dbg_dump_serv_info(struct hclge_dev *hdev, char *buf, int len)
{ {
dev_info(&hdev->pdev->dev, "last_serv_processed: %lu\n", unsigned long rem_nsec;
int pos = 0;
u64 lc;
lc = local_clock();
rem_nsec = do_div(lc, HCLGE_BILLION_NANO_SECONDS);
pos += scnprintf(buf + pos, len - pos, "local_clock: [%5lu.%06lu]\n",
(unsigned long)lc, rem_nsec / 1000);
pos += scnprintf(buf + pos, len - pos, "delta: %u(ms)\n",
jiffies_to_msecs(jiffies - hdev->last_serv_processed));
pos += scnprintf(buf + pos, len - pos,
"last_service_task_processed: %lu(jiffies)\n",
hdev->last_serv_processed); hdev->last_serv_processed);
dev_info(&hdev->pdev->dev, "last_serv_cnt: %lu\n", pos += scnprintf(buf + pos, len - pos, "last_service_task_cnt: %lu\n",
hdev->serv_processed_cnt); hdev->serv_processed_cnt);
return 0;
} }
static int hclge_dbg_dump_interrupt(struct hclge_dev *hdev, char *buf, int len) static int hclge_dbg_dump_interrupt(struct hclge_dev *hdev, char *buf, int len)
...@@ -1810,8 +1824,6 @@ static int hclge_dbg_dump_loopback(struct hclge_dev *hdev, char *buf, int len) ...@@ -1810,8 +1824,6 @@ static int hclge_dbg_dump_loopback(struct hclge_dev *hdev, char *buf, int len)
static int static int
hclge_dbg_dump_mac_tnl_status(struct hclge_dev *hdev, char *buf, int len) hclge_dbg_dump_mac_tnl_status(struct hclge_dev *hdev, char *buf, int len)
{ {
#define HCLGE_BILLION_NANO_SECONDS 1000000000
struct hclge_mac_tnl_stats stats; struct hclge_mac_tnl_stats stats;
unsigned long rem_nsec; unsigned long rem_nsec;
int pos = 0; int pos = 0;
...@@ -1900,14 +1912,9 @@ int hclge_dbg_run_cmd(struct hnae3_handle *handle, const char *cmd_buf) ...@@ -1900,14 +1912,9 @@ int hclge_dbg_run_cmd(struct hnae3_handle *handle, const char *cmd_buf)
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
if (strncmp(cmd_buf, "dump serv info", 14) == 0) {
hclge_dbg_dump_serv_info(hdev);
} else {
dev_info(&hdev->pdev->dev, "unknown command\n"); dev_info(&hdev->pdev->dev, "unknown command\n");
return -EINVAL;
}
return 0; return -EINVAL;
} }
static const struct hclge_dbg_func hclge_dbg_cmd_func[] = { static const struct hclge_dbg_func hclge_dbg_cmd_func[] = {
...@@ -2035,6 +2042,10 @@ static const struct hclge_dbg_func hclge_dbg_cmd_func[] = { ...@@ -2035,6 +2042,10 @@ static const struct hclge_dbg_func hclge_dbg_cmd_func[] = {
.cmd = HNAE3_DBG_CMD_MAC_TNL_STATUS, .cmd = HNAE3_DBG_CMD_MAC_TNL_STATUS,
.dbg_dump = hclge_dbg_dump_mac_tnl_status, .dbg_dump = hclge_dbg_dump_mac_tnl_status,
}, },
{
.cmd = HNAE3_DBG_CMD_SERV_INFO,
.dbg_dump = hclge_dbg_dump_serv_info,
},
}; };
int hclge_dbg_read_cmd(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd, int hclge_dbg_read_cmd(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd,
......
...@@ -740,6 +740,8 @@ static const struct hclge_dbg_dfx_message hclge_dbg_tqp_reg[] = { ...@@ -740,6 +740,8 @@ static const struct hclge_dbg_dfx_message hclge_dbg_tqp_reg[] = {
#define HCLGE_DBG_DATA_STR_LEN 32 #define HCLGE_DBG_DATA_STR_LEN 32
#define HCLGE_DBG_TM_INFO_LEN 256 #define HCLGE_DBG_TM_INFO_LEN 256
#define HCLGE_BILLION_NANO_SECONDS 1000000000
struct hclge_dbg_item { struct hclge_dbg_item {
char name[HCLGE_DBG_ITEM_NAME_LEN]; char name[HCLGE_DBG_ITEM_NAME_LEN];
u16 interval; /* blank numbers after the item */ u16 interval; /* blank numbers after the item */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册