DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing
@ 2020-11-09 11:31 Gaetan Rivet
  2020-11-09 11:44 ` Gaëtan Rivet
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Gaetan Rivet @ 2020-11-09 11:31 UTC (permalink / raw)
  To: dev; +Cc: Hemant Agrawal, Sachin Saxena

Device name parsing is done on all buses during device iterations at
either EAL or ethdev levels.

When a bus implements device name parsing slowly, all iterations are
impacted. Efficient implementation is important.

The DPAA bus device name parsing has two issues: it allocates dynamic
memory and uses snprintf without a real need for it. Both can be
avoided, which improves the parsing performance.

The function is also simpler and shorter.

Signed-off-by: Gaetan Rivet <grive@u256.net>
---
 drivers/bus/dpaa/dpaa_bus.c | 69 +++++++++++++++----------------------
 1 file changed, 27 insertions(+), 42 deletions(-)

diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index ece6a4c424..014b4ab2ce 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -385,12 +385,10 @@ dpaa_portal_finish(void *arg)
 }
 
 static int
-rte_dpaa_bus_parse(const char *name, void *out_name)
+rte_dpaa_bus_parse(const char *name, void *out)
 {
-	int i, j;
-	int max_fman = 2, max_macs = 16;
-	char *dup_name;
-	char *sep = NULL;
+	unsigned int i, j;
+	size_t delta;
 
 	/* There are two ways of passing device name, with and without
 	 * separator. "dpaa_bus:fm1-mac3" with separator, and "fm1-mac3"
@@ -399,46 +397,33 @@ rte_dpaa_bus_parse(const char *name, void *out_name)
 	 */
 	DPAA_BUS_DEBUG("Parse device name (%s)", name);
 
-	/* Check for dpaa_bus:fm1-mac3 style */
-	dup_name = strdup(name);
-	sep = strchr(dup_name, ':');
-	if (!sep)
-		/* If not, check for name=fm1-mac3 style */
-		sep = strchr(dup_name, '=');
-
-	if (sep)
-		/* jump over the seprator */
-		sep = (char *) (sep + 1);
-	else
-		sep = dup_name;
-
-	for (i = 0; i < max_fman; i++) {
-		for (j = 0; j < max_macs; j++) {
-			char fm_name[16];
-			snprintf(fm_name, 16, "fm%d-mac%d", i, j);
-			if (strcmp(fm_name, sep) == 0) {
-				if (out_name)
-					strcpy(out_name, sep);
-				free(dup_name);
-				return 0;
-			}
-		}
-	}
-
-	for (i = 0; i < RTE_LIBRTE_DPAA_MAX_CRYPTODEV; i++) {
-		char sec_name[16];
-
-		snprintf(sec_name, 16, "dpaa_sec-%d", i+1);
-		if (strcmp(sec_name, sep) == 0) {
-			if (out_name)
-				strcpy(out_name, sep);
-			free(dup_name);
-			return 0;
+	delta = 0;
+	if (strncmp(name, "dpaa_bus:", 9) == 0) {
+		delta = 9;
+	} else if (strncmp(name, "name=", 5) == 0) {
+		delta = 5;
+	}
+
+	if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) == 2) {
+		if (i >= 2 || j >= 16)
+			return -EINVAL;
+		if (out != NULL) {
+			char *out_name = out;
+
+			if (rte_strscpy(out_name, &name[delta], 10) < 0)
+				return -ENAMETOOLONG;
+			/* Because 'i' can only be 0 or 1, fm%u is fixed size ;
+			 * mac%u needs to be checked for optional end ','.
+			 */
+			if (out_name[9] == ',')
+				out_name[9] = '\0';
 		}
+		return 0;
+	} else {
+		return -EINVAL;
 	}
 
-	free(dup_name);
-	return -EINVAL;
+	return -ENODEV;
 }
 
 #define DPAA_DEV_PATH1 "/sys/devices/platform/soc/soc:fsl,dpaa"
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing
  2020-11-09 11:31 [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing Gaetan Rivet
@ 2020-11-09 11:44 ` Gaëtan Rivet
  2020-11-09 11:58 ` David Marchand
  2020-11-09 13:37 ` [dpdk-dev] [PATCH v2] " Gaetan Rivet
  2 siblings, 0 replies; 6+ messages in thread
From: Gaëtan Rivet @ 2020-11-09 11:44 UTC (permalink / raw)
  To: Hemant Agrawal, Sachin Saxena; +Cc: dev

On 09/11/20 12:31 +0100, Gaetan Rivet wrote:
> Device name parsing is done on all buses during device iterations at
> either EAL or ethdev levels.
> 
> When a bus implements device name parsing slowly, all iterations are
> impacted. Efficient implementation is important.
> 
> The DPAA bus device name parsing has two issues: it allocates dynamic
> memory and uses snprintf without a real need for it. Both can be
> avoided, which improves the parsing performance.
> 
> The function is also simpler and shorter.
> 
> Signed-off-by: Gaetan Rivet <grive@u256.net>
> ---

Sorry I meant to annotate this patch before sending.

Please note that I could not test with a real DPAA bus. There are some
string offsets that should be correct but the parsing still needs to
be tested.

Cheers,
-- 
Gaëtan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing
  2020-11-09 11:31 [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing Gaetan Rivet
  2020-11-09 11:44 ` Gaëtan Rivet
@ 2020-11-09 11:58 ` David Marchand
  2020-11-09 13:36   ` Gaëtan Rivet
  2020-11-09 13:37 ` [dpdk-dev] [PATCH v2] " Gaetan Rivet
  2 siblings, 1 reply; 6+ messages in thread
From: David Marchand @ 2020-11-09 11:58 UTC (permalink / raw)
  To: Gaetan Rivet; +Cc: dev, Hemant Agrawal, Sachin Saxena

On Mon, Nov 9, 2020 at 12:32 PM Gaetan Rivet <grive@u256.net> wrote:
> +       delta = 0;
> +       if (strncmp(name, "dpaa_bus:", 9) == 0) {
> +               delta = 9;
> +       } else if (strncmp(name, "name=", 5) == 0) {
> +               delta = 5;
> +       }
> +
> +       if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) == 2) {
> +               if (i >= 2 || j >= 16)
> +                       return -EINVAL;
> +               if (out != NULL) {
> +                       char *out_name = out;
> +
> +                       if (rte_strscpy(out_name, &name[delta], 10) < 0)
> +                               return -ENAMETOOLONG;
> +                       /* Because 'i' can only be 0 or 1, fm%u is fixed size ;
> +                        * mac%u needs to be checked for optional end ','.
> +                        */
> +                       if (out_name[9] == ',')
> +                               out_name[9] = '\0';
>                 }
> +               return 0;
> +       } else {
> +               return -EINVAL;
>         }

Mmm, we always return from each of the previous branches?
Then the ENODEV return after is dead code.

Reading again the diff, you could probably return at the sscanf step.
if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) != 2 || i >= 2 || j >= 16)
        return -EINVAL;


>
> -       free(dup_name);
> -       return -EINVAL;
> +       return -ENODEV;
>  }
>
>  #define DPAA_DEV_PATH1 "/sys/devices/platform/soc/soc:fsl,dpaa"


-- 
David Marchand


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing
  2020-11-09 11:58 ` David Marchand
@ 2020-11-09 13:36   ` Gaëtan Rivet
  0 siblings, 0 replies; 6+ messages in thread
From: Gaëtan Rivet @ 2020-11-09 13:36 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Hemant Agrawal, Sachin Saxena

On 09/11/20 12:58 +0100, David Marchand wrote:
> On Mon, Nov 9, 2020 at 12:32 PM Gaetan Rivet <grive@u256.net> wrote:
> > +       delta = 0;
> > +       if (strncmp(name, "dpaa_bus:", 9) == 0) {
> > +               delta = 9;
> > +       } else if (strncmp(name, "name=", 5) == 0) {
> > +               delta = 5;
> > +       }
> > +
> > +       if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) == 2) {
> > +               if (i >= 2 || j >= 16)
> > +                       return -EINVAL;
> > +               if (out != NULL) {
> > +                       char *out_name = out;
> > +
> > +                       if (rte_strscpy(out_name, &name[delta], 10) < 0)
> > +                               return -ENAMETOOLONG;
> > +                       /* Because 'i' can only be 0 or 1, fm%u is fixed size ;
> > +                        * mac%u needs to be checked for optional end ','.
> > +                        */
> > +                       if (out_name[9] == ',')
> > +                               out_name[9] = '\0';
> >                 }
> > +               return 0;
> > +       } else {
> > +               return -EINVAL;
> >         }
> 
> Mmm, we always return from each of the previous branches?
> Then the ENODEV return after is dead code.
> 
> Reading again the diff, you could probably return at the sscanf step.
> if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) != 2 || i >= 2 || j >= 16)
>         return -EINVAL;
> 
> 

Yes good point, I will refactor.

> >
> > -       free(dup_name);
> > -       return -EINVAL;
> > +       return -ENODEV;
> >  }
> >
> >  #define DPAA_DEV_PATH1 "/sys/devices/platform/soc/soc:fsl,dpaa"
> 
> 
> -- 
> David Marchand
> 

-- 
Gaëtan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dpdk-dev] [PATCH v2] bus/dpaa: optimize device name parsing
  2020-11-09 11:31 [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing Gaetan Rivet
  2020-11-09 11:44 ` Gaëtan Rivet
  2020-11-09 11:58 ` David Marchand
@ 2020-11-09 13:37 ` Gaetan Rivet
  2021-01-15 11:16   ` Thomas Monjalon
  2 siblings, 1 reply; 6+ messages in thread
From: Gaetan Rivet @ 2020-11-09 13:37 UTC (permalink / raw)
  To: dev; +Cc: Hemant Agrawal, Sachin Saxena

Device name parsing is done on all buses during device iterations at
either EAL or ethdev levels.

When a bus implements device name parsing slowly, all iterations are
impacted. Efficient implementation is important.

The DPAA bus device name parsing has two issues: it allocates dynamic
memory and uses snprintf without a real need for it. Both can be
avoided, which improves the parsing performance.

The function is also simpler and shorter.

Signed-off-by: Gaetan Rivet <grive@u256.net>
---
 drivers/bus/dpaa/dpaa_bus.c | 68 +++++++++++++++----------------------
 1 file changed, 28 insertions(+), 40 deletions(-)

diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index ece6a4c424..a006872fae 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -385,12 +385,10 @@ dpaa_portal_finish(void *arg)
 }
 
 static int
-rte_dpaa_bus_parse(const char *name, void *out_name)
+rte_dpaa_bus_parse(const char *name, void *out)
 {
-	int i, j;
-	int max_fman = 2, max_macs = 16;
-	char *dup_name;
-	char *sep = NULL;
+	unsigned int i, j;
+	size_t delta;
 
 	/* There are two ways of passing device name, with and without
 	 * separator. "dpaa_bus:fm1-mac3" with separator, and "fm1-mac3"
@@ -399,46 +397,36 @@ rte_dpaa_bus_parse(const char *name, void *out_name)
 	 */
 	DPAA_BUS_DEBUG("Parse device name (%s)", name);
 
-	/* Check for dpaa_bus:fm1-mac3 style */
-	dup_name = strdup(name);
-	sep = strchr(dup_name, ':');
-	if (!sep)
-		/* If not, check for name=fm1-mac3 style */
-		sep = strchr(dup_name, '=');
+	delta = 0;
+	if (strncmp(name, "dpaa_bus:", 9) == 0) {
+		delta = 9;
+	} else if (strncmp(name, "name=", 5) == 0) {
+		delta = 5;
+	}
 
-	if (sep)
-		/* jump over the seprator */
-		sep = (char *) (sep + 1);
-	else
-		sep = dup_name;
-
-	for (i = 0; i < max_fman; i++) {
-		for (j = 0; j < max_macs; j++) {
-			char fm_name[16];
-			snprintf(fm_name, 16, "fm%d-mac%d", i, j);
-			if (strcmp(fm_name, sep) == 0) {
-				if (out_name)
-					strcpy(out_name, sep);
-				free(dup_name);
-				return 0;
-			}
-		}
+	if (sscanf(&name[delta], "fm%u-mac%u", &i, &j) != 2 ||
+	    i >= 2 || j >= 16) {
+		return -EINVAL;
 	}
 
-	for (i = 0; i < RTE_LIBRTE_DPAA_MAX_CRYPTODEV; i++) {
-		char sec_name[16];
-
-		snprintf(sec_name, 16, "dpaa_sec-%d", i+1);
-		if (strcmp(sec_name, sep) == 0) {
-			if (out_name)
-				strcpy(out_name, sep);
-			free(dup_name);
-			return 0;
-		}
+	if (out != NULL) {
+		char *out_name = out;
+		const size_t max_name_len = sizeof("fm.-mac..") - 1;
+
+		/* Do not check for truncation, either name ends with
+		 * '\0' or the device name is followed by parameters and there
+		 * will be a ',' instead. Not copying past this comma is not an
+		 * error.
+		 */
+		strlcpy(out_name, &name[delta], max_name_len + 1);
+
+		/* Second digit of mac%u could instead be ','. */
+		if ((strlen(out_name) == max_name_len) &&
+		    out_name[max_name_len] == ',')
+			out_name[max_name_len] = '\0';
 	}
 
-	free(dup_name);
-	return -EINVAL;
+	return 0;
 }
 
 #define DPAA_DEV_PATH1 "/sys/devices/platform/soc/soc:fsl,dpaa"
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [dpdk-dev] [PATCH v2] bus/dpaa: optimize device name parsing
  2020-11-09 13:37 ` [dpdk-dev] [PATCH v2] " Gaetan Rivet
@ 2021-01-15 11:16   ` Thomas Monjalon
  0 siblings, 0 replies; 6+ messages in thread
From: Thomas Monjalon @ 2021-01-15 11:16 UTC (permalink / raw)
  To: Gaetan Rivet; +Cc: dev, Hemant Agrawal, Sachin Saxena, david.marchand

09/11/2020 14:37, Gaetan Rivet:
> Device name parsing is done on all buses during device iterations at
> either EAL or ethdev levels.
> 
> When a bus implements device name parsing slowly, all iterations are
> impacted. Efficient implementation is important.
> 
> The DPAA bus device name parsing has two issues: it allocates dynamic
> memory and uses snprintf without a real need for it. Both can be
> avoided, which improves the parsing performance.
> 
> The function is also simpler and shorter.
> 
> Signed-off-by: Gaetan Rivet <grive@u256.net>

Applied, thanks




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-15 11:17 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-09 11:31 [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing Gaetan Rivet
2020-11-09 11:44 ` Gaëtan Rivet
2020-11-09 11:58 ` David Marchand
2020-11-09 13:36   ` Gaëtan Rivet
2020-11-09 13:37 ` [dpdk-dev] [PATCH v2] " Gaetan Rivet
2021-01-15 11:16   ` Thomas Monjalon

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git