From: Jie Hai <haijie1@huawei.com>
To: fengchengwen <fengchengwen@huawei.com>, <dev@dpdk.org>,
<thomas@monjalon.net>, <ferruh.yigit@amd.com>,
<andrew.rybchenko@oktetlabs.ru>
Cc: <lihuisong@huawei.com>
Subject: Re: [PATCH v7 2/8] ethdev: add telemetry cmd for registers
Date: Mon, 23 Sep 2024 10:41:20 +0800 [thread overview]
Message-ID: <0f44c857-6f51-3354-093f-b8123cdb256e@huawei.com> (raw)
In-Reply-To: <ab0a845b-f369-479b-9900-9937c5eb4659@huawei.com>
Hi, fengchengwen,
Thanks for your review, all will change in next version.
Thanks,
Jie Hai
On 2024/9/14 16:20, fengchengwen wrote:
> On 2024/9/14 15:13, Jie Hai wrote:
>> This patch adds a telemetry command for registers dump,
>> and supports obtaining the registers of a specified module.
>>
>> In one way, the number of registers that can be exported
>> is limited by the number of elements carried by dict and
>> container. In another way, the length of the string
>> exported by telemetry is limited by MAX_OUTPUT_LEN.
>> Therefore, when the number of registers to be exported
>> exceeds, some information will be lost. Warn on the former
>> case.
>>
>> An example usage is shown below:
>> --> /ethdev/regs,0,ring
>> {
>> "/ethdev/regs": {
>> "registers_length": 318,
>> "registers_width": 4,
>> "register_offset": "0x0",
>> "version": "0x1140011",
>> "group_0": {
>> "Q0_ring_rx_bd_num": "0x0",
>> "Q0_ring_rx_bd_len": "0x0",
>> ...
>> },
>> "group_1": {
>> ...
>> },
>> ...
>> }
>>
>> Signed-off-by: Jie Hai <haijie1@huawei.com>
>> ---
>> lib/ethdev/rte_ethdev_telemetry.c | 128 ++++++++++++++++++++++++++++++
>> 1 file changed, 128 insertions(+)
>>
>> diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
>> index 6b873e7abe68..1d59c693883e 100644
>> --- a/lib/ethdev/rte_ethdev_telemetry.c
>> +++ b/lib/ethdev/rte_ethdev_telemetry.c
>> @@ -1395,6 +1395,132 @@ eth_dev_handle_port_tm_node_caps(const char *cmd __rte_unused,
>> return ret;
>> }
>>
>> +static void
>> +eth_dev_add_reg_data(struct rte_tel_data *d, struct rte_dev_reg_info *reg_info,
>> + uint32_t idx)
>> +{
>> + if (reg_info->width == sizeof(uint32_t))
>> + rte_tel_data_add_dict_uint_hex(d, reg_info->names[idx].name,
>> + *((uint32_t *)reg_info->data + idx), 0);
>> + else
>> + rte_tel_data_add_dict_uint_hex(d, reg_info->names[idx].name,
>> + *((uint64_t *)reg_info->data + idx), 0);
>> +}
>> +
>> +static int
>> +eth_dev_store_regs(struct rte_tel_data *d, struct rte_dev_reg_info *reg_info)
>> +{
>> + struct rte_tel_data *groups[RTE_TEL_MAX_DICT_ENTRIES];
>> + char group_name[RTE_TEL_MAX_STRING_LEN] = {0};
>> + struct rte_tel_data *group = NULL;
>> + uint32_t grp_num = 0;
>> + uint32_t i;
>> + int ret;
>> +
>> + rte_tel_data_start_dict(d);
>> + rte_tel_data_add_dict_uint(d, "register_length", reg_info->length);
>> + rte_tel_data_add_dict_uint(d, "register_width", reg_info->width);
>> + rte_tel_data_add_dict_uint_hex(d, "register_offset", reg_info->offset, 0);
>> + rte_tel_data_add_dict_uint_hex(d, "version", reg_info->version, 0);
>> +
>> + for (i = 0; i < reg_info->length; i++) {
>> + if (i % RTE_TEL_MAX_DICT_ENTRIES != 0) {
>> + eth_dev_add_reg_data(group, reg_info, i);
>> + continue;
>> + }
>> +
>> + group = rte_tel_data_alloc();
>> + if (group == NULL) {
>> + ret = -ENOMEM;
>> + RTE_ETHDEV_LOG_LINE(WARNING, "No enough memory for group data");
>> + goto out;
>> + }
>> + groups[grp_num++] = group;
>
> Although the probability is very small, the groups array may overflow if the length is very large.
>
> Suggest add judgement at the begin of this function:
>
> uint32_t max_cap = (RTE_TEL_MAX_DICT_ENTRIES - 4) * RTE_TEL_MAX_DICT_ENTRIES; // it will be 65000+ register
> if (reg_info->length > max_cap) {
> // just output error and exit
> }
>
>> + rte_tel_data_start_dict(group);
>> + eth_dev_add_reg_data(group, reg_info, i);
>> + }
>> +
>> + for (i = 0; i < grp_num; i++) {
>> + snprintf(group_name, RTE_TEL_MAX_STRING_LEN, "group_%u", i);
>> + ret = rte_tel_data_add_dict_container(d, group_name, groups[i], 0);
>> + if (ret == -ENOSPC) {
>> + RTE_ETHDEV_LOG_LINE(WARNING,
>> + "Reduce register number to be displayed from %u to %u due to limited capacity of telemetry",
>> + reg_info->length, i * RTE_TEL_MAX_DICT_ENTRIES);
>> + break;
>> + }
>
> It may lead to memory leak when break. If we add such judgement before, there is no need to add such judgement here.
>
>> + }
>> + return 0;
>> +out:
>> + for (i = 0; i < grp_num; i++)
>> + rte_tel_data_free(groups[i]);
>> +
>> + return ret;
>> +}
>> +
>> +static int
>> +eth_dev_get_port_regs(int port_id, struct rte_tel_data *d, char *filter)
>> +{
>> + struct rte_dev_reg_info reg_info;
>> + int ret;
>> +
>> + memset(®_info, 0, sizeof(reg_info));
>> + reg_info.filter = filter;
>> +
>> + ret = rte_eth_dev_get_reg_info_ext(port_id, ®_info);
>> + if (ret != 0) {
>> + RTE_ETHDEV_LOG_LINE(ERR, "Error getting device reg info: %d", ret);
>
> how about "Failed to get device reg info, ret = %d"
>
>> + return ret;
>> + }
>> +
>> + reg_info.data = calloc(reg_info.length, reg_info.width);
>> + if (reg_info.data == NULL) {
>> + RTE_ETHDEV_LOG_LINE(ERR, "Fail to allocate memory for reg_info.data");
>> + return -ENOMEM;
>> + }
>> +
>> + reg_info.names = calloc(reg_info.length, sizeof(struct rte_eth_reg_name));
>> + if (reg_info.names == NULL) {
>> + RTE_ETHDEV_LOG_LINE(ERR, "Fail to allocate memory for reg_info.names");
>> + free(reg_info.data);
>> + return -ENOMEM;
>> + }
>> +
>> + ret = rte_eth_dev_get_reg_info_ext(port_id, ®_info);
>> + if (ret != 0) {
>> + RTE_ETHDEV_LOG_LINE(ERR, "Error getting regs from device: %d", ret);
>
> It seemed the ret is device id, how about "Failed to get device reg info, ret = %d"
>
>> + ret = -EINVAL;
>> + goto out;
>> + }
>> +
>> + ret = eth_dev_store_regs(d, ®_info);
>> +out:
>> + free(reg_info.data);
>> + free(reg_info.names);
>> +
>> + return ret;
>> +}
>> +
>> +static int
>> +eth_dev_handle_port_regs(const char *cmd __rte_unused,
>> + const char *params,
>> + struct rte_tel_data *d)
>> +{
>> + char *filter, *end_param;
>> + uint16_t port_id;
>> + int ret;
>> +
>> + ret = eth_dev_parse_port_params(params, &port_id, &end_param, true);
>> + if (ret != 0)
>> + return ret;
>> +
>> + filter = strtok(end_param, ",");
>> + if (filter != NULL && strlen(filter) == 0)
>> + filter = NULL;
>> +
>> + return eth_dev_get_port_regs(port_id, d, filter);
>> +}
>> +
>> RTE_INIT(ethdev_init_telemetry)
>> {
>> rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
>> @@ -1436,4 +1562,6 @@ RTE_INIT(ethdev_init_telemetry)
>> "Returns TM Level Capabilities info for a port. Parameters: int port_id, int level_id (see tm_capability for the max)");
>> rte_telemetry_register_cmd("/ethdev/tm_node_capability", eth_dev_handle_port_tm_node_caps,
>> "Returns TM Node Capabilities info for a port. Parameters: int port_id, int node_id (see tm_capability for the max)");
>> + rte_telemetry_register_cmd("/ethdev/regs", eth_dev_handle_port_regs,
>> + "Returns all or filtered registers info for a port. Parameters: int port_id, string module_name (Optional if show all)");
>> }
>
> .
next prev parent reply other threads:[~2024-09-23 2:41 UTC|newest]
Thread overview: 134+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-14 1:56 [PATCH] ethdev: add dump regs for telemetry Jie Hai
2023-12-14 12:49 ` Ferruh Yigit
2024-01-09 2:19 ` Jie Hai
2024-01-09 2:41 ` Jie Hai
2024-01-09 18:06 ` Ferruh Yigit
2024-01-10 1:38 ` fengchengwen
2024-01-10 12:15 ` Ferruh Yigit
2024-01-10 14:09 ` Thomas Monjalon
2024-01-10 15:48 ` Ferruh Yigit
2024-01-11 1:55 ` fengchengwen
2024-01-11 11:11 ` Ferruh Yigit
2024-01-11 12:43 ` fengchengwen
2024-02-05 10:51 ` [PATCH v2 0/7] support dump reigser names and filter them Jie Hai
2024-02-05 10:51 ` [PATCH v2 1/7] ethdev: support report register names and filter Jie Hai
2024-02-07 17:00 ` Ferruh Yigit
2024-02-20 8:43 ` Jie Hai
2024-02-05 10:51 ` [PATCH v2 2/7] ethdev: add telemetry cmd for registers Jie Hai
2024-02-07 17:03 ` Ferruh Yigit
2024-02-22 9:01 ` Jie Hai
2024-02-05 10:51 ` [PATCH v2 3/7] net/hns3: fix dump counter of registers Jie Hai
2024-02-05 10:51 ` [PATCH v2 4/7] net/hns3: remove dump format " Jie Hai
2024-02-05 10:51 ` [PATCH v2 5/7] net/hns3: add names for registers Jie Hai
2024-02-05 10:51 ` [PATCH v2 6/7] net/hns3: support filter directly accessed registers Jie Hai
2024-02-05 10:51 ` [PATCH v2 7/7] net/hns3: support filter dump of registers Jie Hai
2024-02-20 10:58 ` [PATCH v3 0/7] support dump reigser names and filter them Jie Hai
2024-02-20 10:58 ` [PATCH v3 1/7] ethdev: support report register names and filter Jie Hai
2024-02-20 15:09 ` Stephen Hemminger
2024-02-26 2:33 ` Jie Hai
2024-02-20 15:13 ` Stephen Hemminger
2024-02-26 2:41 ` Jie Hai
2024-02-20 15:14 ` Stephen Hemminger
2024-02-26 2:57 ` Jie Hai
2024-02-20 15:14 ` Stephen Hemminger
2024-02-26 2:33 ` Jie Hai
2024-02-20 10:58 ` [PATCH v3 2/7] ethdev: add telemetry cmd for registers Jie Hai
2024-02-20 10:58 ` [PATCH v3 3/7] net/hns3: fix dump counter of registers Jie Hai
2024-02-20 10:58 ` [PATCH v3 4/7] net/hns3: remove dump format " Jie Hai
2024-02-20 10:58 ` [PATCH v3 5/7] net/hns3: add names for registers Jie Hai
2024-02-20 10:58 ` [PATCH v3 6/7] net/hns3: support filter directly accessed registers Jie Hai
2024-02-20 10:58 ` [PATCH v3 7/7] net/hns3: support filter dump of registers Jie Hai
2024-02-26 3:07 ` [PATCH v4 0/7] support dump reigser names and filter them Jie Hai
2024-02-26 3:07 ` [PATCH v4 1/7] ethdev: support report register names and filter Jie Hai
2024-02-26 8:01 ` fengchengwen
2024-03-06 7:22 ` Jie Hai
2024-02-29 9:52 ` Thomas Monjalon
2024-03-05 7:45 ` Jie Hai
2024-02-26 3:07 ` [PATCH v4 2/7] ethdev: add telemetry cmd for registers Jie Hai
2024-02-26 9:09 ` fengchengwen
2024-03-06 7:18 ` Jie Hai
2024-02-26 3:07 ` [PATCH v4 3/7] net/hns3: fix dump counter of registers Jie Hai
2024-02-26 3:07 ` [PATCH v4 4/7] net/hns3: remove dump format " Jie Hai
2024-02-26 3:07 ` [PATCH v4 5/7] net/hns3: add names for registers Jie Hai
2024-02-26 3:07 ` [PATCH v4 6/7] net/hns3: support filter directly accessed registers Jie Hai
2024-02-26 3:07 ` [PATCH v4 7/7] net/hns3: support filter dump of registers Jie Hai
2024-03-07 3:02 ` [PATCH v5 0/7] support dump reigser names and filter them Jie Hai
2024-03-07 3:02 ` [PATCH v5 1/7] ethdev: support report register names and filter Jie Hai
2024-03-08 8:09 ` lihuisong (C)
2024-03-07 3:02 ` [PATCH v5 2/7] ethdev: add telemetry cmd for registers Jie Hai
2024-03-08 8:48 ` lihuisong (C)
2024-03-07 3:02 ` [PATCH v5 3/7] net/hns3: fix dump counter of registers Jie Hai
2024-03-08 8:49 ` lihuisong (C)
2024-03-07 3:02 ` [PATCH v5 4/7] net/hns3: remove dump format " Jie Hai
2024-03-08 9:17 ` lihuisong (C)
2024-03-07 3:02 ` [PATCH v5 5/7] net/hns3: add names for registers Jie Hai
2024-03-08 9:41 ` lihuisong (C)
2024-03-08 10:24 ` lihuisong (C)
2024-03-07 3:02 ` [PATCH v5 6/7] net/hns3: support filter directly accessed registers Jie Hai
2024-03-08 9:41 ` lihuisong (C)
2024-03-07 3:02 ` [PATCH v5 7/7] net/hns3: support filter dump of registers Jie Hai
2024-07-22 6:58 ` [PATCH v6 0/8] support dump reigser names and filter Jie Hai
2024-07-22 6:58 ` [PATCH v6 1/8] ethdev: support report register " Jie Hai
2024-07-22 6:58 ` [PATCH v6 2/8] ethdev: add telemetry cmd for registers Jie Hai
2024-07-22 6:58 ` [PATCH v6 3/8] net/hns3: remove some basic address dump Jie Hai
2024-07-22 6:58 ` [PATCH v6 4/8] net/hns3: fix dump counter of registers Jie Hai
2024-07-22 6:58 ` [PATCH v6 5/8] net/hns3: remove separators between register module Jie Hai
2024-07-22 6:58 ` [PATCH v6 6/8] net/hns3: refactor register dump Jie Hai
2024-07-22 6:58 ` [PATCH v6 7/8] net/hns3: support report names of registers Jie Hai
2024-07-22 6:58 ` [PATCH v6 8/8] net/hns3: support filter registers by module names Jie Hai
2024-08-09 9:22 ` [PATCH v6 0/8] support dump reigser names and filter Jie Hai
2024-09-05 6:26 ` [RESEND " Jie Hai
2024-09-05 6:26 ` [RESEND v6 1/8] ethdev: support report register " Jie Hai
2024-09-05 6:26 ` [RESEND v6 2/8] ethdev: add telemetry cmd for registers Jie Hai
2024-09-05 6:26 ` [RESEND v6 3/8] net/hns3: remove some basic address dump Jie Hai
2024-09-05 6:26 ` [RESEND v6 4/8] net/hns3: fix dump counter of registers Jie Hai
2024-09-05 6:26 ` [RESEND v6 5/8] net/hns3: remove separators between register module Jie Hai
2024-09-05 6:26 ` [RESEND v6 6/8] net/hns3: refactor register dump Jie Hai
2024-09-05 6:26 ` [RESEND v6 7/8] net/hns3: support report names of registers Jie Hai
2024-09-05 6:26 ` [RESEND v6 8/8] net/hns3: support filter registers by module names Jie Hai
2024-09-14 6:53 ` [PATCH v7 0/8] support dump reigser names and filter Jie Hai
2024-09-14 7:13 ` Jie Hai
2024-09-14 7:13 ` [PATCH v7 1/8] ethdev: support report register " Jie Hai
2024-09-22 21:26 ` Ferruh Yigit
2024-09-14 7:13 ` [PATCH v7 2/8] ethdev: add telemetry cmd for registers Jie Hai
2024-09-14 8:20 ` fengchengwen
2024-09-23 2:41 ` Jie Hai [this message]
2024-09-22 21:28 ` Ferruh Yigit
2024-09-14 7:13 ` [PATCH v7 3/8] net/hns3: remove some basic address dump Jie Hai
2024-09-14 8:21 ` fengchengwen
2024-09-14 7:13 ` [PATCH v7 4/8] net/hns3: fix dump counter of registers Jie Hai
2024-09-14 7:13 ` [PATCH v7 5/8] net/hns3: remove separators between register module Jie Hai
2024-09-14 7:13 ` [PATCH v7 6/8] net/hns3: refactor register dump Jie Hai
2024-09-14 8:26 ` fengchengwen
2024-09-14 7:13 ` [PATCH v7 7/8] net/hns3: support report names of registers Jie Hai
2024-09-14 8:27 ` fengchengwen
2024-09-14 7:13 ` [PATCH v7 8/8] net/hns3: support filter registers by module names Jie Hai
2024-09-14 8:46 ` fengchengwen
2024-09-14 15:00 ` [PATCH v7 0/8] support dump reigser names and filter Stephen Hemminger
2024-09-23 2:41 ` Jie Hai
2024-09-22 21:31 ` Ferruh Yigit
2024-09-25 6:40 ` [PATCH v8 0/8] support dump register " Jie Hai
2024-09-25 6:40 ` [PATCH v8 1/8] ethdev: support report " Jie Hai
2024-09-25 6:40 ` [PATCH v8 2/8] ethdev: add telemetry cmd for registers Jie Hai
2024-09-26 1:22 ` fengchengwen
2024-09-25 6:40 ` [PATCH v8 3/8] net/hns3: remove some basic address dump Jie Hai
2024-09-25 6:40 ` [PATCH v8 4/8] net/hns3: fix dump counter of registers Jie Hai
2024-09-25 6:40 ` [PATCH v8 5/8] net/hns3: remove separators between register module Jie Hai
2024-09-25 6:40 ` [PATCH v8 6/8] net/hns3: refactor register dump Jie Hai
2024-09-25 6:40 ` [PATCH v8 7/8] net/hns3: support report names of registers Jie Hai
2024-09-25 6:40 ` [PATCH v8 8/8] net/hns3: support filter registers by module names Jie Hai
2024-09-26 1:46 ` fengchengwen
2024-09-26 12:37 ` Jie Hai
2024-09-26 12:42 ` [PATCH v9 0/8] support dump reigster names and filter Jie Hai
2024-09-26 12:42 ` [PATCH v9 1/8] ethdev: support report register " Jie Hai
2024-09-26 12:42 ` [PATCH v9 2/8] ethdev: add telemetry cmd for registers Jie Hai
2024-09-26 12:42 ` [PATCH v9 3/8] net/hns3: remove some basic address dump Jie Hai
2024-09-26 12:42 ` [PATCH v9 4/8] net/hns3: fix dump counter of registers Jie Hai
2024-09-26 12:42 ` [PATCH v9 5/8] net/hns3: remove separators between register module Jie Hai
2024-09-26 12:42 ` [PATCH v9 6/8] net/hns3: refactor register dump Jie Hai
2024-09-26 12:42 ` [PATCH v9 7/8] net/hns3: support report names of registers Jie Hai
2024-09-26 12:42 ` [PATCH v9 8/8] net/hns3: support filter registers by module names Jie Hai
2024-09-27 1:37 ` fengchengwen
2024-10-04 13:59 ` David Marchand
2024-10-07 3:01 ` Ferruh Yigit
2024-09-27 21:38 ` [PATCH v9 0/8] support dump reigster names and filter Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0f44c857-6f51-3354-093f-b8123cdb256e@huawei.com \
--to=haijie1@huawei.com \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=dev@dpdk.org \
--cc=fengchengwen@huawei.com \
--cc=ferruh.yigit@amd.com \
--cc=lihuisong@huawei.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).