From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f176.google.com (mail-wr0-f176.google.com [209.85.128.176]) by dpdk.org (Postfix) with ESMTP id 281E44BE1 for ; Wed, 21 Jun 2017 01:36:23 +0200 (CEST) Received: by mail-wr0-f176.google.com with SMTP id r103so111607469wrb.0 for ; Tue, 20 Jun 2017 16:36:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=hmGjQZqDhKBkKqK51ARossS8EODzVxxbrB/clH7ZaHg=; b=jaq4Qe4S98H+PbKQFn3zX+I8Q0sl9/96zTsExFOdXJ3q2ZJoi2L3xOnY5qh9+d4MZE 1QQ99W0EHIUt9IU4mIh7Zsgnw/AvzNElBks0rteOYQoD4jfLaQ6mSDq1uXnlY/GAL5xy eguPPnN/bZ57eKh+JW6dtZo6QIDHHwj9NSMOQyDebIc1U3Dsf2JyCH8/v2zXVc6ZDRGB N3tHC1z9vLelf4eZK63nVd9XfWjR3gCWRuPyy0u/Xv+i4UT8mndaaOzx+DNUq59//03n b93u6p4QlwGkZjQGoEfgtcnewaGpxu0N6DkA+UFWy7siF2ovNxhnO4JC2DN/RNtXJyLw no8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=hmGjQZqDhKBkKqK51ARossS8EODzVxxbrB/clH7ZaHg=; b=YPi9L2cOB563rIT6PsVuwt7pLMWBCHgrg/ETrkQJH7zn61rZJODebf6lLxQrTVJGeB lt+VBtAlG3shv0X3CFX5S5OP4pEwR25Er1ghCqXEy9KVOgWyIR7cRmukqEQbWhJecvdT WUKA8uLbbrJgM2Z62TyF5ht9zKFsp3Tc/uGBswstAWPg9NxHo/V2YUGDOKMHhFtN91bm yNVCyWIY6Jq1SAsvv0/3i5rOi9T+4UNSxyDpQq+x+ABSywVXs2sDlCHlnaRHghyHlJdG KEB64/qHzZrZ7XhuN65Y8YaBzKnM03KHLMmVvUuv+QbtTF5XQEPNQAbadyQ1XOvT0zTP ttRw== X-Gm-Message-State: AKS2vOxy40IU2+6gugFA2BdHfhcar2RVdOHU04nUQHSfrUWnFKeX+XCX nOpj/leSRkwXVeliUXM= X-Received: by 10.28.138.194 with SMTP id m185mr4430569wmd.86.1498001783366; Tue, 20 Jun 2017 16:36:23 -0700 (PDT) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id f45sm6463684wrf.2.2017.06.20.16.36.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 20 Jun 2017 16:36:22 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 21 Jun 2017 01:35:50 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v5 16/19] devargs: introduce cleaner parsing helper 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: , X-List-Received-Date: Tue, 20 Jun 2017 23:36:25 -0000 Introduce a more versatile helper to parse device strings. This helper expects a generic rte_devargs structure as storage in order not to require any API changes in the future, should this structure be updated. The old equivalent function is thus being deprecated, as its API does not allow to accompany current rte_devargs evolutions. A deprecation notice is issued. This new helper will parse bus information as well as device name and device parameters. It does not allocate an rte_devargs structure and expects one to be given as input. Signed-off-by: Gaetan Rivet --- doc/guides/rel_notes/deprecation.rst | 5 ++ lib/librte_eal/common/eal_common_devargs.c | 91 ++++++++++++++++++++--------- lib/librte_eal/common/include/rte_devargs.h | 20 +++++++ 3 files changed, 90 insertions(+), 26 deletions(-) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 1786a59..fb95ced 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -105,3 +105,8 @@ Deprecation Notices The non-"do-sig" versions of the hash tables will be removed (including the ``signature_offset`` parameter) and the "do-sig" versions renamed accordingly. + +* eal: the following function is deprecated starting from 17.08 and will + be removed in 17.11: + + - ``rte_eal_parse_devargs_str``, replaced by ``rte_eal_devargs_parse`` diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index 321a62d..f2e11f9 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -77,6 +77,66 @@ rte_eal_parse_devargs_str(const char *devargs_str, return 0; } +int +rte_eal_devargs_parse(const char *dev, + struct rte_devargs *da) +{ + struct rte_bus *bus; + const char *c; + const size_t maxlen = sizeof(da->name); + size_t i; + + if ((dev) == NULL || (da) == NULL) + return -EINVAL; + c = dev; + /* Retrieve eventual bus info */ + bus = rte_bus_from_name(dev); + if (bus) { + i = strlen(bus->name); + if (dev[i] == '\0') { + fprintf(stderr, "WARNING: device name matches a bus name.\n"); + bus = NULL; + } else if (rte_bus_from_dev(dev)) { + /* false positive on bus name. */ + bus = NULL; + } else { + c = &dev[i+1]; + } + } + /* Store device name */ + i = 0; + while (c[i] != '\0' && c[i] != ',') { + da->name[i] = c[i]; + i++; + if (i == maxlen) { + fprintf(stderr, "WARNING: Parsing \"%s\": device name should be shorter than %zu\n", + dev, maxlen); + da->name[i-1] = '\0'; + return -EINVAL; + } + } + da->name[i] = '\0'; + if (!bus) { + bus = rte_bus_from_dev(da->name); + if (!bus) { + fprintf(stderr, "ERROR: failed to parse bus info from device \"%s\"\n", + da->name); + return -EFAULT; + } + } + da->bus = bus; + /* Parse eventual device arguments */ + if (c[i] == ',') + da->args = strdup(&c[i+1]); + else + da->args = strdup(""); + if (da->args == NULL) { + fprintf(stderr, "ERROR: not enough memory to parse arguments\n"); + return -ENOMEM; + } + return 0; +} + /* store a whitelist parameter for later parsing */ int rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str) @@ -84,35 +144,16 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str) struct rte_devargs *devargs = NULL; const char *dev = devargs_str; struct rte_bus *bus; - char *buf = NULL; - int ret; - /* use malloc instead of rte_malloc as it's called early at init */ - devargs = malloc(sizeof(*devargs)); + /* use calloc instead of rte_zmalloc as it's called early at init */ + devargs = calloc(1, sizeof(*devargs)); if (devargs == NULL) goto fail; - memset(devargs, 0, sizeof(*devargs)); - devargs->type = devtype; - - bus = rte_bus_from_name(dev); - if (bus) { - dev += strlen(bus->name) + 1; - } else { - bus = rte_bus_from_dev(dev); - if (!bus) { - fprintf(stderr, "ERROR: failed to parse bus info from device declaration\n"); - goto fail; - } - } - devargs->bus = bus; - if (rte_eal_parse_devargs_str(dev, &buf, &devargs->args)) - goto fail; - - /* save device name. */ - ret = snprintf(devargs->name, sizeof(devargs->name), "%s", buf); - if (ret < 0 || ret >= (int)sizeof(devargs->name)) + if (rte_eal_devargs_parse(dev, devargs)) goto fail; + devargs->type = devtype; + bus = devargs->bus; if (devargs->type == RTE_DEVTYPE_WHITELISTED) { if (bus->conf.scan_mode == RTE_BUS_SCAN_UNDEFINED) { bus->conf.scan_mode = RTE_BUS_SCAN_WHITELIST; @@ -129,12 +170,10 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str) } } - free(buf); TAILQ_INSERT_TAIL(&devargs_list, devargs, next); return 0; fail: - free(buf); if (devargs) { free(devargs->args); free(devargs); diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h index 6e9e134..2ab8864 100644 --- a/lib/librte_eal/common/include/rte_devargs.h +++ b/lib/librte_eal/common/include/rte_devargs.h @@ -119,6 +119,26 @@ int rte_eal_parse_devargs_str(const char *devargs_str, char **drvname, char **drvargs); /** + * Parse a device string. + * + * Verify that a bus is capable of handling the device passed + * in argument. Store which bus will handle the device, its name + * and the eventual device parameters. + * + * @param dev + * The device declaration string. + * @param da + * The devargs structure holding the device information. + * + * @return + * - 0 on success. + * - Negative errno on error. + */ +int +rte_eal_devargs_parse(const char *dev, + struct rte_devargs *da); + +/** * Add a device to the user device list * * For PCI devices, the format of arguments string is "PCI_ADDR" or -- 2.1.4