From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C9CE2A0527; Mon, 9 Nov 2020 12:31:59 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 76BF95A62; Mon, 9 Nov 2020 12:31:57 +0100 (CET) Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by dpdk.org (Postfix) with ESMTP id 623195953 for ; Mon, 9 Nov 2020 12:31:55 +0100 (CET) X-Originating-IP: 90.78.4.16 Received: from inocybe.home (lfbn-poi-1-1343-16.w90-78.abo.wanadoo.fr [90.78.4.16]) (Authenticated sender: grive@u256.net) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id CF8901C0010; Mon, 9 Nov 2020 11:31:53 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Cc: Hemant Agrawal , Sachin Saxena Date: Mon, 9 Nov 2020 12:31:47 +0100 Message-Id: <20201109113147.962882-1-grive@u256.net> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH] bus/dpaa: optimize device name parsing X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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