* [PATCH v2 01/13] ethdev: fix incorrect argument of calloc
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
@ 2023-06-07 7:41 ` Jie Hai
2023-06-07 11:35 ` Ferruh Yigit
2023-06-07 7:41 ` [PATCH v2 02/13] ethdev: extract telemetry codes to a file Jie Hai
` (12 subsequent siblings)
13 siblings, 1 reply; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:41 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko,
Morten Brørup, Chengwen Feng
Cc: dev, liudongdong3
The 'calloc' uses number as first argument, sizeof is generally wrong.
This patch fixes it.
Fixes: 8af559f94cef ("ethdev: support telemetry private dump")
Cc: stable@dpdk.org
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index d46e74504e64..503d500429c0 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -6548,7 +6548,7 @@ eth_dev_handle_port_dump_priv(const char *cmd __rte_unused,
if (!rte_eth_dev_is_valid_port(port_id))
return -EINVAL;
- buf = calloc(sizeof(char), RTE_TEL_MAX_SINGLE_STRING_LEN);
+ buf = calloc(RTE_TEL_MAX_SINGLE_STRING_LEN, sizeof(char));
if (buf == NULL)
return -ENOMEM;
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v2 01/13] ethdev: fix incorrect argument of calloc
2023-06-07 7:41 ` [PATCH v2 01/13] ethdev: fix incorrect argument of calloc Jie Hai
@ 2023-06-07 11:35 ` Ferruh Yigit
0 siblings, 0 replies; 36+ messages in thread
From: Ferruh Yigit @ 2023-06-07 11:35 UTC (permalink / raw)
To: Jie Hai, Thomas Monjalon, Andrew Rybchenko, Morten Brørup,
Chengwen Feng
Cc: dev, liudongdong3
On 6/7/2023 8:41 AM, Jie Hai wrote:
> The 'calloc' uses number as first argument, sizeof is generally wrong.
> This patch fixes it.
>
> Fixes: 8af559f94cef ("ethdev: support telemetry private dump")
> Cc: stable@dpdk.org
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> ---
> lib/ethdev/rte_ethdev.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index d46e74504e64..503d500429c0 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -6548,7 +6548,7 @@ eth_dev_handle_port_dump_priv(const char *cmd __rte_unused,
> if (!rte_eth_dev_is_valid_port(port_id))
> return -EINVAL;
>
> - buf = calloc(sizeof(char), RTE_TEL_MAX_SINGLE_STRING_LEN);
> + buf = calloc(RTE_TEL_MAX_SINGLE_STRING_LEN, sizeof(char));
> if (buf == NULL)
> return -ENOMEM;
>
Functionality should be same, but there is no harm to fix, hence:
Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 02/13] ethdev: extract telemetry codes to a file
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
2023-06-07 7:41 ` [PATCH v2 01/13] ethdev: fix incorrect argument of calloc Jie Hai
@ 2023-06-07 7:41 ` Jie Hai
2023-06-07 11:37 ` Ferruh Yigit
2023-06-07 7:41 ` [PATCH v2 03/13] ethdev: extract codes parsing port ID as a function Jie Hai
` (11 subsequent siblings)
13 siblings, 1 reply; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:41 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch extracts telemetry related codes in rte_ethdev.c
to a new file rte_ethdev_telemetry.c.
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/meson.build | 1 +
lib/ethdev/rte_ethdev.c | 332 ----------------------------
lib/ethdev/rte_ethdev_telemetry.c | 344 ++++++++++++++++++++++++++++++
3 files changed, 345 insertions(+), 332 deletions(-)
create mode 100644 lib/ethdev/rte_ethdev_telemetry.c
diff --git a/lib/ethdev/meson.build b/lib/ethdev/meson.build
index 1ba0fac5c0f0..3497aa154844 100644
--- a/lib/ethdev/meson.build
+++ b/lib/ethdev/meson.build
@@ -9,6 +9,7 @@ sources = files(
'rte_class_eth.c',
'rte_ethdev.c',
'rte_ethdev_cman.c',
+ 'rte_ethdev_telemetry.c',
'rte_flow.c',
'rte_mtr.c',
'rte_tm.c',
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 503d500429c0..47a757a8fa93 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -6380,317 +6380,6 @@ rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool)
return ret;
}
-static int
-eth_dev_handle_port_list(const char *cmd __rte_unused,
- const char *params __rte_unused,
- struct rte_tel_data *d)
-{
- int port_id;
-
- rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
- RTE_ETH_FOREACH_DEV(port_id)
- rte_tel_data_add_array_int(d, port_id);
- return 0;
-}
-
-static void
-eth_dev_add_port_queue_stats(struct rte_tel_data *d, uint64_t *q_stats,
- const char *stat_name)
-{
- int q;
- struct rte_tel_data *q_data = rte_tel_data_alloc();
- if (q_data == NULL)
- return;
- rte_tel_data_start_array(q_data, RTE_TEL_UINT_VAL);
- for (q = 0; q < RTE_ETHDEV_QUEUE_STAT_CNTRS; q++)
- rte_tel_data_add_array_uint(q_data, q_stats[q]);
- rte_tel_data_add_dict_container(d, stat_name, q_data, 0);
-}
-
-#define ADD_DICT_STAT(stats, s) rte_tel_data_add_dict_uint(d, #s, stats.s)
-
-static int
-eth_dev_handle_port_stats(const char *cmd __rte_unused,
- const char *params,
- struct rte_tel_data *d)
-{
- struct rte_eth_stats stats;
- int port_id, ret;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
-
- port_id = atoi(params);
- if (!rte_eth_dev_is_valid_port(port_id))
- return -1;
-
- ret = rte_eth_stats_get(port_id, &stats);
- if (ret < 0)
- return -1;
-
- rte_tel_data_start_dict(d);
- ADD_DICT_STAT(stats, ipackets);
- ADD_DICT_STAT(stats, opackets);
- ADD_DICT_STAT(stats, ibytes);
- ADD_DICT_STAT(stats, obytes);
- ADD_DICT_STAT(stats, imissed);
- ADD_DICT_STAT(stats, ierrors);
- ADD_DICT_STAT(stats, oerrors);
- ADD_DICT_STAT(stats, rx_nombuf);
- eth_dev_add_port_queue_stats(d, stats.q_ipackets, "q_ipackets");
- eth_dev_add_port_queue_stats(d, stats.q_opackets, "q_opackets");
- eth_dev_add_port_queue_stats(d, stats.q_ibytes, "q_ibytes");
- eth_dev_add_port_queue_stats(d, stats.q_obytes, "q_obytes");
- eth_dev_add_port_queue_stats(d, stats.q_errors, "q_errors");
-
- return 0;
-}
-
-static int
-eth_dev_parse_hide_zero(const char *key, const char *value, void *extra_args)
-{
- RTE_SET_USED(key);
-
- if (value == NULL)
- return -1;
-
- if (strcmp(value, "true") == 0)
- *(bool *)extra_args = true;
- else if (strcmp(value, "false") == 0)
- *(bool *)extra_args = false;
- else
- return -1;
-
- return 0;
-}
-
-static int
-eth_dev_handle_port_xstats(const char *cmd __rte_unused,
- const char *params,
- struct rte_tel_data *d)
-{
- const char *const valid_keys[] = { "hide_zero", NULL };
- struct rte_eth_xstat *eth_xstats;
- struct rte_eth_xstat_name *xstat_names;
- struct rte_kvargs *kvlist;
- int port_id, num_xstats;
- bool hide_zero = false;
- char *end_param;
- int i, ret;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
-
- port_id = strtoul(params, &end_param, 0);
- if (!rte_eth_dev_is_valid_port(port_id))
- return -1;
-
- if (*end_param != '\0') {
- kvlist = rte_kvargs_parse(end_param, valid_keys);
- ret = rte_kvargs_process(kvlist, NULL, eth_dev_parse_hide_zero, &hide_zero);
- if (kvlist == NULL || ret != 0)
- RTE_ETHDEV_LOG(NOTICE,
- "Unknown extra parameters passed to ethdev telemetry command, ignoring\n");
- rte_kvargs_free(kvlist);
- }
-
- num_xstats = rte_eth_xstats_get(port_id, NULL, 0);
- if (num_xstats < 0)
- return -1;
-
- /* use one malloc for both names and stats */
- eth_xstats = malloc((sizeof(struct rte_eth_xstat) +
- sizeof(struct rte_eth_xstat_name)) * num_xstats);
- if (eth_xstats == NULL)
- return -1;
- xstat_names = (void *)ð_xstats[num_xstats];
-
- ret = rte_eth_xstats_get_names(port_id, xstat_names, num_xstats);
- if (ret < 0 || ret > num_xstats) {
- free(eth_xstats);
- return -1;
- }
-
- ret = rte_eth_xstats_get(port_id, eth_xstats, num_xstats);
- if (ret < 0 || ret > num_xstats) {
- free(eth_xstats);
- return -1;
- }
-
- rte_tel_data_start_dict(d);
- for (i = 0; i < num_xstats; i++) {
- if (hide_zero && eth_xstats[i].value == 0)
- continue;
- rte_tel_data_add_dict_uint(d, xstat_names[i].name,
- eth_xstats[i].value);
- }
- free(eth_xstats);
- return 0;
-}
-
-#ifndef RTE_EXEC_ENV_WINDOWS
-static int
-eth_dev_handle_port_dump_priv(const char *cmd __rte_unused,
- const char *params,
- struct rte_tel_data *d)
-{
- char *buf, *end_param;
- int port_id, ret;
- FILE *f;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -EINVAL;
-
- port_id = strtoul(params, &end_param, 0);
- if (*end_param != '\0')
- RTE_ETHDEV_LOG(NOTICE,
- "Extra parameters passed to ethdev telemetry command, ignoring");
- if (!rte_eth_dev_is_valid_port(port_id))
- return -EINVAL;
-
- buf = calloc(RTE_TEL_MAX_SINGLE_STRING_LEN, sizeof(char));
- if (buf == NULL)
- return -ENOMEM;
-
- f = fmemopen(buf, RTE_TEL_MAX_SINGLE_STRING_LEN - 1, "w+");
- if (f == NULL) {
- free(buf);
- return -EINVAL;
- }
-
- ret = rte_eth_dev_priv_dump(port_id, f);
- fclose(f);
- if (ret == 0) {
- rte_tel_data_start_dict(d);
- rte_tel_data_string(d, buf);
- }
-
- free(buf);
- return 0;
-}
-#endif /* !RTE_EXEC_ENV_WINDOWS */
-
-static int
-eth_dev_handle_port_link_status(const char *cmd __rte_unused,
- const char *params,
- struct rte_tel_data *d)
-{
- static const char *status_str = "status";
- int ret, port_id;
- struct rte_eth_link link;
- char *end_param;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
-
- port_id = strtoul(params, &end_param, 0);
- if (*end_param != '\0')
- RTE_ETHDEV_LOG(NOTICE,
- "Extra parameters passed to ethdev telemetry command, ignoring");
- if (!rte_eth_dev_is_valid_port(port_id))
- return -1;
-
- ret = rte_eth_link_get_nowait(port_id, &link);
- if (ret < 0)
- return -1;
-
- rte_tel_data_start_dict(d);
- if (!link.link_status) {
- rte_tel_data_add_dict_string(d, status_str, "DOWN");
- return 0;
- }
- rte_tel_data_add_dict_string(d, status_str, "UP");
- rte_tel_data_add_dict_uint(d, "speed", link.link_speed);
- rte_tel_data_add_dict_string(d, "duplex",
- (link.link_duplex == RTE_ETH_LINK_FULL_DUPLEX) ?
- "full-duplex" : "half-duplex");
- return 0;
-}
-
-static int
-eth_dev_handle_port_info(const char *cmd __rte_unused,
- const char *params,
- struct rte_tel_data *d)
-{
- struct rte_tel_data *rxq_state, *txq_state;
- char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
- struct rte_eth_dev *eth_dev;
- char *end_param;
- int port_id, i;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
-
- port_id = strtoul(params, &end_param, 0);
- if (*end_param != '\0')
- RTE_ETHDEV_LOG(NOTICE,
- "Extra parameters passed to ethdev telemetry command, ignoring");
-
- if (!rte_eth_dev_is_valid_port(port_id))
- return -EINVAL;
-
- eth_dev = &rte_eth_devices[port_id];
-
- rxq_state = rte_tel_data_alloc();
- if (!rxq_state)
- return -ENOMEM;
-
- txq_state = rte_tel_data_alloc();
- if (!txq_state) {
- rte_tel_data_free(rxq_state);
- return -ENOMEM;
- }
-
- rte_tel_data_start_dict(d);
- rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
- rte_tel_data_add_dict_int(d, "state", eth_dev->state);
- rte_tel_data_add_dict_int(d, "nb_rx_queues",
- eth_dev->data->nb_rx_queues);
- rte_tel_data_add_dict_int(d, "nb_tx_queues",
- eth_dev->data->nb_tx_queues);
- rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id);
- rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu);
- rte_tel_data_add_dict_uint(d, "rx_mbuf_size_min",
- eth_dev->data->min_rx_buf_size);
- rte_ether_format_addr(mac_addr, sizeof(mac_addr),
- eth_dev->data->mac_addrs);
- rte_tel_data_add_dict_string(d, "mac_addr", mac_addr);
- rte_tel_data_add_dict_int(d, "promiscuous",
- eth_dev->data->promiscuous);
- rte_tel_data_add_dict_int(d, "scattered_rx",
- eth_dev->data->scattered_rx);
- rte_tel_data_add_dict_int(d, "all_multicast",
- eth_dev->data->all_multicast);
- rte_tel_data_add_dict_int(d, "dev_started", eth_dev->data->dev_started);
- rte_tel_data_add_dict_int(d, "lro", eth_dev->data->lro);
- rte_tel_data_add_dict_int(d, "dev_configured",
- eth_dev->data->dev_configured);
-
- rte_tel_data_start_array(rxq_state, RTE_TEL_INT_VAL);
- for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
- rte_tel_data_add_array_int(rxq_state,
- eth_dev->data->rx_queue_state[i]);
-
- rte_tel_data_start_array(txq_state, RTE_TEL_INT_VAL);
- for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
- rte_tel_data_add_array_int(txq_state,
- eth_dev->data->tx_queue_state[i]);
-
- rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0);
- rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0);
- rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
- rte_tel_data_add_dict_uint_hex(d, "dev_flags",
- eth_dev->data->dev_flags, 0);
- rte_tel_data_add_dict_uint_hex(d, "rx_offloads",
- eth_dev->data->dev_conf.rxmode.offloads, 0);
- rte_tel_data_add_dict_uint_hex(d, "tx_offloads",
- eth_dev->data->dev_conf.txmode.offloads, 0);
- rte_tel_data_add_dict_uint_hex(d, "ethdev_rss_hf",
- eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf, 0);
-
- return 0;
-}
-
int
rte_eth_representor_info_get(uint16_t port_id,
struct rte_eth_representor_info *info)
@@ -7033,24 +6722,3 @@ int rte_eth_dev_map_aggr_tx_affinity(uint16_t port_id, uint16_t tx_queue_id,
}
RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO);
-
-RTE_INIT(ethdev_init_telemetry)
-{
- rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
- "Returns list of available ethdev ports. Takes no parameters");
- rte_telemetry_register_cmd("/ethdev/stats", eth_dev_handle_port_stats,
- "Returns the common stats for a port. Parameters: int port_id");
- rte_telemetry_register_cmd("/ethdev/xstats", eth_dev_handle_port_xstats,
- "Returns the extended stats for a port. Parameters: int port_id,hide_zero=true|false(Optional for indicates hide zero xstats)");
-#ifndef RTE_EXEC_ENV_WINDOWS
- rte_telemetry_register_cmd("/ethdev/dump_priv", eth_dev_handle_port_dump_priv,
- "Returns dump private information for a port. Parameters: int port_id");
-#endif
- rte_telemetry_register_cmd("/ethdev/link_status",
- eth_dev_handle_port_link_status,
- "Returns the link status for a port. Parameters: int port_id");
- rte_telemetry_register_cmd("/ethdev/info", eth_dev_handle_port_info,
- "Returns the device info for a port. Parameters: int port_id");
- rte_telemetry_register_cmd("/ethdev/module_eeprom", eth_dev_handle_port_module_eeprom,
- "Returns module EEPROM info with SFF specs. Parameters: int port_id");
-}
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
new file mode 100644
index 000000000000..ec8e48877187
--- /dev/null
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -0,0 +1,344 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2017 Intel Corporation
+ */
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <rte_kvargs.h>
+#include <rte_telemetry.h>
+
+#include "rte_ethdev.h"
+#include "ethdev_driver.h"
+#include "sff_telemetry.h"
+
+static int
+eth_dev_handle_port_list(const char *cmd __rte_unused,
+ const char *params __rte_unused,
+ struct rte_tel_data *d)
+{
+ int port_id;
+
+ rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+ RTE_ETH_FOREACH_DEV(port_id)
+ rte_tel_data_add_array_int(d, port_id);
+ return 0;
+}
+
+static void
+eth_dev_add_port_queue_stats(struct rte_tel_data *d, uint64_t *q_stats,
+ const char *stat_name)
+{
+ int q;
+ struct rte_tel_data *q_data = rte_tel_data_alloc();
+ if (q_data == NULL)
+ return;
+ rte_tel_data_start_array(q_data, RTE_TEL_UINT_VAL);
+ for (q = 0; q < RTE_ETHDEV_QUEUE_STAT_CNTRS; q++)
+ rte_tel_data_add_array_uint(q_data, q_stats[q]);
+ rte_tel_data_add_dict_container(d, stat_name, q_data, 0);
+}
+
+static int
+eth_dev_parse_hide_zero(const char *key, const char *value, void *extra_args)
+{
+ RTE_SET_USED(key);
+
+ if (value == NULL)
+ return -1;
+
+ if (strcmp(value, "true") == 0)
+ *(bool *)extra_args = true;
+ else if (strcmp(value, "false") == 0)
+ *(bool *)extra_args = false;
+ else
+ return -1;
+
+ return 0;
+}
+
+#define ADD_DICT_STAT(stats, s) rte_tel_data_add_dict_uint(d, #s, stats.s)
+
+static int
+eth_dev_handle_port_stats(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_stats stats;
+ int port_id, ret;
+
+ if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ return -1;
+
+ port_id = atoi(params);
+ if (!rte_eth_dev_is_valid_port(port_id))
+ return -1;
+
+ ret = rte_eth_stats_get(port_id, &stats);
+ if (ret < 0)
+ return -1;
+
+ rte_tel_data_start_dict(d);
+ ADD_DICT_STAT(stats, ipackets);
+ ADD_DICT_STAT(stats, opackets);
+ ADD_DICT_STAT(stats, ibytes);
+ ADD_DICT_STAT(stats, obytes);
+ ADD_DICT_STAT(stats, imissed);
+ ADD_DICT_STAT(stats, ierrors);
+ ADD_DICT_STAT(stats, oerrors);
+ ADD_DICT_STAT(stats, rx_nombuf);
+ eth_dev_add_port_queue_stats(d, stats.q_ipackets, "q_ipackets");
+ eth_dev_add_port_queue_stats(d, stats.q_opackets, "q_opackets");
+ eth_dev_add_port_queue_stats(d, stats.q_ibytes, "q_ibytes");
+ eth_dev_add_port_queue_stats(d, stats.q_obytes, "q_obytes");
+ eth_dev_add_port_queue_stats(d, stats.q_errors, "q_errors");
+
+ return 0;
+}
+
+static int
+eth_dev_handle_port_xstats(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ const char *const valid_keys[] = { "hide_zero", NULL };
+ struct rte_eth_xstat *eth_xstats;
+ struct rte_eth_xstat_name *xstat_names;
+ struct rte_kvargs *kvlist;
+ int port_id, num_xstats;
+ bool hide_zero = false;
+ char *end_param;
+ int i, ret;
+
+ if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ return -1;
+
+ port_id = strtoul(params, &end_param, 0);
+ if (!rte_eth_dev_is_valid_port(port_id))
+ return -1;
+
+ if (*end_param != '\0') {
+ kvlist = rte_kvargs_parse(end_param, valid_keys);
+ ret = rte_kvargs_process(kvlist, NULL, eth_dev_parse_hide_zero, &hide_zero);
+ if (kvlist == NULL || ret != 0)
+ RTE_ETHDEV_LOG(NOTICE,
+ "Unknown extra parameters passed to ethdev telemetry command, ignoring\n");
+ rte_kvargs_free(kvlist);
+ }
+
+ num_xstats = rte_eth_xstats_get(port_id, NULL, 0);
+ if (num_xstats < 0)
+ return -1;
+
+ /* use one malloc for both names and stats */
+ eth_xstats = malloc((sizeof(struct rte_eth_xstat) +
+ sizeof(struct rte_eth_xstat_name)) * num_xstats);
+ if (eth_xstats == NULL)
+ return -1;
+ xstat_names = (void *)ð_xstats[num_xstats];
+
+ ret = rte_eth_xstats_get_names(port_id, xstat_names, num_xstats);
+ if (ret < 0 || ret > num_xstats) {
+ free(eth_xstats);
+ return -1;
+ }
+
+ ret = rte_eth_xstats_get(port_id, eth_xstats, num_xstats);
+ if (ret < 0 || ret > num_xstats) {
+ free(eth_xstats);
+ return -1;
+ }
+
+ rte_tel_data_start_dict(d);
+ for (i = 0; i < num_xstats; i++) {
+ if (hide_zero && eth_xstats[i].value == 0)
+ continue;
+ rte_tel_data_add_dict_uint(d, xstat_names[i].name,
+ eth_xstats[i].value);
+ }
+ free(eth_xstats);
+ return 0;
+}
+
+#ifndef RTE_EXEC_ENV_WINDOWS
+static int
+eth_dev_handle_port_dump_priv(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ char *buf, *end_param;
+ int port_id, ret;
+ FILE *f;
+
+ if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ return -EINVAL;
+
+ port_id = strtoul(params, &end_param, 0);
+ if (*end_param != '\0')
+ RTE_ETHDEV_LOG(NOTICE,
+ "Extra parameters passed to ethdev telemetry command, ignoring");
+ if (!rte_eth_dev_is_valid_port(port_id))
+ return -EINVAL;
+
+ buf = calloc(RTE_TEL_MAX_SINGLE_STRING_LEN, sizeof(char));
+ if (buf == NULL)
+ return -ENOMEM;
+
+ f = fmemopen(buf, RTE_TEL_MAX_SINGLE_STRING_LEN - 1, "w+");
+ if (f == NULL) {
+ free(buf);
+ return -EINVAL;
+ }
+
+ ret = rte_eth_dev_priv_dump(port_id, f);
+ fclose(f);
+ if (ret == 0) {
+ rte_tel_data_start_dict(d);
+ rte_tel_data_string(d, buf);
+ }
+
+ free(buf);
+ return 0;
+}
+#endif /* !RTE_EXEC_ENV_WINDOWS */
+
+static int
+eth_dev_handle_port_link_status(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ static const char *status_str = "status";
+ int ret, port_id;
+ struct rte_eth_link link;
+ char *end_param;
+
+ if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ return -1;
+
+ port_id = strtoul(params, &end_param, 0);
+ if (*end_param != '\0')
+ RTE_ETHDEV_LOG(NOTICE,
+ "Extra parameters passed to ethdev telemetry command, ignoring");
+ if (!rte_eth_dev_is_valid_port(port_id))
+ return -1;
+
+ ret = rte_eth_link_get_nowait(port_id, &link);
+ if (ret < 0)
+ return -1;
+
+ rte_tel_data_start_dict(d);
+ if (!link.link_status) {
+ rte_tel_data_add_dict_string(d, status_str, "DOWN");
+ return 0;
+ }
+ rte_tel_data_add_dict_string(d, status_str, "UP");
+ rte_tel_data_add_dict_uint(d, "speed", link.link_speed);
+ rte_tel_data_add_dict_string(d, "duplex",
+ (link.link_duplex == RTE_ETH_LINK_FULL_DUPLEX) ?
+ "full-duplex" : "half-duplex");
+ return 0;
+}
+
+static int
+eth_dev_handle_port_info(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_tel_data *rxq_state, *txq_state;
+ char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
+ struct rte_eth_dev *eth_dev;
+ char *end_param;
+ int port_id, i;
+
+ if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ return -1;
+
+ port_id = strtoul(params, &end_param, 0);
+ if (*end_param != '\0')
+ RTE_ETHDEV_LOG(NOTICE,
+ "Extra parameters passed to ethdev telemetry command, ignoring");
+
+ if (!rte_eth_dev_is_valid_port(port_id))
+ return -EINVAL;
+
+ eth_dev = &rte_eth_devices[port_id];
+
+ rxq_state = rte_tel_data_alloc();
+ if (!rxq_state)
+ return -ENOMEM;
+
+ txq_state = rte_tel_data_alloc();
+ if (!txq_state) {
+ rte_tel_data_free(rxq_state);
+ return -ENOMEM;
+ }
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
+ rte_tel_data_add_dict_int(d, "state", eth_dev->state);
+ rte_tel_data_add_dict_int(d, "nb_rx_queues",
+ eth_dev->data->nb_rx_queues);
+ rte_tel_data_add_dict_int(d, "nb_tx_queues",
+ eth_dev->data->nb_tx_queues);
+ rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id);
+ rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu);
+ rte_tel_data_add_dict_uint(d, "rx_mbuf_size_min",
+ eth_dev->data->min_rx_buf_size);
+ rte_ether_format_addr(mac_addr, sizeof(mac_addr),
+ eth_dev->data->mac_addrs);
+ rte_tel_data_add_dict_string(d, "mac_addr", mac_addr);
+ rte_tel_data_add_dict_int(d, "promiscuous",
+ eth_dev->data->promiscuous);
+ rte_tel_data_add_dict_int(d, "scattered_rx",
+ eth_dev->data->scattered_rx);
+ rte_tel_data_add_dict_int(d, "all_multicast",
+ eth_dev->data->all_multicast);
+ rte_tel_data_add_dict_int(d, "dev_started", eth_dev->data->dev_started);
+ rte_tel_data_add_dict_int(d, "lro", eth_dev->data->lro);
+ rte_tel_data_add_dict_int(d, "dev_configured",
+ eth_dev->data->dev_configured);
+
+ rte_tel_data_start_array(rxq_state, RTE_TEL_INT_VAL);
+ for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
+ rte_tel_data_add_array_int(rxq_state,
+ eth_dev->data->rx_queue_state[i]);
+
+ rte_tel_data_start_array(txq_state, RTE_TEL_INT_VAL);
+ for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
+ rte_tel_data_add_array_int(txq_state,
+ eth_dev->data->tx_queue_state[i]);
+
+ rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0);
+ rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0);
+ rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
+ rte_tel_data_add_dict_uint_hex(d, "dev_flags",
+ eth_dev->data->dev_flags, 0);
+ rte_tel_data_add_dict_uint_hex(d, "rx_offloads",
+ eth_dev->data->dev_conf.rxmode.offloads, 0);
+ rte_tel_data_add_dict_uint_hex(d, "tx_offloads",
+ eth_dev->data->dev_conf.txmode.offloads, 0);
+ rte_tel_data_add_dict_uint_hex(d, "ethdev_rss_hf",
+ eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf, 0);
+
+ return 0;
+}
+
+RTE_INIT(ethdev_init_telemetry)
+{
+ rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
+ "Returns list of available ethdev ports. Takes no parameters");
+ rte_telemetry_register_cmd("/ethdev/stats", eth_dev_handle_port_stats,
+ "Returns the common stats for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/xstats", eth_dev_handle_port_xstats,
+ "Returns the extended stats for a port. Parameters: int port_id,hide_zero=true|false(Optional for indicates hide zero xstats)");
+#ifndef RTE_EXEC_ENV_WINDOWS
+ rte_telemetry_register_cmd("/ethdev/dump_priv", eth_dev_handle_port_dump_priv,
+ "Returns dump private information for a port. Parameters: int port_id");
+#endif
+ rte_telemetry_register_cmd("/ethdev/link_status",
+ eth_dev_handle_port_link_status,
+ "Returns the link status for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/info", eth_dev_handle_port_info,
+ "Returns the device info for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/module_eeprom", eth_dev_handle_port_module_eeprom,
+ "Returns module EEPROM info with SFF specs. Parameters: int port_id");
+}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v2 02/13] ethdev: extract telemetry codes to a file
2023-06-07 7:41 ` [PATCH v2 02/13] ethdev: extract telemetry codes to a file Jie Hai
@ 2023-06-07 11:37 ` Ferruh Yigit
0 siblings, 0 replies; 36+ messages in thread
From: Ferruh Yigit @ 2023-06-07 11:37 UTC (permalink / raw)
To: Jie Hai, Thomas Monjalon, Andrew Rybchenko; +Cc: dev, liudongdong3
On 6/7/2023 8:41 AM, Jie Hai wrote:
> This patch extracts telemetry related codes in rte_ethdev.c
> to a new file rte_ethdev_telemetry.c.
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
<...>
> new file mode 100644
> index 000000000000..ec8e48877187
> --- /dev/null
> +++ b/lib/ethdev/rte_ethdev_telemetry.c
> @@ -0,0 +1,344 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2010-2017 Intel Corporation
> + */
>
Empty line after spdx tag
> +#include <ctype.h>
>
ctype.h can be removed from 'rte_ethdev.c' now
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 03/13] ethdev: extract codes parsing port ID as a function
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
2023-06-07 7:41 ` [PATCH v2 01/13] ethdev: fix incorrect argument of calloc Jie Hai
2023-06-07 7:41 ` [PATCH v2 02/13] ethdev: extract telemetry codes to a file Jie Hai
@ 2023-06-07 7:41 ` Jie Hai
2023-06-07 11:37 ` Ferruh Yigit
2023-06-07 7:41 ` [PATCH v2 04/13] ethdev: support telemetry query MAC addresses Jie Hai
` (10 subsequent siblings)
13 siblings, 1 reply; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:41 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch extracts codes parsing port_id as a function.
The port id of 'int' or 'unsigned long' type passing as
'uint16_t' may cause truncation, fix it.
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 95 ++++++++++++++++---------------
lib/ethdev/sff_telemetry.c | 4 +-
2 files changed, 52 insertions(+), 47 deletions(-)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index ec8e48877187..5e70d0c2a66a 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -11,6 +11,29 @@
#include "ethdev_driver.h"
#include "sff_telemetry.h"
+static int
+eth_dev_parse_port_params(const char *params __rte_unused, uint16_t *port_id,
+ char **end_param, bool has_next)
+{
+ uint64_t pi;
+
+ if (params == NULL || strlen(params) == 0 ||
+ !isdigit(*params) || port_id == NULL)
+ return -EINVAL;
+
+ pi = strtoul(params, end_param, 0);
+ if (**end_param != '\0' && !has_next)
+ RTE_ETHDEV_LOG(NOTICE,
+ "Extra parameters passed to ethdev telemetry command, ignoring\n");
+
+ if (pi >= UINT16_MAX || !rte_eth_dev_is_valid_port(pi))
+ return -EINVAL;
+
+ *port_id = pi;
+
+ return 0;
+}
+
static int
eth_dev_handle_port_list(const char *cmd __rte_unused,
const char *params __rte_unused,
@@ -64,14 +87,13 @@ eth_dev_handle_port_stats(const char *cmd __rte_unused,
struct rte_tel_data *d)
{
struct rte_eth_stats stats;
- int port_id, ret;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
+ uint16_t port_id;
+ char *end_param;
+ int ret;
- port_id = atoi(params);
- if (!rte_eth_dev_is_valid_port(port_id))
- return -1;
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
ret = rte_eth_stats_get(port_id, &stats);
if (ret < 0)
@@ -104,17 +126,15 @@ eth_dev_handle_port_xstats(const char *cmd __rte_unused,
struct rte_eth_xstat *eth_xstats;
struct rte_eth_xstat_name *xstat_names;
struct rte_kvargs *kvlist;
- int port_id, num_xstats;
bool hide_zero = false;
+ uint16_t port_id;
char *end_param;
+ int num_xstats;
int i, ret;
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
-
- port_id = strtoul(params, &end_param, 0);
- if (!rte_eth_dev_is_valid_port(port_id))
- return -1;
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, true);
+ if (ret < 0)
+ return ret;
if (*end_param != '\0') {
kvlist = rte_kvargs_parse(end_param, valid_keys);
@@ -166,18 +186,13 @@ eth_dev_handle_port_dump_priv(const char *cmd __rte_unused,
struct rte_tel_data *d)
{
char *buf, *end_param;
- int port_id, ret;
+ uint16_t port_id;
+ int ret;
FILE *f;
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -EINVAL;
-
- port_id = strtoul(params, &end_param, 0);
- if (*end_param != '\0')
- RTE_ETHDEV_LOG(NOTICE,
- "Extra parameters passed to ethdev telemetry command, ignoring");
- if (!rte_eth_dev_is_valid_port(port_id))
- return -EINVAL;
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
buf = calloc(RTE_TEL_MAX_SINGLE_STRING_LEN, sizeof(char));
if (buf == NULL)
@@ -207,19 +222,14 @@ eth_dev_handle_port_link_status(const char *cmd __rte_unused,
struct rte_tel_data *d)
{
static const char *status_str = "status";
- int ret, port_id;
struct rte_eth_link link;
+ uint16_t port_id;
char *end_param;
+ int ret;
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
-
- port_id = strtoul(params, &end_param, 0);
- if (*end_param != '\0')
- RTE_ETHDEV_LOG(NOTICE,
- "Extra parameters passed to ethdev telemetry command, ignoring");
- if (!rte_eth_dev_is_valid_port(port_id))
- return -1;
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
ret = rte_eth_link_get_nowait(port_id, &link);
if (ret < 0)
@@ -246,19 +256,14 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
struct rte_tel_data *rxq_state, *txq_state;
char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
struct rte_eth_dev *eth_dev;
+ uint16_t port_id;
char *end_param;
- int port_id, i;
-
- if (params == NULL || strlen(params) == 0 || !isdigit(*params))
- return -1;
+ int ret;
+ int i;
- port_id = strtoul(params, &end_param, 0);
- if (*end_param != '\0')
- RTE_ETHDEV_LOG(NOTICE,
- "Extra parameters passed to ethdev telemetry command, ignoring");
-
- if (!rte_eth_dev_is_valid_port(port_id))
- return -EINVAL;
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
eth_dev = &rte_eth_devices[port_id];
diff --git a/lib/ethdev/sff_telemetry.c b/lib/ethdev/sff_telemetry.c
index 5923350424c0..f29e7fa882ac 100644
--- a/lib/ethdev/sff_telemetry.c
+++ b/lib/ethdev/sff_telemetry.c
@@ -126,7 +126,7 @@ eth_dev_handle_port_module_eeprom(const char *cmd __rte_unused, const char *para
struct rte_tel_data *d)
{
char *end_param;
- int port_id;
+ uint64_t port_id;
if (params == NULL || strlen(params) == 0 || !isdigit(*params))
return -1;
@@ -134,7 +134,7 @@ eth_dev_handle_port_module_eeprom(const char *cmd __rte_unused, const char *para
errno = 0;
port_id = strtoul(params, &end_param, 0);
- if (errno != 0) {
+ if (errno != 0 || port_id >= UINT16_MAX) {
RTE_ETHDEV_LOG(ERR, "Invalid argument, %d\n", errno);
return -1;
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v2 03/13] ethdev: extract codes parsing port ID as a function
2023-06-07 7:41 ` [PATCH v2 03/13] ethdev: extract codes parsing port ID as a function Jie Hai
@ 2023-06-07 11:37 ` Ferruh Yigit
0 siblings, 0 replies; 36+ messages in thread
From: Ferruh Yigit @ 2023-06-07 11:37 UTC (permalink / raw)
To: Jie Hai, Thomas Monjalon, Andrew Rybchenko; +Cc: dev, liudongdong3
On 6/7/2023 8:41 AM, Jie Hai wrote:
> This patch extracts codes parsing port_id as a function.
> The port id of 'int' or 'unsigned long' type passing as
> 'uint16_t' may cause truncation, fix it.
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> ---
> lib/ethdev/rte_ethdev_telemetry.c | 95 ++++++++++++++++---------------
> lib/ethdev/sff_telemetry.c | 4 +-
> 2 files changed, 52 insertions(+), 47 deletions(-)
>
> diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
> index ec8e48877187..5e70d0c2a66a 100644
> --- a/lib/ethdev/rte_ethdev_telemetry.c
> +++ b/lib/ethdev/rte_ethdev_telemetry.c
> @@ -11,6 +11,29 @@
> #include "ethdev_driver.h"
> #include "sff_telemetry.h"
>
> +static int
> +eth_dev_parse_port_params(const char *params __rte_unused, uint16_t *port_id,
> + char **end_param, bool has_next)
>
'__rte_unused' is not required for 'params'
> +{
> + uint64_t pi;
> +
> + if (params == NULL || strlen(params) == 0 ||
> + !isdigit(*params) || port_id == NULL)
> + return -EINVAL;
> +
> + pi = strtoul(params, end_param, 0);
> + if (**end_param != '\0' && !has_next)
> + RTE_ETHDEV_LOG(NOTICE,
> + "Extra parameters passed to ethdev telemetry command, ignoring\n");
> +
> + if (pi >= UINT16_MAX || !rte_eth_dev_is_valid_port(pi))
> + return -EINVAL;
> +
> + *port_id = pi;
>
there is 64 -> 16 bit conversion, there is a "pi >= UINT16_MAX" check
already but not sure if all compilers get it, better to add explicit
cast for any case.
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 04/13] ethdev: support telemetry query MAC addresses
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (2 preceding siblings ...)
2023-06-07 7:41 ` [PATCH v2 03/13] ethdev: extract codes parsing port ID as a function Jie Hai
@ 2023-06-07 7:41 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 05/13] ethdev: support RxTx offload display Jie Hai
` (9 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:41 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
From: Dengdui Huang <huangdengdui@huawei.com>
This patch support telemetry query MAC addresses for a specific port.
The command is like:
--> /ethdev/macs,0
{
"/ethdev/macs": [
"00:18:2D:00:00:79",
"00:18:2D:00:00:78",
"00:18:2D:00:00:77"
]
}
Signed-off-by: Dengdui Huang <huangdengdui@huawei.com>
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 37 +++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index 5e70d0c2a66a..6ba7adf7d08f 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -327,6 +327,41 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
return 0;
}
+static int
+eth_dev_handle_port_macs(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
+ struct rte_eth_dev_info dev_info;
+ struct rte_eth_dev *eth_dev;
+ uint16_t port_id;
+ char *end_param;
+ uint32_t i;
+ int ret;
+
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
+
+ ret = rte_eth_dev_info_get(port_id, &dev_info);
+ if (ret != 0)
+ return ret;
+
+ eth_dev = &rte_eth_devices[port_id];
+ rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+ for (i = 0; i < dev_info.max_mac_addrs; i++) {
+ if (rte_is_zero_ether_addr(ð_dev->data->mac_addrs[i]))
+ continue;
+
+ rte_ether_format_addr(mac_addr, sizeof(mac_addr),
+ ð_dev->data->mac_addrs[i]);
+ rte_tel_data_add_array_string(d, mac_addr);
+ }
+
+ return 0;
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -346,4 +381,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns the device info for a port. Parameters: int port_id");
rte_telemetry_register_cmd("/ethdev/module_eeprom", eth_dev_handle_port_module_eeprom,
"Returns module EEPROM info with SFF specs. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/macs", eth_dev_handle_port_macs,
+ "Returns the MAC addresses for a port. Parameters: int port_id");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 05/13] ethdev: support RxTx offload display
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (3 preceding siblings ...)
2023-06-07 7:41 ` [PATCH v2 04/13] ethdev: support telemetry query MAC addresses Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 06/13] ethdev: support telemetry query flow ctrl info Jie Hai
` (8 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
Currently, Rx/Tx offloads are displayed in numeric format,
which is not easy to understand. This patch fixes it.
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 64 ++++++++++++++++++++++++++-----
1 file changed, 55 insertions(+), 9 deletions(-)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index 6ba7adf7d08f..3b6060a7356a 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -248,11 +248,38 @@ eth_dev_handle_port_link_status(const char *cmd __rte_unused,
return 0;
}
+static void
+eth_dev_parse_rx_offloads(uint64_t offload, struct rte_tel_data *d)
+{
+ uint64_t i;
+
+ rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+ for (i = 0; i < CHAR_BIT * sizeof(offload); i++) {
+ if ((offload & RTE_BIT64(i)) != 0)
+ rte_tel_data_add_array_string(d,
+ rte_eth_dev_rx_offload_name(offload & RTE_BIT64(i)));
+ }
+}
+
+static void
+eth_dev_parse_tx_offloads(uint64_t offload, struct rte_tel_data *d)
+{
+ uint64_t i;
+
+ rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+ for (i = 0; i < CHAR_BIT * sizeof(offload); i++) {
+ if ((offload & RTE_BIT64(i)) != 0)
+ rte_tel_data_add_array_string(d,
+ rte_eth_dev_tx_offload_name(offload & RTE_BIT64(i)));
+ }
+}
+
static int
eth_dev_handle_port_info(const char *cmd __rte_unused,
const char *params,
struct rte_tel_data *d)
{
+ struct rte_tel_data *rx_offload, *tx_offload;
struct rte_tel_data *rxq_state, *txq_state;
char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
struct rte_eth_dev *eth_dev;
@@ -268,14 +295,20 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
eth_dev = &rte_eth_devices[port_id];
rxq_state = rte_tel_data_alloc();
- if (!rxq_state)
+ if (rxq_state == NULL)
return -ENOMEM;
txq_state = rte_tel_data_alloc();
- if (!txq_state) {
- rte_tel_data_free(rxq_state);
- return -ENOMEM;
- }
+ if (txq_state == NULL)
+ goto free_rxq_state;
+
+ rx_offload = rte_tel_data_alloc();
+ if (rx_offload == NULL)
+ goto free_txq_state;
+
+ tx_offload = rte_tel_data_alloc();
+ if (tx_offload == NULL)
+ goto free_rx_offload;
rte_tel_data_start_dict(d);
rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
@@ -317,14 +350,27 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node);
rte_tel_data_add_dict_uint_hex(d, "dev_flags",
eth_dev->data->dev_flags, 0);
- rte_tel_data_add_dict_uint_hex(d, "rx_offloads",
- eth_dev->data->dev_conf.rxmode.offloads, 0);
- rte_tel_data_add_dict_uint_hex(d, "tx_offloads",
- eth_dev->data->dev_conf.txmode.offloads, 0);
+
+ eth_dev_parse_rx_offloads(eth_dev->data->dev_conf.rxmode.offloads,
+ rx_offload);
+ rte_tel_data_add_dict_container(d, "rx_offloads", rx_offload, 0);
+ eth_dev_parse_tx_offloads(eth_dev->data->dev_conf.txmode.offloads,
+ tx_offload);
+ rte_tel_data_add_dict_container(d, "tx_offloads", tx_offload, 0);
+
rte_tel_data_add_dict_uint_hex(d, "ethdev_rss_hf",
eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf, 0);
return 0;
+
+free_rx_offload:
+ rte_tel_data_free(rx_offload);
+free_txq_state:
+ rte_tel_data_free(txq_state);
+free_rxq_state:
+ rte_tel_data_free(rxq_state);
+
+ return -ENOMEM;
}
static int
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 06/13] ethdev: support telemetry query flow ctrl info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (4 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 05/13] ethdev: support RxTx offload display Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 07/13] ethdev: support telemetry query Rx queue info Jie Hai
` (7 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch supports telemetry querying flow control info.
The command is like:
--> /ethdev/flow_ctrl,0
{
"/ethdev/flow_ctrl": {
"high_waterline": "0x0",
"low_waterline": "0x0",
"pause_time": "0xffff",
"send_xon": "off",
"mac_ctrl_frame_fwd": "off",
"rx_pause": "off",
"tx_pause": "off",
"autoneg": "off"
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 44 +++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index 3b6060a7356a..9847aa528f14 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -408,6 +408,48 @@ eth_dev_handle_port_macs(const char *cmd __rte_unused,
return 0;
}
+static int
+eth_dev_handle_port_flow_ctrl(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_fc_conf fc_conf;
+ uint16_t port_id;
+ char *end_param;
+ bool rx_fc_en;
+ bool tx_fc_en;
+ int ret;
+
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
+
+ ret = rte_eth_dev_flow_ctrl_get(port_id, &fc_conf);
+ if (ret != 0) {
+ RTE_ETHDEV_LOG(ERR,
+ "Failed to get flow ctrl info, ret = %d\n", ret);
+ return ret;
+ }
+
+ rx_fc_en = fc_conf.mode == RTE_ETH_FC_RX_PAUSE ||
+ fc_conf.mode == RTE_ETH_FC_FULL;
+ tx_fc_en = fc_conf.mode == RTE_ETH_FC_TX_PAUSE ||
+ fc_conf.mode == RTE_ETH_FC_FULL;
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_uint_hex(d, "high_waterline", fc_conf.high_water, 0);
+ rte_tel_data_add_dict_uint_hex(d, "low_waterline", fc_conf.low_water, 0);
+ rte_tel_data_add_dict_uint_hex(d, "pause_time", fc_conf.pause_time, 0);
+ rte_tel_data_add_dict_string(d, "send_xon", fc_conf.send_xon ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "mac_ctrl_frame_fwd",
+ fc_conf.mac_ctrl_frame_fwd ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "rx_pause", rx_fc_en ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "tx_pause", tx_fc_en ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "autoneg", fc_conf.autoneg ? "on" : "off");
+
+ return 0;
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -429,4 +471,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns module EEPROM info with SFF specs. Parameters: int port_id");
rte_telemetry_register_cmd("/ethdev/macs", eth_dev_handle_port_macs,
"Returns the MAC addresses for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/flow_ctrl", eth_dev_handle_port_flow_ctrl,
+ "Returns flow ctrl info for a port. Parameters: int port_id");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 07/13] ethdev: support telemetry query Rx queue info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (5 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 06/13] ethdev: support telemetry query flow ctrl info Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 08/13] ethdev: support telemetry query Tx " Jie Hai
` (6 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch support querying information of Rx queues.
The command is like:
--> /ethdev/rx_queue,0,0
{
"/ethdev/rx_queue": {
"mempool_name": "mb_pool_0",
"socket_id": 0,
"host_threshold": 0,
"prefetch_threshold": 0,
"writeback_threshold": 0,
"free_threshold": 32,
"rx_drop_en": "on",
"deferred_start": "off",
"rx_nseg": 0,
"share_group": 0,
"share_qid": 0,
"offloads": [
"RSS_HASH"
],
"rx_nmempool": 0,
"scattered_rx": "off",
"queue_state": 1,
"nb_desc": 1024,
"rx_buf_size": 2048,
"avail_thresh": 0,
"burst_flags": 0,
"burst_mode": "Vector Neon"
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 127 ++++++++++++++++++++++++++++++
1 file changed, 127 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index 9847aa528f14..d1875dbe110e 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -450,6 +450,131 @@ eth_dev_handle_port_flow_ctrl(const char *cmd __rte_unused,
return 0;
}
+static int
+ethdev_parse_queue_params(const char *params, bool is_rx,
+ uint16_t *port_id, uint16_t *queue_id)
+{
+ struct rte_eth_dev *dev;
+ const char *qid_param;
+ uint16_t nb_queues;
+ char *end_param;
+ uint64_t qid;
+ int ret;
+
+ ret = eth_dev_parse_port_params(params, port_id, &end_param, true);
+ if (ret < 0)
+ return ret;
+
+ dev = &rte_eth_devices[*port_id];
+ nb_queues = is_rx ? dev->data->nb_rx_queues : dev->data->nb_tx_queues;
+ if (nb_queues == 1 && *end_param == '\0')
+ qid = 0;
+ else {
+ qid_param = strtok(end_param, ",");
+ if (!qid_param || strlen(qid_param) == 0 || !isdigit(*qid_param))
+ return -EINVAL;
+
+ qid = strtoul(qid_param, &end_param, 0);
+ }
+ if (*end_param != '\0')
+ RTE_ETHDEV_LOG(NOTICE,
+ "Extra parameters passed to ethdev telemetry command, ignoring\n");
+
+ if (qid >= UINT16_MAX)
+ return -EINVAL;
+
+ *queue_id = qid;
+ return 0;
+}
+
+static int
+eth_dev_add_burst_mode(uint16_t port_id, uint16_t queue_id,
+ bool is_rx, struct rte_tel_data *d)
+{
+ struct rte_eth_burst_mode mode;
+ int ret;
+
+ if (is_rx)
+ ret = rte_eth_rx_burst_mode_get(port_id, queue_id, &mode);
+ else
+ ret = rte_eth_tx_burst_mode_get(port_id, queue_id, &mode);
+
+ if (ret == -ENOTSUP)
+ return 0;
+
+ if (ret != 0) {
+ RTE_ETHDEV_LOG(ERR,
+ "Failed to get burst mode for port %u\n", port_id);
+ return ret;
+ }
+
+ rte_tel_data_add_dict_uint(d, "burst_flags", mode.flags);
+ rte_tel_data_add_dict_string(d, "burst_mode", mode.info);
+ return 0;
+}
+
+static int
+eth_dev_handle_port_rxq(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_thresh *rx_thresh;
+ struct rte_eth_rxconf *rxconf;
+ struct rte_eth_rxq_info qinfo;
+ struct rte_tel_data *offload;
+ uint16_t port_id, queue_id;
+ int ret;
+
+ ret = ethdev_parse_queue_params(params, true, &port_id, &queue_id);
+ if (ret != 0)
+ return ret;
+
+ ret = rte_eth_rx_queue_info_get(port_id, queue_id, &qinfo);
+ if (ret != 0)
+ return ret;
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_string(d, "mempool_name", qinfo.mp->name);
+ rte_tel_data_add_dict_uint(d, "socket_id", qinfo.mp->socket_id);
+
+ rx_thresh = &qinfo.conf.rx_thresh;
+ rte_tel_data_add_dict_uint(d, "host_threshold", rx_thresh->hthresh);
+ rte_tel_data_add_dict_uint(d, "prefetch_threshold", rx_thresh->pthresh);
+ rte_tel_data_add_dict_uint(d, "writeback_threshold", rx_thresh->wthresh);
+
+ rxconf = &qinfo.conf;
+ rte_tel_data_add_dict_uint(d, "free_threshold", rxconf->rx_free_thresh);
+ rte_tel_data_add_dict_string(d, "rx_drop_en",
+ rxconf->rx_drop_en == 0 ? "off" : "on");
+ rte_tel_data_add_dict_string(d, "deferred_start",
+ rxconf->rx_deferred_start == 0 ? "off" : "on");
+ rte_tel_data_add_dict_uint(d, "rx_nseg", rxconf->rx_nseg);
+ rte_tel_data_add_dict_uint(d, "share_group", rxconf->share_group);
+ rte_tel_data_add_dict_uint(d, "share_qid", rxconf->share_qid);
+
+ offload = rte_tel_data_alloc();
+ if (offload == NULL)
+ return -ENOMEM;
+
+ eth_dev_parse_rx_offloads(rxconf->offloads, offload);
+ rte_tel_data_add_dict_container(d, "offloads", offload, 0);
+
+ rte_tel_data_add_dict_uint(d, "rx_nmempool", rxconf->rx_nmempool);
+
+ rte_tel_data_add_dict_string(d, "scattered_rx",
+ qinfo.scattered_rx == 0 ? "off" : "on");
+ rte_tel_data_add_dict_uint(d, "queue_state", qinfo.queue_state);
+ rte_tel_data_add_dict_uint(d, "nb_desc", qinfo.nb_desc);
+ rte_tel_data_add_dict_uint(d, "rx_buf_size", qinfo.rx_buf_size);
+ rte_tel_data_add_dict_uint(d, "avail_thresh", qinfo.avail_thresh);
+
+ ret = eth_dev_add_burst_mode(port_id, queue_id, true, d);
+ if (ret != 0)
+ rte_tel_data_free(offload);
+
+ return ret;
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -473,4 +598,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns the MAC addresses for a port. Parameters: int port_id");
rte_telemetry_register_cmd("/ethdev/flow_ctrl", eth_dev_handle_port_flow_ctrl,
"Returns flow ctrl info for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/rx_queue", eth_dev_handle_port_rxq,
+ "Returns Rx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 08/13] ethdev: support telemetry query Tx queue info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (6 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 07/13] ethdev: support telemetry query Rx queue info Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 09/13] ethdev: add firmware version in telemetry info command Jie Hai
` (5 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch support querying information of Tx queues.
The command is like:
--> /ethdev/tx_queue,0,0
{
"/ethdev/tx_queue": {
"host_threshold": 0,
"prefetch_threshold": 0,
"writeback_threshold": 0,
"rs_threshold": 32,
"free_threshold": 928,
"deferred_start": "off",
"offloads": [
"MBUF_FAST_FREE"
],
"queue_state": 1,
"nb_desc": 1024,
"burst_flags": 0,
"burst_mode": "Vector Neon"
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 50 +++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index d1875dbe110e..f69bcedac86f 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -575,6 +575,54 @@ eth_dev_handle_port_rxq(const char *cmd __rte_unused,
return ret;
}
+static int
+eth_dev_handle_port_txq(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_thresh *tx_thresh;
+ struct rte_eth_txconf *txconf;
+ struct rte_eth_txq_info qinfo;
+ struct rte_tel_data *offload;
+ uint16_t port_id, queue_id;
+ int ret;
+
+ ret = ethdev_parse_queue_params(params, false, &port_id, &queue_id);
+ if (ret != 0)
+ return ret;
+
+ ret = rte_eth_tx_queue_info_get(port_id, queue_id, &qinfo);
+ if (ret != 0)
+ return ret;
+
+ rte_tel_data_start_dict(d);
+ tx_thresh = &qinfo.conf.tx_thresh;
+ txconf = &qinfo.conf;
+ rte_tel_data_add_dict_uint(d, "host_threshold", tx_thresh->hthresh);
+ rte_tel_data_add_dict_uint(d, "prefetch_threshold", tx_thresh->pthresh);
+ rte_tel_data_add_dict_uint(d, "writeback_threshold", tx_thresh->wthresh);
+ rte_tel_data_add_dict_uint(d, "rs_threshold", txconf->tx_rs_thresh);
+ rte_tel_data_add_dict_uint(d, "free_threshold", txconf->tx_free_thresh);
+ rte_tel_data_add_dict_string(d, "deferred_start",
+ txconf->tx_deferred_start == 0 ? "off" : "on");
+
+ offload = rte_tel_data_alloc();
+ if (offload == NULL)
+ return -ENOMEM;
+
+ eth_dev_parse_tx_offloads(txconf->offloads, offload);
+ rte_tel_data_add_dict_container(d, "offloads", offload, 0);
+
+ rte_tel_data_add_dict_uint(d, "queue_state", qinfo.queue_state);
+ rte_tel_data_add_dict_uint(d, "nb_desc", qinfo.nb_desc);
+
+ ret = eth_dev_add_burst_mode(port_id, queue_id, false, d);
+ if (ret != 0)
+ rte_tel_data_free(offload);
+
+ return 0;
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -600,4 +648,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns flow ctrl info for a port. Parameters: int port_id");
rte_telemetry_register_cmd("/ethdev/rx_queue", eth_dev_handle_port_rxq,
"Returns Rx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
+ rte_telemetry_register_cmd("/ethdev/tx_queue", eth_dev_handle_port_txq,
+ "Returns Tx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 09/13] ethdev: add firmware version in telemetry info command
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (7 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 08/13] ethdev: support telemetry query Tx " Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 10/13] ethdev: support telemetry query DCB info Jie Hai
` (4 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch adds firmware version in telemetry info command.
An example is like:
--> /ethdev/info,0
{
"/ethdev/info": {
"name": "0000:bd:00.0",
"fw_version": "1.20.0.17",
....
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index f69bcedac86f..930181e5324f 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -281,6 +281,7 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
{
struct rte_tel_data *rx_offload, *tx_offload;
struct rte_tel_data *rxq_state, *txq_state;
+ char fw_version[RTE_TEL_MAX_STRING_LEN];
char mac_addr[RTE_ETHER_ADDR_FMT_SIZE];
struct rte_eth_dev *eth_dev;
uint16_t port_id;
@@ -312,6 +313,11 @@ eth_dev_handle_port_info(const char *cmd __rte_unused,
rte_tel_data_start_dict(d);
rte_tel_data_add_dict_string(d, "name", eth_dev->data->name);
+
+ if (rte_eth_dev_fw_version_get(port_id, fw_version,
+ RTE_TEL_MAX_STRING_LEN) == 0)
+ rte_tel_data_add_dict_string(d, "fw_version", fw_version);
+
rte_tel_data_add_dict_int(d, "state", eth_dev->state);
rte_tel_data_add_dict_int(d, "nb_rx_queues",
eth_dev->data->nb_rx_queues);
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 10/13] ethdev: support telemetry query DCB info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (8 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 09/13] ethdev: add firmware version in telemetry info command Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 11/13] ethdev: support telemetry query RSS info Jie Hai
` (3 subsequent siblings)
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch supports querying DCB info.
The command is like:
--> /ethdev/dcb,0
{
"/ethdev/dcb": {
"tc_num": 1,
"tc0": {
"priority": 0,
"bw_percent": "100%",
"rxq_base": 0,
"txq_base": 0,
"nb_rxq": 4,
"nb_txq": 4
}
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 79 +++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index 930181e5324f..d0d55993102b 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -629,6 +629,83 @@ eth_dev_handle_port_txq(const char *cmd __rte_unused,
return 0;
}
+static int
+eth_dev_add_dcb_tc(struct rte_eth_dcb_info *dcb_info, struct rte_tel_data *d)
+{
+ struct rte_tel_data *tcds[RTE_ETH_DCB_NUM_TCS] = {NULL};
+ struct rte_eth_dcb_tc_queue_mapping *tcq;
+ char bw_percent[RTE_TEL_MAX_STRING_LEN];
+ char name[RTE_TEL_MAX_STRING_LEN];
+ struct rte_tel_data *tcd;
+ uint32_t i;
+
+ for (i = 0; i < dcb_info->nb_tcs; i++) {
+ tcd = rte_tel_data_alloc();
+ if (tcd == NULL) {
+ while (i-- > 0)
+ rte_tel_data_free(tcds[i]);
+ return -ENOMEM;
+ }
+
+ tcds[i] = tcd;
+ rte_tel_data_start_dict(tcd);
+
+ rte_tel_data_add_dict_uint(tcd, "priority", dcb_info->prio_tc[i]);
+ snprintf(bw_percent, RTE_TEL_MAX_STRING_LEN,
+ "%u%%", dcb_info->tc_bws[i]);
+ rte_tel_data_add_dict_string(tcd, "bw_percent", bw_percent);
+
+ tcq = &dcb_info->tc_queue;
+ rte_tel_data_add_dict_uint(tcd, "rxq_base", tcq->tc_rxq[0][i].base);
+ rte_tel_data_add_dict_uint(tcd, "txq_base", tcq->tc_txq[0][i].base);
+ rte_tel_data_add_dict_uint(tcd, "nb_rxq", tcq->tc_rxq[0][i].nb_queue);
+ rte_tel_data_add_dict_uint(tcd, "nb_txq", tcq->tc_txq[0][i].nb_queue);
+
+ snprintf(name, RTE_TEL_MAX_STRING_LEN, "tc%u", i);
+ rte_tel_data_add_dict_container(d, name, tcd, 0);
+ }
+
+ return 0;
+}
+
+static int
+eth_dev_add_dcb_info(uint16_t port_id, struct rte_tel_data *d)
+{
+ struct rte_eth_dcb_info dcb_info;
+ int ret;
+
+ ret = rte_eth_dev_get_dcb_info(port_id, &dcb_info);
+ if (ret != 0) {
+ RTE_ETHDEV_LOG(ERR,
+ "Failed to get dcb info, ret = %d\n", ret);
+ return ret;
+ }
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_uint(d, "tc_num", dcb_info.nb_tcs);
+
+ if (dcb_info.nb_tcs > 0)
+ return eth_dev_add_dcb_tc(&dcb_info, d);
+
+ return 0;
+}
+
+static int
+eth_dev_handle_port_dcb(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ uint16_t port_id;
+ char *end_param;
+ int ret;
+
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
+
+ return eth_dev_add_dcb_info(port_id, d);
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -656,4 +733,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns Rx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
rte_telemetry_register_cmd("/ethdev/tx_queue", eth_dev_handle_port_txq,
"Returns Tx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
+ rte_telemetry_register_cmd("/ethdev/dcb", eth_dev_handle_port_dcb,
+ "Returns DCB info for a port. Parameters: int port_id");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 11/13] ethdev: support telemetry query RSS info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (9 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 10/13] ethdev: support telemetry query DCB info Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 14:08 ` Ferruh Yigit
2023-06-07 7:42 ` [PATCH v2 12/13] ethdev: support telemetry query FEC info Jie Hai
` (2 subsequent siblings)
13 siblings, 1 reply; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch supports querying RSS info by telemetry command.
The command is like:
--> /ethdev/rss_info,0
{
"/ethdev/rss_info": {
"rss_hf": "0x238c",
"rss_key_len": 40,
"rss_key": "6d5a56da255b0ec24167253d43a38fb0d0ca2b\
cbae7b30b477cb2da38030f20c6a42b73bbeac01fa"
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 79 +++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index d0d55993102b..d42901fe57b1 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -706,6 +706,83 @@ eth_dev_handle_port_dcb(const char *cmd __rte_unused,
return eth_dev_add_dcb_info(port_id, d);
}
+static int
+eth_dev_add_rss_info(struct rte_eth_rss_conf *rss_conf, struct rte_tel_data *d)
+{
+ const uint32_t key_len = rss_conf->rss_key_len * 2 + 1;
+ char *rss_key;
+ char *key;
+ uint32_t i;
+ int ret;
+
+ key = malloc(key_len);
+ if (key == NULL)
+ return -ENOMEM;
+
+ rss_key = malloc(key_len);
+ if (rss_key == NULL) {
+ ret = -ENOMEM;
+ goto free_key;
+ }
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_uint_hex(d, "rss_hf", rss_conf->rss_hf, 0);
+ rte_tel_data_add_dict_uint(d, "rss_key_len", rss_conf->rss_key_len);
+
+ memset(rss_key, 0, key_len);
+ for (i = 0; i < rss_conf->rss_key_len; i++) {
+ ret = snprintf(key, key_len, "%02x", rss_conf->rss_key[i]);
+ if (ret < 0)
+ goto free_rss_key;
+ strlcat(rss_key, key, key_len);
+ }
+ ret = rte_tel_data_add_dict_string(d, "rss_key", rss_key);
+
+free_rss_key:
+ free(rss_key);
+free_key:
+ free(key);
+ return ret;
+}
+
+static int
+eth_dev_handle_port_rss_info(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_dev_info dev_info;
+ struct rte_eth_rss_conf rss_conf;
+ uint16_t port_id;
+ char *end_param;
+ int ret;
+
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
+
+ ret = rte_eth_dev_info_get(port_id, &dev_info);
+ if (ret != 0) {
+ RTE_ETHDEV_LOG(ERR,
+ "Failed to get device info, ret = %d\n", ret);
+ return ret;
+ }
+
+ rss_conf.rss_key_len = dev_info.hash_key_size;
+ rss_conf.rss_key = malloc(dev_info.hash_key_size);
+ if (rss_conf.rss_key == NULL)
+ return -ENOMEM;
+
+ ret = rte_eth_dev_rss_hash_conf_get(port_id, &rss_conf);
+ if (ret != 0) {
+ free(rss_conf.rss_key);
+ return ret;
+ }
+
+ ret = eth_dev_add_rss_info(&rss_conf, d);
+ free(rss_conf.rss_key);
+ return ret;
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -735,4 +812,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns Tx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
rte_telemetry_register_cmd("/ethdev/dcb", eth_dev_handle_port_dcb,
"Returns DCB info for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/rss_info", eth_dev_handle_port_rss_info,
+ "Returns RSS info for a port. Parameters: int port_id");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v2 11/13] ethdev: support telemetry query RSS info
2023-06-07 7:42 ` [PATCH v2 11/13] ethdev: support telemetry query RSS info Jie Hai
@ 2023-06-07 14:08 ` Ferruh Yigit
0 siblings, 0 replies; 36+ messages in thread
From: Ferruh Yigit @ 2023-06-07 14:08 UTC (permalink / raw)
To: Jie Hai, Thomas Monjalon, Andrew Rybchenko; +Cc: dev, liudongdong3
On 6/7/2023 8:42 AM, Jie Hai wrote:
> This patch supports querying RSS info by telemetry command.
> The command is like:
> --> /ethdev/rss_info,0
> {
> "/ethdev/rss_info": {
> "rss_hf": "0x238c",
> "rss_key_len": 40,
> "rss_key": "6d5a56da255b0ec24167253d43a38fb0d0ca2b\
> cbae7b30b477cb2da38030f20c6a42b73bbeac01fa"
> }
> }
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> ---
> lib/ethdev/rte_ethdev_telemetry.c | 79 +++++++++++++++++++++++++++++++
> 1 file changed, 79 insertions(+)
>
> diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
> index d0d55993102b..d42901fe57b1 100644
> --- a/lib/ethdev/rte_ethdev_telemetry.c
> +++ b/lib/ethdev/rte_ethdev_telemetry.c
> @@ -706,6 +706,83 @@ eth_dev_handle_port_dcb(const char *cmd __rte_unused,
> return eth_dev_add_dcb_info(port_id, d);
> }
>
> +static int
> +eth_dev_add_rss_info(struct rte_eth_rss_conf *rss_conf, struct rte_tel_data *d)
> +{
> + const uint32_t key_len = rss_conf->rss_key_len * 2 + 1;
> + char *rss_key;
> + char *key;
> + uint32_t i;
> + int ret;
> +
> + key = malloc(key_len);
> + if (key == NULL)
> + return -ENOMEM;
> +
Key is to hold only char representation of single byte, so it doesn't
need this much space and no need to dynamically allocate/free small
space, hence updating in next-net as following:
```
diff --git a/lib/ethdev/rte_ethdev_telemetry.c
b/lib/ethdev/rte_ethdev_telemetry.c
index c64045cb1dad..f246a03e2966 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -723,19 +723,13 @@ eth_dev_add_rss_info(struct rte_eth_rss_conf
*rss_conf, struct rte_tel_data *d)
{
const uint32_t key_len = rss_conf->rss_key_len * 2 + 1;
char *rss_key;
- char *key;
+ char key[3]; /* FF\0 */
uint32_t i;
int ret;
- key = malloc(key_len);
- if (key == NULL)
- return -ENOMEM;
-
rss_key = malloc(key_len);
- if (rss_key == NULL) {
- ret = -ENOMEM;
- goto free_key;
- }
+ if (rss_key == NULL)
+ return -ENOMEM;
rte_tel_data_start_dict(d);
rte_tel_data_add_dict_uint_hex(d, "rss_hf", rss_conf->rss_hf, 0);
@@ -743,7 +737,7 @@ eth_dev_add_rss_info(struct rte_eth_rss_conf
*rss_conf, struct rte_tel_data *d)
memset(rss_key, 0, key_len);
for (i = 0; i < rss_conf->rss_key_len; i++) {
- ret = snprintf(key, key_len, "%02x",
rss_conf->rss_key[i]);
+ ret = snprintf(key, 3, "%02x", rss_conf->rss_key[i]);
if (ret < 0)
goto free_rss_key;
strlcat(rss_key, key, key_len);
@@ -752,8 +746,7 @@ eth_dev_add_rss_info(struct rte_eth_rss_conf
*rss_conf, struct rte_tel_data *d)
free_rss_key:
free(rss_key);
-free_key:
- free(key);
+
return ret;
}
```
> + rss_key = malloc(key_len);
> + if (rss_key == NULL) {
> + ret = -ENOMEM;
> + goto free_key;
> + }
> +
> + rte_tel_data_start_dict(d);
> + rte_tel_data_add_dict_uint_hex(d, "rss_hf", rss_conf->rss_hf, 0);
> + rte_tel_data_add_dict_uint(d, "rss_key_len", rss_conf->rss_key_len);
> +
> + memset(rss_key, 0, key_len);
> + for (i = 0; i < rss_conf->rss_key_len; i++) {
> + ret = snprintf(key, key_len, "%02x", rss_conf->rss_key[i]);
> + if (ret < 0)
> + goto free_rss_key;
> + strlcat(rss_key, key, key_len);
> + }
> + ret = rte_tel_data_add_dict_string(d, "rss_key", rss_key);
> +
> +free_rss_key:
> + free(rss_key);
> +free_key:
> + free(key);
> + return ret;
> +}
> +
> +static int
> +eth_dev_handle_port_rss_info(const char *cmd __rte_unused,
> + const char *params,
> + struct rte_tel_data *d)
> +{
> + struct rte_eth_dev_info dev_info;
> + struct rte_eth_rss_conf rss_conf;
> + uint16_t port_id;
> + char *end_param;
> + int ret;
> +
> + ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
> + if (ret < 0)
> + return ret;
> +
> + ret = rte_eth_dev_info_get(port_id, &dev_info);
> + if (ret != 0) {
> + RTE_ETHDEV_LOG(ERR,
> + "Failed to get device info, ret = %d\n", ret);
> + return ret;
> + }
> +
> + rss_conf.rss_key_len = dev_info.hash_key_size;
> + rss_conf.rss_key = malloc(dev_info.hash_key_size);
> + if (rss_conf.rss_key == NULL)
> + return -ENOMEM;
> +
This patch cause telemetry unit test failure, because some pmd's provide
'0' as 'dev_info.hash_key_size', hence updating as following which sets
key size as 40 if 'dev_info.hash_key_size' is 0:
```
@@ -764,6 +757,7 @@ eth_dev_handle_port_rss_info(const char *cmd
__rte_unused,
{
struct rte_eth_dev_info dev_info;
struct rte_eth_rss_conf rss_conf;
+ uint8_t key_len;
uint16_t port_id;
char *end_param;
int ret;
@@ -779,8 +773,9 @@ eth_dev_handle_port_rss_info(const char *cmd
__rte_unused,
return ret;
}
- rss_conf.rss_key_len = dev_info.hash_key_size;
- rss_conf.rss_key = malloc(dev_info.hash_key_size);
+ key_len = dev_info.hash_key_size ? dev_info.hash_key_size : 40;
+ rss_conf.rss_key_len = key_len;
+ rss_conf.rss_key = malloc(key_len);
if (rss_conf.rss_key == NULL)
return -ENOMEM;
```
> + ret = rte_eth_dev_rss_hash_conf_get(port_id, &rss_conf);
> + if (ret != 0) {
> + free(rss_conf.rss_key);
> + return ret;
> + }
> +
> + ret = eth_dev_add_rss_info(&rss_conf, d);
> + free(rss_conf.rss_key);
> + return ret;
> +}
> +
> RTE_INIT(ethdev_init_telemetry)
> {
> rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
> @@ -735,4 +812,6 @@ RTE_INIT(ethdev_init_telemetry)
> "Returns Tx queue info for a port. Parameters: int port_id, int queue_id (Optional if only one queue)");
> rte_telemetry_register_cmd("/ethdev/dcb", eth_dev_handle_port_dcb,
> "Returns DCB info for a port. Parameters: int port_id");
> + rte_telemetry_register_cmd("/ethdev/rss_info", eth_dev_handle_port_rss_info,
> + "Returns RSS info for a port. Parameters: int port_id");
> }
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 12/13] ethdev: support telemetry query FEC info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (10 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 11/13] ethdev: support telemetry query RSS info Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 7:42 ` [PATCH v2 13/13] ethdev: support telemetry query VLAN info Jie Hai
2023-06-07 11:40 ` [PATCH v2 00/13] support telemetry query ethdev info Ferruh Yigit
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch supports getting FEC information by telemetry.
The command is like:
--> /ethdev/fec,0
{
"/ethdev/fec": {
"fec_mode": "off",
"fec_capability": {
"10_Gbps": "off auto baser"
}
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 139 ++++++++++++++++++++++++++++++
1 file changed, 139 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index d42901fe57b1..764cf8f203fb 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -11,6 +11,17 @@
#include "ethdev_driver.h"
#include "sff_telemetry.h"
+static const struct {
+ uint32_t capa;
+ const char *name;
+} rte_eth_fec_capa_name[] = {
+ { RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC), "off" },
+ { RTE_ETH_FEC_MODE_CAPA_MASK(AUTO), "auto" },
+ { RTE_ETH_FEC_MODE_CAPA_MASK(BASER), "baser" },
+ { RTE_ETH_FEC_MODE_CAPA_MASK(RS), "rs" },
+ { RTE_ETH_FEC_MODE_CAPA_MASK(LLRS), "llrs" },
+};
+
static int
eth_dev_parse_port_params(const char *params __rte_unused, uint16_t *port_id,
char **end_param, bool has_next)
@@ -783,6 +794,132 @@ eth_dev_handle_port_rss_info(const char *cmd __rte_unused,
return ret;
}
+static const char *
+eth_dev_fec_capa_to_string(uint32_t fec_capa)
+{
+ uint32_t i;
+
+ for (i = 0; i < RTE_DIM(rte_eth_fec_capa_name); i++) {
+ if ((fec_capa & rte_eth_fec_capa_name[i].capa) != 0)
+ return rte_eth_fec_capa_name[i].name;
+ }
+
+ return "unknown";
+}
+
+static void
+eth_dev_fec_capas_to_string(uint32_t fec_capa, char *fec_name, uint32_t len)
+{
+ bool valid = false;
+ size_t count = 0;
+ uint32_t i;
+
+ for (i = 0; i < RTE_DIM(rte_eth_fec_capa_name); i++) {
+ if ((fec_capa & rte_eth_fec_capa_name[i].capa) != 0) {
+ strlcat(fec_name, rte_eth_fec_capa_name[i].name, len);
+ count = strlcat(fec_name, " ", len);
+ valid = true;
+ }
+ }
+
+ if (!valid)
+ count = snprintf(fec_name, len, "unknown ");
+
+ if (count >= len) {
+ RTE_ETHDEV_LOG(WARNING, "FEC capa names may be truncated\n");
+ count = len;
+ }
+
+ fec_name[count - 1] = '\0';
+}
+
+static int
+eth_dev_get_fec_capability(uint16_t port_id, struct rte_tel_data *d)
+{
+ struct rte_eth_fec_capa *speed_fec_capa;
+ char fec_name[RTE_TEL_MAX_STRING_LEN];
+ char speed[RTE_TEL_MAX_STRING_LEN];
+ uint32_t capa_num;
+ uint32_t i, j;
+ int ret;
+
+ ret = rte_eth_fec_get_capability(port_id, NULL, 0);
+ if (ret <= 0)
+ return ret == 0 ? -EINVAL : ret;
+
+ capa_num = ret;
+ speed_fec_capa = calloc(capa_num, sizeof(struct rte_eth_fec_capa));
+ if (speed_fec_capa == NULL)
+ return -ENOMEM;
+
+ ret = rte_eth_fec_get_capability(port_id, speed_fec_capa, capa_num);
+ if (ret <= 0) {
+ ret = ret == 0 ? -EINVAL : ret;
+ goto out;
+ }
+
+ for (i = 0; i < capa_num; i++) {
+ memset(fec_name, 0, RTE_TEL_MAX_STRING_LEN);
+ eth_dev_fec_capas_to_string(speed_fec_capa[i].capa, fec_name,
+ RTE_TEL_MAX_STRING_LEN);
+
+ memset(speed, 0, RTE_TEL_MAX_STRING_LEN);
+ ret = snprintf(speed, RTE_TEL_MAX_STRING_LEN, "%s",
+ rte_eth_link_speed_to_str(speed_fec_capa[i].speed));
+ if (ret < 0)
+ goto out;
+
+ for (j = 0; j < strlen(speed); j++) {
+ if (speed[j] == ' ')
+ speed[j] = '_';
+ }
+
+ rte_tel_data_add_dict_string(d, speed, fec_name);
+ }
+
+out:
+ free(speed_fec_capa);
+ return ret > 0 ? 0 : ret;
+}
+
+static int
+eth_dev_handle_port_fec(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_tel_data *fec_capas;
+ uint32_t fec_mode;
+ uint16_t port_id;
+ char *end_param;
+ int ret;
+
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
+
+ ret = rte_eth_fec_get(port_id, &fec_mode);
+ if (ret != 0)
+ return ret;
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_string(d, "fec_mode",
+ eth_dev_fec_capa_to_string(fec_mode));
+
+ fec_capas = rte_tel_data_alloc();
+ if (fec_capas == NULL)
+ return -ENOMEM;
+
+ rte_tel_data_start_dict(fec_capas);
+ ret = eth_dev_get_fec_capability(port_id, fec_capas);
+ if (ret != 0) {
+ rte_tel_data_free(fec_capas);
+ return ret;
+ }
+
+ rte_tel_data_add_dict_container(d, "fec_capability", fec_capas, 0);
+ return 0;
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -814,4 +951,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns DCB info for a port. Parameters: int port_id");
rte_telemetry_register_cmd("/ethdev/rss_info", eth_dev_handle_port_rss_info,
"Returns RSS info for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/fec", eth_dev_handle_port_fec,
+ "Returns FEC info for a port. Parameters: int port_id");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH v2 13/13] ethdev: support telemetry query VLAN info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (11 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 12/13] ethdev: support telemetry query FEC info Jie Hai
@ 2023-06-07 7:42 ` Jie Hai
2023-06-07 11:40 ` [PATCH v2 00/13] support telemetry query ethdev info Ferruh Yigit
13 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-07 7:42 UTC (permalink / raw)
To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko; +Cc: dev, liudongdong3
This patch supports querying VLAN information by telemetry.
The command is like:
--> /ethdev/vlan,0
{
"/ethdev/vlan": {
"pvid": 0,
"hw_vlan_reject_tagged": 0,
"hw_vlan_reject_untagged": 0,
"hw_vlan_insert_pvid": 0,
"VLAN_STRIP": "off",
"VLAN_EXTEND": "off",
"QINQ_STRIP": "off",
"VLAN_FILTER": "on",
"vlan_num": 3,
"vlan_ids": {
"vlan_0_to_63": [
1,
20
],
"vlan_192_to_255": [
200
]
}
}
}
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
lib/ethdev/rte_ethdev_telemetry.c | 107 ++++++++++++++++++++++++++++++
1 file changed, 107 insertions(+)
diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c
index 764cf8f203fb..d11597596921 100644
--- a/lib/ethdev/rte_ethdev_telemetry.c
+++ b/lib/ethdev/rte_ethdev_telemetry.c
@@ -920,6 +920,111 @@ eth_dev_handle_port_fec(const char *cmd __rte_unused,
return 0;
}
+static int
+eth_dev_add_vlan_id(int port_id, struct rte_tel_data *d)
+{
+ struct rte_tel_data *vlan_blks[64] = {NULL};
+ uint16_t vlan_num, vidx, vbit, num_blks;
+ char blk_name[RTE_TEL_MAX_STRING_LEN];
+ struct rte_vlan_filter_conf *vfc;
+ struct rte_tel_data *vlan_blk;
+ struct rte_tel_data *vd;
+ uint64_t bit_width;
+ uint64_t vlan_id;
+
+ vd = rte_tel_data_alloc();
+ if (vd == NULL)
+ return -ENOMEM;
+
+ vfc = &rte_eth_devices[port_id].data->vlan_filter_conf;
+ bit_width = CHAR_BIT * sizeof(uint64_t);
+ vlan_num = 0;
+ num_blks = 0;
+
+ rte_tel_data_start_dict(vd);
+ for (vidx = 0; vidx < RTE_DIM(vfc->ids); vidx++) {
+ if (vfc->ids[vidx] == 0)
+ continue;
+
+ vlan_blk = rte_tel_data_alloc();
+ if (vlan_blk == NULL)
+ goto free_all;
+
+ vlan_blks[num_blks] = vlan_blk;
+ num_blks++;
+ snprintf(blk_name, RTE_TEL_MAX_STRING_LEN, "vlan_%"PRIu64"_to_%"PRIu64"",
+ bit_width * vidx, bit_width * (vidx + 1) - 1);
+ rte_tel_data_start_array(vlan_blk, RTE_TEL_UINT_VAL);
+ rte_tel_data_add_dict_container(vd, blk_name, vlan_blk, 0);
+
+ for (vbit = 0; vbit < bit_width; vbit++) {
+ if ((vfc->ids[vidx] & RTE_BIT64(vbit)) == 0)
+ continue;
+
+ vlan_id = bit_width * vidx + vbit;
+ rte_tel_data_add_array_uint(vlan_blk, vlan_id);
+ vlan_num++;
+ }
+ }
+
+ rte_tel_data_add_dict_uint(d, "vlan_num", vlan_num);
+ rte_tel_data_add_dict_container(d, "vlan_ids", vd, 0);
+
+ return 0;
+
+free_all:
+ while (num_blks-- > 0)
+ rte_tel_data_free(vlan_blks[num_blks]);
+
+ rte_tel_data_free(vd);
+ return -ENOMEM;
+}
+
+static int
+eth_dev_handle_port_vlan(const char *cmd __rte_unused,
+ const char *params,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_txmode *txmode;
+ struct rte_eth_conf dev_conf;
+ uint16_t port_id;
+ int offload, ret;
+ char *end_param;
+
+ ret = eth_dev_parse_port_params(params, &port_id, &end_param, false);
+ if (ret < 0)
+ return ret;
+
+ ret = rte_eth_dev_conf_get(port_id, &dev_conf);
+ if (ret != 0) {
+ RTE_ETHDEV_LOG(ERR,
+ "Failed to get device configuration, ret = %d\n", ret);
+ return ret;
+ }
+
+ txmode = &dev_conf.txmode;
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_uint(d, "pvid", txmode->pvid);
+ rte_tel_data_add_dict_uint(d, "hw_vlan_reject_tagged",
+ txmode->hw_vlan_reject_tagged);
+ rte_tel_data_add_dict_uint(d, "hw_vlan_reject_untagged",
+ txmode->hw_vlan_reject_untagged);
+ rte_tel_data_add_dict_uint(d, "hw_vlan_insert_pvid",
+ txmode->hw_vlan_insert_pvid);
+
+ offload = rte_eth_dev_get_vlan_offload(port_id);
+ rte_tel_data_add_dict_string(d, "VLAN_STRIP",
+ ((offload & RTE_ETH_VLAN_STRIP_OFFLOAD) != 0) ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "VLAN_EXTEND",
+ ((offload & RTE_ETH_VLAN_EXTEND_OFFLOAD) != 0) ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "QINQ_STRIP",
+ ((offload & RTE_ETH_QINQ_STRIP_OFFLOAD) != 0) ? "on" : "off");
+ rte_tel_data_add_dict_string(d, "VLAN_FILTER",
+ ((offload & RTE_ETH_VLAN_FILTER_OFFLOAD) != 0) ? "on" : "off");
+
+ return eth_dev_add_vlan_id(port_id, d);
+}
+
RTE_INIT(ethdev_init_telemetry)
{
rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list,
@@ -953,4 +1058,6 @@ RTE_INIT(ethdev_init_telemetry)
"Returns RSS info for a port. Parameters: int port_id");
rte_telemetry_register_cmd("/ethdev/fec", eth_dev_handle_port_fec,
"Returns FEC info for a port. Parameters: int port_id");
+ rte_telemetry_register_cmd("/ethdev/vlan", eth_dev_handle_port_vlan,
+ "Returns VLAN info for a port. Parameters: int port_id");
}
--
2.33.0
^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v2 00/13] support telemetry query ethdev info
2023-06-07 7:41 ` [PATCH v2 00/13] " Jie Hai
` (12 preceding siblings ...)
2023-06-07 7:42 ` [PATCH v2 13/13] ethdev: support telemetry query VLAN info Jie Hai
@ 2023-06-07 11:40 ` Ferruh Yigit
2023-06-08 2:01 ` Jie Hai
13 siblings, 1 reply; 36+ messages in thread
From: Ferruh Yigit @ 2023-06-07 11:40 UTC (permalink / raw)
To: Jie Hai; +Cc: dev, liudongdong3
On 6/7/2023 8:41 AM, Jie Hai wrote:
> This patchset supports querying information about ethdev.
> The information includes MAC addresses, RxTx offload, flow ctrl,
> Rx|Tx queue, firmware version, DCB, RSS, FEC, VLAN, etc.
>
> v1->v2:
> 1. Fix incorrect argument of calloc.
> 2. Extract telemetry codes to a file.
> 3. Extract codes parsing port id as a function.
> 4. Use malloc instead of rte_malloc.
> 5. Fix codecheck warnings and build errors reported by CI.
> 6. Use 'int' instead of 'unsigned' in help info.
>
> Dengdui Huang (1):
> ethdev: support telemetry query MAC addresses
>
> Jie Hai (12):
> ethdev: fix incorrect argument of calloc
> ethdev: extract telemetry codes to a file
> ethdev: extract codes parsing port ID as a function
> ethdev: support RxTx offload display
> ethdev: support telemetry query flow ctrl info
> ethdev: support telemetry query Rx queue info
> ethdev: support telemetry query Tx queue info
> ethdev: add firmware version in telemetry info command
> ethdev: support telemetry query DCB info
> ethdev: support telemetry query RSS info
> ethdev: support telemetry query FEC info
> ethdev: support telemetry query VLAN info
>
For series,
Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
There are minor comments, applied them while merging set.
Series applied to dpdk-next-net/main, thanks.
^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v2 00/13] support telemetry query ethdev info
2023-06-07 11:40 ` [PATCH v2 00/13] support telemetry query ethdev info Ferruh Yigit
@ 2023-06-08 2:01 ` Jie Hai
0 siblings, 0 replies; 36+ messages in thread
From: Jie Hai @ 2023-06-08 2:01 UTC (permalink / raw)
To: Ferruh Yigit; +Cc: dev, liudongdong3
On 2023/6/7 19:40, Ferruh Yigit wrote:
> On 6/7/2023 8:41 AM, Jie Hai wrote:
>> This patchset supports querying information about ethdev.
>> The information includes MAC addresses, RxTx offload, flow ctrl,
>> Rx|Tx queue, firmware version, DCB, RSS, FEC, VLAN, etc.
>>
>> v1->v2:
>> 1. Fix incorrect argument of calloc.
>> 2. Extract telemetry codes to a file.
>> 3. Extract codes parsing port id as a function.
>> 4. Use malloc instead of rte_malloc.
>> 5. Fix codecheck warnings and build errors reported by CI.
>> 6. Use 'int' instead of 'unsigned' in help info.
>>
>> Dengdui Huang (1):
>> ethdev: support telemetry query MAC addresses
>>
>> Jie Hai (12):
>> ethdev: fix incorrect argument of calloc
>> ethdev: extract telemetry codes to a file
>> ethdev: extract codes parsing port ID as a function
>> ethdev: support RxTx offload display
>> ethdev: support telemetry query flow ctrl info
>> ethdev: support telemetry query Rx queue info
>> ethdev: support telemetry query Tx queue info
>> ethdev: add firmware version in telemetry info command
>> ethdev: support telemetry query DCB info
>> ethdev: support telemetry query RSS info
>> ethdev: support telemetry query FEC info
>> ethdev: support telemetry query VLAN info
>>
>
> For series,
> Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
>
>
> There are minor comments, applied them while merging set.
>
> Series applied to dpdk-next-net/main, thanks.
> .
Hi Ferruh
Thank you for your valuable comments on the entire patch group.
Thanks,
Jie Hai
^ permalink raw reply [flat|nested] 36+ messages in thread