Commit d2f737cf authored by Hao Chen's avatar Hao Chen Committed by David S. Miller

net: hns3: refactor queue map of debugfs

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

The display style is below:
$ cat queue_map
local_queue_id   global_queue_id   vector_id
0                0                 341
Signed-off-by: default avatarHao Chen <chenhao288@hisilicon.com>
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 365e860a
...@@ -276,6 +276,7 @@ enum hnae3_dbg_cmd { ...@@ -276,6 +276,7 @@ enum hnae3_dbg_cmd {
HNAE3_DBG_CMD_REG_TQP, HNAE3_DBG_CMD_REG_TQP,
HNAE3_DBG_CMD_REG_MAC, HNAE3_DBG_CMD_REG_MAC,
HNAE3_DBG_CMD_REG_DCB, HNAE3_DBG_CMD_REG_DCB,
HNAE3_DBG_CMD_QUEUE_MAP,
HNAE3_DBG_CMD_UNKNOWN, HNAE3_DBG_CMD_UNKNOWN,
}; };
......
...@@ -26,6 +26,9 @@ static struct hns3_dbg_dentry_info hns3_dbg_dentry[] = { ...@@ -26,6 +26,9 @@ static struct hns3_dbg_dentry_info hns3_dbg_dentry[] = {
{ {
.name = "reg" .name = "reg"
}, },
{
.name = "queue"
},
/* keep common at the bottom and add new directory above */ /* keep common at the bottom and add new directory above */
{ {
.name = "common" .name = "common"
...@@ -212,6 +215,13 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = { ...@@ -212,6 +215,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 = "queue_map",
.cmd = HNAE3_DBG_CMD_QUEUE_MAP,
.dentry = HNS3_DBG_DENTRY_QUEUE,
.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[] = {
...@@ -403,27 +413,44 @@ static int hns3_dbg_queue_info(struct hnae3_handle *h, ...@@ -403,27 +413,44 @@ static int hns3_dbg_queue_info(struct hnae3_handle *h,
return 0; return 0;
} }
static int hns3_dbg_queue_map(struct hnae3_handle *h) static const struct hns3_dbg_item queue_map_items[] = {
{ "local_queue_id", 2 },
{ "global_queue_id", 2 },
{ "vector_id", 2 },
};
static int hns3_dbg_queue_map(struct hnae3_handle *h, char *buf, int len)
{ {
char data_str[ARRAY_SIZE(queue_map_items)][HNS3_DBG_DATA_STR_LEN];
char *result[ARRAY_SIZE(queue_map_items)];
struct hns3_nic_priv *priv = h->priv; struct hns3_nic_priv *priv = h->priv;
int i; char content[HNS3_DBG_INFO_LEN];
int pos = 0;
int j;
u32 i;
if (!h->ae_algo->ops->get_global_queue_id) if (!h->ae_algo->ops->get_global_queue_id)
return -EOPNOTSUPP; return -EOPNOTSUPP;
dev_info(&h->pdev->dev, "map info for queue id and vector id\n"); for (i = 0; i < ARRAY_SIZE(queue_map_items); i++)
dev_info(&h->pdev->dev, result[i] = &data_str[i][0];
"local queue id | global queue id | vector id\n");
for (i = 0; i < h->kinfo.num_tqps; i++) {
u16 global_qid;
global_qid = h->ae_algo->ops->get_global_queue_id(h, i); hns3_dbg_fill_content(content, sizeof(content), queue_map_items,
NULL, ARRAY_SIZE(queue_map_items));
pos += scnprintf(buf + pos, len - pos, "%s", content);
for (i = 0; i < h->kinfo.num_tqps; i++) {
if (!priv->ring || !priv->ring[i].tqp_vector) if (!priv->ring || !priv->ring[i].tqp_vector)
continue; continue;
j = 0;
dev_info(&h->pdev->dev, sprintf(result[j++], "%u", i);
" %4d %4u %4d\n", sprintf(result[j++], "%u",
i, global_qid, priv->ring[i].tqp_vector->vector_irq); h->ae_algo->ops->get_global_queue_id(h, i));
sprintf(result[j++], "%u",
priv->ring[i].tqp_vector->vector_irq);
hns3_dbg_fill_content(content, sizeof(content), queue_map_items,
(const char **)result,
ARRAY_SIZE(queue_map_items));
pos += scnprintf(buf + pos, len - pos, "%s", content);
} }
return 0; return 0;
...@@ -590,7 +617,6 @@ static void hns3_dbg_help(struct hnae3_handle *h) ...@@ -590,7 +617,6 @@ static void hns3_dbg_help(struct hnae3_handle *h)
{ {
dev_info(&h->pdev->dev, "available commands\n"); dev_info(&h->pdev->dev, "available commands\n");
dev_info(&h->pdev->dev, "queue info <number>\n"); dev_info(&h->pdev->dev, "queue info <number>\n");
dev_info(&h->pdev->dev, "queue map\n");
if (!hns3_is_phys_func(h->pdev)) if (!hns3_is_phys_func(h->pdev))
return; return;
...@@ -717,8 +743,6 @@ static int hns3_dbg_check_cmd(struct hnae3_handle *handle, char *cmd_buf) ...@@ -717,8 +743,6 @@ static int hns3_dbg_check_cmd(struct hnae3_handle *handle, char *cmd_buf)
hns3_dbg_help(handle); hns3_dbg_help(handle);
else if (strncmp(cmd_buf, "queue info", 10) == 0) else if (strncmp(cmd_buf, "queue info", 10) == 0)
ret = hns3_dbg_queue_info(handle, cmd_buf); ret = hns3_dbg_queue_info(handle, cmd_buf);
else if (strncmp(cmd_buf, "queue map", 9) == 0)
ret = hns3_dbg_queue_map(handle);
else if (handle->ae_algo->ops->dbg_run_cmd) else if (handle->ae_algo->ops->dbg_run_cmd)
ret = handle->ae_algo->ops->dbg_run_cmd(handle, cmd_buf); ret = handle->ae_algo->ops->dbg_run_cmd(handle, cmd_buf);
else else
...@@ -793,6 +817,10 @@ static int hns3_dbg_get_cmd_index(struct hnae3_handle *handle, ...@@ -793,6 +817,10 @@ static int hns3_dbg_get_cmd_index(struct hnae3_handle *handle,
} }
static const struct hns3_dbg_func hns3_dbg_cmd_func[] = { static const struct hns3_dbg_func hns3_dbg_cmd_func[] = {
{
.cmd = HNAE3_DBG_CMD_QUEUE_MAP,
.dbg_dump = hns3_dbg_queue_map,
},
{ {
.cmd = HNAE3_DBG_CMD_DEV_INFO, .cmd = HNAE3_DBG_CMD_DEV_INFO,
.dbg_dump = hns3_dbg_dev_info, .dbg_dump = hns3_dbg_dev_info,
......
...@@ -30,6 +30,7 @@ enum hns3_dbg_dentry_type { ...@@ -30,6 +30,7 @@ enum hns3_dbg_dentry_type {
HNS3_DBG_DENTRY_RX_BD, HNS3_DBG_DENTRY_RX_BD,
HNS3_DBG_DENTRY_MAC, HNS3_DBG_DENTRY_MAC,
HNS3_DBG_DENTRY_REG, HNS3_DBG_DENTRY_REG,
HNS3_DBG_DENTRY_QUEUE,
HNS3_DBG_DENTRY_COMMON, HNS3_DBG_DENTRY_COMMON,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment