All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chengwen Feng <fengchengwen@huawei.com>
To: <thomas@monjalon.net>, <ferruh.yigit@amd.com>
Cc: <dev@dpdk.org>, <stephen@networkplumber.org>
Subject: [PATCH v4 1/5] kvargs: add one new process API
Date: Sun, 5 Nov 2023 05:45:35 +0000	[thread overview]
Message-ID: <20231105054539.22303-2-fengchengwen@huawei.com> (raw)
In-Reply-To: <20231105054539.22303-1-fengchengwen@huawei.com>

The rte_kvargs_process() was used to handle key=value (e.g.
socket_id=0), it also supports to handle only-key (e.g. socket_id).
But many drivers's callback can only handle key=value, it will segment
fault if handles only-key. so the patchset [1] was introduced.

Because the patchset [1] modified too much drivers, therefore:
1) A new API rte_kvargs_process_opt() was introduced, it inherits the
function of rte_kvargs_process() which could handle both key=value and
only-key cases.
2) Constraint the rte_kvargs_process() can only handle key=value cases,
it will return -1 when handle only-key case (that is the matched key's
value is NULL).

This patch also make sure the rte_kvargs_process_opt() and
rte_kvargs_process() API both return -1 when the kvlist parameter is
NULL.

[1] https://patches.dpdk.org/project/dpdk/patch/20230320092110.37295-1-fengchengwen@huawei.com/

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 doc/guides/rel_notes/release_23_11.rst | 13 ++++++++
 lib/kvargs/rte_kvargs.c                | 43 ++++++++++++++++++++------
 lib/kvargs/rte_kvargs.h                | 37 ++++++++++++++++++++--
 lib/kvargs/version.map                 |  3 ++
 4 files changed, 84 insertions(+), 12 deletions(-)

diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 249e5939e1..ea7b758b20 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -137,6 +137,19 @@ New Features
   a group's miss actions, which are the actions to be performed on packets
   that didn't match any of the flow rules in the group.
 
+* **Updated kvargs process API.**
+
+  * Introduced rte_kvargs_process_opt() API, which inherits the function
+    of rte_kvargs_process() and could handle both key=value and only-key
+    cases.
+
+  * Constraint rte_kvargs_process() API can only handle key=value cases,
+    it will return -1 when handle only-key case (that is the matched key's
+    value is NULL).
+
+  * Make sure rte_kvargs_process_opt() and rte_kvargs_process() API both
+    return -1 when the kvlist parameter is NULL.
+
 * **Updated Amazon ena (Elastic Network Adapter) net driver.**
 
   * Upgraded ENA HAL to latest version.
diff --git a/lib/kvargs/rte_kvargs.c b/lib/kvargs/rte_kvargs.c
index c77bb82feb..adc47f8898 100644
--- a/lib/kvargs/rte_kvargs.c
+++ b/lib/kvargs/rte_kvargs.c
@@ -167,31 +167,56 @@ rte_kvargs_count(const struct rte_kvargs *kvlist, const char *key_match)
 	return ret;
 }
 
-/*
- * For each matching key, call the given handler function.
- */
-int
-rte_kvargs_process(const struct rte_kvargs *kvlist,
-		const char *key_match,
-		arg_handler_t handler,
-		void *opaque_arg)
+static int
+kvargs_process_common(const struct rte_kvargs *kvlist,
+		      const char *key_match,
+		      arg_handler_t handler,
+		      void *opaque_arg,
+		      bool support_only_key)
 {
 	const struct rte_kvargs_pair *pair;
 	unsigned i;
 
 	if (kvlist == NULL)
-		return 0;
+		return -1;
 
 	for (i = 0; i < kvlist->count; i++) {
 		pair = &kvlist->pairs[i];
 		if (key_match == NULL || strcmp(pair->key, key_match) == 0) {
+			if (!support_only_key && pair->value == NULL)
+				return -1;
 			if ((*handler)(pair->key, pair->value, opaque_arg) < 0)
 				return -1;
 		}
 	}
+
 	return 0;
 }
 
+/*
+ * For each matching key in key/value, call the given handler function.
+ */
+int
+rte_kvargs_process(const struct rte_kvargs *kvlist,
+		   const char *key_match,
+		   arg_handler_t handler,
+		   void *opaque_arg)
+{
+	return kvargs_process_common(kvlist, key_match, handler, opaque_arg, false);
+}
+
+/*
+ * For each matching key in key/value or only-key, call the given handler function.
+ */
+int
+rte_kvargs_process_opt(const struct rte_kvargs *kvlist,
+		       const char *key_match,
+		       arg_handler_t handler,
+		       void *opaque_arg)
+{
+	return kvargs_process_common(kvlist, key_match, handler, opaque_arg, true);
+}
+
 /* free the rte_kvargs structure */
 void
 rte_kvargs_free(struct rte_kvargs *kvlist)
diff --git a/lib/kvargs/rte_kvargs.h b/lib/kvargs/rte_kvargs.h
index 4900b750bc..ad0b609ad7 100644
--- a/lib/kvargs/rte_kvargs.h
+++ b/lib/kvargs/rte_kvargs.h
@@ -172,14 +172,17 @@ const char *rte_kvargs_get_with_value(const struct rte_kvargs *kvlist,
 				      const char *key, const char *value);
 
 /**
- * Call a handler function for each key/value matching the key
+ * Call a handler function for each key=value matching the key
  *
- * For each key/value association that matches the given key, calls the
+ * For each key=value association that matches the given key, calls the
  * handler function with the for a given arg_name passing the value on the
  * dictionary for that key and a given extra argument.
  *
+ * @note Compared to @see rte_kvargs_process_opt, this API will return -1
+ * when handle only-key case (that is the matched key's value is NULL).
+ *
  * @param kvlist
- *   The rte_kvargs structure. No error if NULL.
+ *   The rte_kvargs structure.
  * @param key_match
  *   The key on which the handler should be called, or NULL to process handler
  *   on all associations
@@ -195,6 +198,34 @@ const char *rte_kvargs_get_with_value(const struct rte_kvargs *kvlist,
 int rte_kvargs_process(const struct rte_kvargs *kvlist,
 	const char *key_match, arg_handler_t handler, void *opaque_arg);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Call a handler function for each key=value or only-key matching the key
+ *
+ * For each key=value or only-key association that matches the given key, calls
+ * the handler function with the for a given arg_name passing the value on the
+ * dictionary for that key and a given extra argument.
+ *
+ * @param kvlist
+ *   The rte_kvargs structure.
+ * @param key_match
+ *   The key on which the handler should be called, or NULL to process handler
+ *   on all associations
+ * @param handler
+ *   The function to call for each matching key
+ * @param opaque_arg
+ *   A pointer passed unchanged to the handler
+ *
+ * @return
+ *   - 0 on success
+ *   - Negative on error
+ */
+__rte_experimental
+int rte_kvargs_process_opt(const struct rte_kvargs *kvlist,
+	const char *key_match, arg_handler_t handler, void *opaque_arg);
+
 /**
  * Count the number of associations matching the given key
  *
diff --git a/lib/kvargs/version.map b/lib/kvargs/version.map
index 387a94e725..15d482e9b3 100644
--- a/lib/kvargs/version.map
+++ b/lib/kvargs/version.map
@@ -16,4 +16,7 @@ EXPERIMENTAL {
 
 	# added in 21.11
 	rte_kvargs_get_with_value;
+
+	# added in 23.11
+	rte_kvargs_process_opt;
 };
-- 
2.17.1


  reply	other threads:[~2023-11-05  5:48 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-14 12:48 [PATCH 0/5] fix segment fault when parse args Chengwen Feng
2023-03-14 12:48 ` [PATCH 1/5] app/pdump: " Chengwen Feng
2023-03-16 17:34   ` Ferruh Yigit
2023-03-14 12:48 ` [PATCH 2/5] net/memif: fix segment fault when parse devargs Chengwen Feng
2023-03-16 18:20   ` Ferruh Yigit
2023-03-14 12:48 ` [PATCH 3/5] net/pcap: " Chengwen Feng
2023-03-16 18:20   ` Ferruh Yigit
2023-03-14 12:48 ` [PATCH 4/5] net/ring: " Chengwen Feng
2023-03-14 12:48 ` [PATCH 5/5] net/sfc: " Chengwen Feng
2023-03-16 18:20   ` Ferruh Yigit
2023-03-16 18:18 ` [PATCH 0/5] fix segment fault when parse args Ferruh Yigit
2023-03-17  2:43   ` fengchengwen
2023-03-21 13:50     ` Ferruh Yigit
2023-03-22  1:15       ` fengchengwen
2023-03-22  8:53         ` Ferruh Yigit
2023-03-22 13:49           ` Thomas Monjalon
2023-03-23 11:58             ` fengchengwen
2023-03-23 12:51               ` Thomas Monjalon
2023-03-20  9:20 ` [PATCH v2 00/44] " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 01/44] app/pdump: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 02/44] ethdev: " Chengwen Feng
2023-04-09  8:10     ` Andrew Rybchenko
2023-03-20  9:20   ` [PATCH v2 03/44] net/memif: fix segment fault when parse devargs Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 04/44] net/pcap: " Chengwen Feng
2023-07-04  3:04     ` Stephen Hemminger
2023-03-20  9:20   ` [PATCH v2 05/44] net/ring: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 06/44] net/sfc: " Chengwen Feng
2023-04-09  8:09     ` Andrew Rybchenko
2023-03-20  9:20   ` [PATCH v2 07/44] net/af_xdp: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 08/44] net/ark: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 09/44] net/cnxk: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 10/44] net/cxgbe: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 11/44] net/dpaa2: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 12/44] net/ena: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 13/44] net/enic: " Chengwen Feng
2023-03-20 21:37     ` John Daley (johndale)
2023-03-20  9:20   ` [PATCH v2 14/44] net/fm10k: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 15/44] net/i40e: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 16/44] net/iavf: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 17/44] net/ice: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 18/44] net/idpf: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 19/44] net/ionic: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 20/44] net/mana: " Chengwen Feng
2023-03-21 22:19     ` Long Li
2023-03-20  9:20   ` [PATCH v2 21/44] net/mlx4: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 22/44] net/mvneta: " Chengwen Feng
2023-03-20  9:33     ` [EXT] " Liron Himi
2023-03-20  9:20   ` [PATCH v2 23/44] net/mvpp2: " Chengwen Feng
2023-03-20  9:33     ` [EXT] " Liron Himi
2023-03-20  9:20   ` [PATCH v2 24/44] net/netvsc: " Chengwen Feng
2023-03-21 22:20     ` Long Li
2023-07-04  3:02     ` Stephen Hemminger
2023-03-20  9:20   ` [PATCH v2 25/44] net/octeontx: " Chengwen Feng
2023-04-12  7:54     ` [EXT] " Harman Kalra
2023-03-20  9:20   ` [PATCH v2 26/44] net/pfe: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 27/44] net/qede: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 28/44] baseband/la12xx: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 29/44] bus/pci: fix segment fault when parse args Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 30/44] common/mlx5: fix segment fault when parse devargs Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 31/44] crypto/cnxk: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 32/44] crypto/dpaa_sec: " Chengwen Feng
2023-03-20  9:20   ` [PATCH v2 33/44] crypto/dpaa2_sec: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 34/44] crypto/mvsam: " Chengwen Feng
2023-03-20  9:33     ` [EXT] " Liron Himi
2023-03-20  9:21   ` [PATCH v2 35/44] crypto/scheduler: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 36/44] dma/dpaa2: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 37/44] event/cnxk: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 38/44] event/dlb2: " Chengwen Feng
2023-03-24 16:26     ` Sevincer, Abdullah
2023-03-20  9:21   ` [PATCH v2 39/44] event/dpaa: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 40/44] event/octeontx: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 41/44] event/opdl: " Chengwen Feng
2023-03-23 13:48     ` Liang Ma
2023-03-20  9:21   ` [PATCH v2 42/44] event/sw: " Chengwen Feng
2023-03-20 11:58     ` Van Haaren, Harry
2023-03-20  9:21   ` [PATCH v2 43/44] mempool/cnxk: " Chengwen Feng
2023-03-20  9:21   ` [PATCH v2 44/44] raw/cnxk_gpio: " Chengwen Feng
2023-04-15  1:38   ` [PATCH v2 00/44] fix segment fault when parse args fengchengwen
2023-04-17 16:37     ` Ferruh Yigit
2023-10-31 20:46       ` Stephen Hemminger
2023-10-31 20:58 ` [RFC] kvargs: don't pass parse handler a NULL pointer Stephen Hemminger
2023-11-01  1:16   ` fengchengwen
2023-11-03  7:38 ` [PATCH v3 0/5] fix segment fault when parse args Chengwen Feng
2023-11-03  7:38   ` [PATCH v3 1/5] kvargs: add one new process API Chengwen Feng
2023-11-03 13:09     ` Ferruh Yigit
2023-11-05  5:55       ` fengchengwen
2023-11-03  7:38   ` [PATCH v3 2/5] net/af_packet: use new API to parse kvargs Chengwen Feng
2023-11-03 13:11     ` Ferruh Yigit
2023-11-05  5:56       ` fengchengwen
2023-11-03  7:38   ` [PATCH v3 3/5] net/sfc: " Chengwen Feng
2023-11-03 13:23     ` Ferruh Yigit
2023-11-03  7:38   ` [PATCH v3 4/5] net/tap: " Chengwen Feng
2023-11-03 13:34     ` Ferruh Yigit
2023-11-05  5:57       ` fengchengwen
2023-11-03  7:38   ` [PATCH v3 5/5] net/mvneta: fix possible out-of-bounds write Chengwen Feng
2023-11-03 13:39     ` Ferruh Yigit
2023-11-03 13:41   ` [PATCH v3 0/5] fix segment fault when parse args Ferruh Yigit
2023-11-05  5:50     ` fengchengwen
2023-11-05  5:45 ` [PATCH v4 " Chengwen Feng
2023-11-05  5:45   ` Chengwen Feng [this message]
2023-11-06  3:18     ` [PATCH v4 1/5] kvargs: add one new process API Stephen Hemminger
2023-11-06  7:13       ` fengchengwen
2023-11-06 16:19         ` Stephen Hemminger
2023-11-07  3:21           ` fengchengwen
2023-11-05  5:45   ` [PATCH v4 2/5] net/sfc: use new API to parse kvargs Chengwen Feng
2023-11-05  5:45   ` [PATCH v4 3/5] net/tap: " Chengwen Feng
2023-11-05  5:45   ` [PATCH v4 4/5] common/nfp: " Chengwen Feng
2023-11-06  3:19     ` Stephen Hemminger
2023-11-06  7:22       ` fengchengwen
2023-11-05  5:45   ` [PATCH v4 5/5] net/mvneta: fix possible out-of-bounds write Chengwen Feng
2023-11-06  7:31 ` [PATCH v5 0/5] fix segment fault when parse args Chengwen Feng
2023-11-06  7:31   ` [PATCH v5 1/5] kvargs: add one new process API Chengwen Feng
2023-11-06  7:31   ` [PATCH v5 2/5] net/sfc: use new API to parse kvargs Chengwen Feng
2023-11-06 10:28     ` Andrew Rybchenko
2023-11-06 12:29       ` fengchengwen
2023-11-07  7:18         ` Andrew Rybchenko
2023-11-06  7:31   ` [PATCH v5 3/5] net/tap: " Chengwen Feng
2023-11-06  7:31   ` [PATCH v5 4/5] common/nfp: " Chengwen Feng
2023-11-06  7:31   ` [PATCH v5 5/5] net/mvneta: fix possible out-of-bounds write Chengwen Feng
2023-11-21  2:11     ` lihuisong (C)

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=20231105054539.22303-2-fengchengwen@huawei.com \
    --to=fengchengwen@huawei.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@amd.com \
    --cc=stephen@networkplumber.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.