Sync some patchs from upstreaming, includind some bugfixes, hns3 pmd flow rule priority feature, hns3 pmd outer VLAN flow match feature, and support dump reigser names and filter. This patch set is modified as follows: - net/hns3: fix cannot fully use hardware flow director table - net/hns3: fix error code for repeatedly create counter - net/hns3: support flow rule priority - common/nfp: use new kvargs process API - net/tap: use new kvargs process API - net/sfc: use new kvargs process API - kvargs: rework process API - net/hns3: fix variable type - net/hns3: fix pointer offset - net/hns3: fix error log - net/hns3: support filtering registers by module names - net/hns3: support reporting names of registers - net/hns3: refactor register dump - net/hns3: remove separators between register module - net/hns3: fix dump counter of registers - net/hns3: remove some basic address dump - telemetry: register command with private argument - ethdev: fix race on ports in telemetry endpoints - ethdev: add telemetry command for registers - ethdev: add report of register names and filter - net/hns3: support outer VLAN flow match - net/hns3: register VLAN flow match mode parameter - net/hns3: support general tunnel flow match - net/hns3: restrict tunnel flow rule to one header - net/hns3: remove ROH devices - net/hns3: dump queue head and tail pointer info - dmadev: fix potential null pointer access - net/hns3: verify reset type from firmware - ethdev: verify queue ID in Tx done cleanup Signed-off-by: Dengdui Huang <huangdengdui@huawei.com> (cherry picked from commit a1c828e1eb9cf716187d2a7656023e95bdce9b55)
209 lines
6.4 KiB
Diff
209 lines
6.4 KiB
Diff
From f04a80934422279e4459869d17d5118ee1dc3efe Mon Sep 17 00:00:00 2001
|
|
From: Robin Jarry <rjarry@redhat.com>
|
|
Date: Mon, 14 Oct 2024 21:32:36 +0200
|
|
Subject: telemetry: register command with private argument
|
|
|
|
[ upstream commit ceb5914cd1e153b01bedd9f14a8119355114a21f ]
|
|
|
|
Add a new rte_telemetry_register_cmd_arg public function to register
|
|
a telemetry endpoint with a callback that takes an additional private
|
|
argument.
|
|
|
|
This will be used in the next commit to protect ethdev endpoints with
|
|
a lock.
|
|
|
|
Update perform_command() to take a struct callback object copied from
|
|
the list of callbacks and invoke the correct function pointer.
|
|
|
|
Signed-off-by: Robin Jarry <rjarry@redhat.com>
|
|
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
|
|
---
|
|
lib/telemetry/rte_telemetry.h | 46 +++++++++++++++++++++++++++++++++++
|
|
lib/telemetry/telemetry.c | 38 +++++++++++++++++++++++------
|
|
lib/telemetry/version.map | 3 +++
|
|
3 files changed, 79 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h
|
|
index cab9daa6fe..b7143e63fe 100644
|
|
--- a/lib/telemetry/rte_telemetry.h
|
|
+++ b/lib/telemetry/rte_telemetry.h
|
|
@@ -336,6 +336,30 @@ rte_tel_data_add_dict_uint_hex(struct rte_tel_data *d, const char *name,
|
|
typedef int (*telemetry_cb)(const char *cmd, const char *params,
|
|
struct rte_tel_data *info);
|
|
|
|
+/**
|
|
+ * This telemetry callback is used when registering a telemetry command with
|
|
+ * rte_telemetry_register_cmd_arg().
|
|
+ *
|
|
+ * It handles getting and formatting information to be returned to telemetry
|
|
+ * when requested.
|
|
+ *
|
|
+ * @param cmd
|
|
+ * The cmd that was requested by the client.
|
|
+ * @param params
|
|
+ * Contains data required by the callback function.
|
|
+ * @param arg
|
|
+ * The opaque value that was passed to rte_telemetry_register_cmd_arg().
|
|
+ * @param info
|
|
+ * The information to be returned to the caller.
|
|
+ *
|
|
+ * @return
|
|
+ * Length of buffer used on success.
|
|
+ * @return
|
|
+ * Negative integer on error.
|
|
+ */
|
|
+typedef int (*telemetry_arg_cb)(const char *cmd, const char *params, void *arg,
|
|
+ struct rte_tel_data *info);
|
|
+
|
|
/**
|
|
* Used for handling data received over a telemetry socket.
|
|
*
|
|
@@ -367,6 +391,28 @@ typedef void * (*handler)(void *sock_id);
|
|
int
|
|
rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
|
|
|
|
+/**
|
|
+ * Used when registering a command and callback function with telemetry.
|
|
+ *
|
|
+ * @param cmd
|
|
+ * The command to register with telemetry.
|
|
+ * @param fn
|
|
+ * Callback function to be called when the command is requested.
|
|
+ * @param arg
|
|
+ * An opaque value that will be passed to the callback function.
|
|
+ * @param help
|
|
+ * Help text for the command.
|
|
+ *
|
|
+ * @return
|
|
+ * 0 on success.
|
|
+ * @return
|
|
+ * -EINVAL for invalid parameters failure.
|
|
+ * @return
|
|
+ * -ENOMEM for mem allocation failure.
|
|
+ */
|
|
+__rte_experimental
|
|
+int
|
|
+rte_telemetry_register_cmd_arg(const char *cmd, telemetry_arg_cb fn, void *arg, const char *help);
|
|
|
|
/**
|
|
* Get a pointer to a container with memory allocated. The container is to be
|
|
diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c
|
|
index 92982842a8..8345991706 100644
|
|
--- a/lib/telemetry/telemetry.c
|
|
+++ b/lib/telemetry/telemetry.c
|
|
@@ -37,6 +37,8 @@ client_handler(void *socket);
|
|
struct cmd_callback {
|
|
char cmd[MAX_CMD_LEN];
|
|
telemetry_cb fn;
|
|
+ telemetry_arg_cb fn_arg;
|
|
+ void *arg;
|
|
char help[RTE_TEL_MAX_STRING_LEN];
|
|
};
|
|
|
|
@@ -67,14 +69,15 @@ static rte_spinlock_t callback_sl = RTE_SPINLOCK_INITIALIZER;
|
|
static RTE_ATOMIC(uint16_t) v2_clients;
|
|
#endif /* !RTE_EXEC_ENV_WINDOWS */
|
|
|
|
-int
|
|
-rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help)
|
|
+static int
|
|
+register_cmd(const char *cmd, const char *help,
|
|
+ telemetry_cb fn, telemetry_arg_cb fn_arg, void *arg)
|
|
{
|
|
struct cmd_callback *new_callbacks;
|
|
const char *cmdp = cmd;
|
|
int i = 0;
|
|
|
|
- if (strlen(cmd) >= MAX_CMD_LEN || fn == NULL || cmd[0] != '/'
|
|
+ if (strlen(cmd) >= MAX_CMD_LEN || (fn == NULL && fn_arg == NULL) || cmd[0] != '/'
|
|
|| strlen(help) >= RTE_TEL_MAX_STRING_LEN)
|
|
return -EINVAL;
|
|
|
|
@@ -101,6 +104,8 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help)
|
|
|
|
strlcpy(callbacks[i].cmd, cmd, MAX_CMD_LEN);
|
|
callbacks[i].fn = fn;
|
|
+ callbacks[i].fn_arg = fn_arg;
|
|
+ callbacks[i].arg = arg;
|
|
strlcpy(callbacks[i].help, help, RTE_TEL_MAX_STRING_LEN);
|
|
num_callbacks++;
|
|
rte_spinlock_unlock(&callback_sl);
|
|
@@ -108,6 +113,18 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help)
|
|
return 0;
|
|
}
|
|
|
|
+int
|
|
+rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help)
|
|
+{
|
|
+ return register_cmd(cmd, help, fn, NULL, NULL);
|
|
+}
|
|
+
|
|
+int
|
|
+rte_telemetry_register_cmd_arg(const char *cmd, telemetry_arg_cb fn, void *arg, const char *help)
|
|
+{
|
|
+ return register_cmd(cmd, help, NULL, fn, arg);
|
|
+}
|
|
+
|
|
#ifndef RTE_EXEC_ENV_WINDOWS
|
|
|
|
static int
|
|
@@ -344,11 +361,16 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s)
|
|
}
|
|
|
|
static void
|
|
-perform_command(telemetry_cb fn, const char *cmd, const char *param, int s)
|
|
+perform_command(const struct cmd_callback *cb, const char *cmd, const char *param, int s)
|
|
{
|
|
struct rte_tel_data data = {0};
|
|
+ int ret;
|
|
+
|
|
+ if (cb->fn_arg != NULL)
|
|
+ ret = cb->fn_arg(cmd, param, cb->arg, &data);
|
|
+ else
|
|
+ ret = cb->fn(cmd, param, &data);
|
|
|
|
- int ret = fn(cmd, param, &data);
|
|
if (ret < 0) {
|
|
char out_buf[MAX_CMD_LEN + 10];
|
|
int used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":null}",
|
|
@@ -387,19 +409,19 @@ client_handler(void *sock_id)
|
|
buffer[bytes] = 0;
|
|
const char *cmd = strtok(buffer, ",");
|
|
const char *param = strtok(NULL, "\0");
|
|
- telemetry_cb fn = unknown_command;
|
|
+ struct cmd_callback cb = {.fn = unknown_command};
|
|
int i;
|
|
|
|
if (cmd && strlen(cmd) < MAX_CMD_LEN) {
|
|
rte_spinlock_lock(&callback_sl);
|
|
for (i = 0; i < num_callbacks; i++)
|
|
if (strcmp(cmd, callbacks[i].cmd) == 0) {
|
|
- fn = callbacks[i].fn;
|
|
+ cb = callbacks[i];
|
|
break;
|
|
}
|
|
rte_spinlock_unlock(&callback_sl);
|
|
}
|
|
- perform_command(fn, cmd, param, s);
|
|
+ perform_command(&cb, cmd, param, s);
|
|
|
|
bytes = read(s, buffer, sizeof(buffer) - 1);
|
|
}
|
|
diff --git a/lib/telemetry/version.map b/lib/telemetry/version.map
|
|
index 7d12c92905..74acbf3f0d 100644
|
|
--- a/lib/telemetry/version.map
|
|
+++ b/lib/telemetry/version.map
|
|
@@ -28,6 +28,9 @@ EXPERIMENTAL {
|
|
rte_tel_data_add_array_uint_hex;
|
|
rte_tel_data_add_dict_uint_hex;
|
|
|
|
+ # added in 24.11
|
|
+ rte_telemetry_register_cmd_arg;
|
|
+
|
|
local: *;
|
|
};
|
|
|
|
--
|
|
2.20.1.windows.1
|
|
|