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 E402DA0527; Mon, 9 Nov 2020 14:38:06 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C352E5AB8; Mon, 9 Nov 2020 14:38:05 +0100 (CET) Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) by dpdk.org (Postfix) with ESMTP id 9E5155AA7 for ; Mon, 9 Nov 2020 14:38:03 +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 relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 07FE440008; Mon, 9 Nov 2020 13:38:01 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Cc: Hemant Agrawal , Sachin Saxena Date: Mon, 9 Nov 2020 14:37:55 +0100 Message-Id: <20201109133755.999895-1-grive@u256.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201109113147.962882-1-grive@u256.net> References: <20201109113147.962882-1-grive@u256.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v2] 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 | 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