From: Gaetan Rivet Date: Mon, 9 Nov 2020 13:37:55 +0000 (+0100) Subject: bus/dpaa: optimize device name parsing X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=a86cb7e259ca5efc5fee4895619d4dbd0fbc6ac2;p=dpdk.git bus/dpaa: optimize device name parsing 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 --- diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 3098e23093..f39d6e2092 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"