DPDK patches and discussions
 help / color / mirror / Atom feed
From: Gregory Etelson <getelson@nvidia.com>
To: <dev@dpdk.org>, <getelson@nvidia.com>
Cc: <matan@nvidia.com>, <rasland@nvidia.com>,
	Xiaoyun Li <xiaoyun.li@intel.com>,
	Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Subject: [dpdk-dev] [PATCH] app/testpmd: fix flex item flush
Date: Tue, 26 Oct 2021 18:20:00 +0300	[thread overview]
Message-ID: <20211026152000.11665-1-getelson@nvidia.com> (raw)

Testpmd provides 2 sets of flex item create and destroy functions
One for hosts with JSON library. These functions parse
flex item configuration stored in JSON file and create or destroy
flex item object. The second functions set is for hosts without JSON
library for compilation compatibility.

On hosts without JSON library, current implementation issues
"no JSON library" notification on port close.
The notification was triggered by port destructors that include
flex items flush routine.

The patch introduces single implementation for testpmd
flex item destroy.

Fixes: 59f3a8acbcdb ("app/testpmd: add flex item commands")
Signed-off-by: Gregory Etelson <getelson@nvidia.com>
---
 app/test-pmd/cmd_flex_item.c | 72 ++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 37 deletions(-)

diff --git a/app/test-pmd/cmd_flex_item.c b/app/test-pmd/cmd_flex_item.c
index 45103e45a8..908bcb3f47 100644
--- a/app/test-pmd/cmd_flex_item.c
+++ b/app/test-pmd/cmd_flex_item.c
@@ -20,13 +20,6 @@
 struct flex_item *flex_items[RTE_MAX_ETHPORTS][FLEX_MAX_PARSERS_NUM];
 struct flex_pattern flex_patterns[FLEX_MAX_PATTERNS_NUM];
 
-#ifdef RTE_HAS_JANSSON
-static __rte_always_inline bool
-match_strkey(const char *key, const char *pattern)
-{
-	return strncmp(key, pattern, strlen(key)) == 0;
-}
-
 static struct flex_item *
 flex_parser_fetch(uint16_t port_id, uint16_t flex_id)
 {
@@ -41,30 +34,11 @@ flex_parser_fetch(uint16_t port_id, uint16_t flex_id)
 	return flex_items[port_id][flex_id];
 }
 
-void
-flex_item_destroy(portid_t port_id, uint16_t flex_id)
+#ifdef RTE_HAS_JANSSON
+static __rte_always_inline bool
+match_strkey(const char *key, const char *pattern)
 {
-	int ret;
-	struct rte_flow_error error;
-	struct flex_item *fp = flex_parser_fetch(port_id, flex_id);
-	if (fp == FLEX_PARSER_ERR) {
-		printf("Bad parameters: port_id=%u flex_id=%u\n",
-		       port_id, flex_id);
-		return;
-	}
-	if (!fp)
-		return;
-	ret = rte_flow_flex_item_release(port_id, fp->flex_handle, &error);
-	if (!ret) {
-		free(fp);
-		flex_items[port_id][flex_id] = NULL;
-		printf("port-%u: released flex item #%u\n",
-		       port_id, flex_id);
-
-	} else {
-		printf("port-%u: cannot release flex item #%u: %s\n",
-		       port_id, flex_id, error.message);
-	}
+	return strncmp(key, pattern, strlen(key)) == 0;
 }
 
 static int
@@ -399,15 +373,37 @@ void flex_item_create(__rte_unused portid_t port_id,
 		      __rte_unused uint16_t flex_id,
 		      __rte_unused const char *filename)
 {
-	printf("no JSON library\n");
+	printf("cannot create flex item - no JSON library configured\n");
 }
+#endif /* RTE_HAS_JANSSON */
 
-void flex_item_destroy(__rte_unused portid_t port_id,
-		       __rte_unused uint16_t flex_id)
+void
+flex_item_destroy(portid_t port_id, uint16_t flex_id)
 {
-	printf("no JSON library\n");
+	int ret;
+	struct rte_flow_error error;
+	struct flex_item *fp = flex_parser_fetch(port_id, flex_id);
+	if (!flex_id)
+		return;
+	if (fp == FLEX_PARSER_ERR) {
+		printf("Bad parameters: port_id=%u flex_id=%u\n",
+		       port_id, flex_id);
+		return;
+	}
+	if (!fp)
+		return;
+	ret = rte_flow_flex_item_release(port_id, fp->flex_handle, &error);
+	if (!ret) {
+		free(fp);
+		flex_items[port_id][flex_id] = NULL;
+		printf("port-%u: released flex item #%u\n",
+		       port_id, flex_id);
+
+	} else {
+		printf("port-%u: cannot release flex item #%u: %s\n",
+		       port_id, flex_id, error.message);
+	}
 }
-#endif /* RTE_HAS_JANSSON */
 
 void
 port_flex_item_flush(portid_t port_id)
@@ -415,8 +411,10 @@ port_flex_item_flush(portid_t port_id)
 	uint16_t i;
 
 	for (i = 0; i < FLEX_MAX_PARSERS_NUM; i++) {
-		flex_item_destroy(port_id, i);
-		flex_items[port_id][i] = NULL;
+		if (flex_items[port_id][i] != NULL) {
+			flex_item_destroy(port_id, i);
+			flex_items[port_id][i] = NULL;
+		}
 	}
 }
 
-- 
2.33.1


             reply	other threads:[~2021-10-26 15:20 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-26 15:20 Gregory Etelson [this message]
2021-11-03 19:12 ` Ferruh Yigit
2021-11-05 15:56 ` Ferruh Yigit
2021-11-05 17:03   ` Slava Ovsiienko
2021-11-05 18:56     ` Ferruh Yigit
2021-11-05 21:21     ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211026152000.11665-1-getelson@nvidia.com \
    --to=getelson@nvidia.com \
    --cc=dev@dpdk.org \
    --cc=matan@nvidia.com \
    --cc=rasland@nvidia.com \
    --cc=viacheslavo@nvidia.com \
    --cc=xiaoyun.li@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).