From patchwork Tue Jul 3 22:14:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42170 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 343261BE35; Wed, 4 Jul 2018 00:15:38 +0200 (CEST) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id DBE831B4C1 for ; Wed, 4 Jul 2018 00:15:35 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id 69-v6so3724974wmf.3 for ; Tue, 03 Jul 2018 15:15:35 -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=cmYNR272NrQQU/ClBRXU0Ogls9o1jmYrTFobQ2Nviak=; b=OFXZ+neZ4bmCfAQRIIFOESEoBpV5ENYsKPpZbmID9KjtLubMtjbLJX8gaRw5AhVSHg QmgIbyBHpluxj5WsXvjdCWR33Feuw4Q7BsAS6hO8gq3BstLFTR12AjeGPzM33/SFed4/ ecZjPG6iqMbMziWZXh563Duc1smjzXc7yPAKz77WGvhAFroqvpCDn79yXy+Ai5Vn1OZh ALgk7ekpgyq14vULE90A3q3u3da8m7hNw2+n0XbqIsoIVO6XlfIGCFsMW4TDwsJr80dL AjBJucrPlpEw4L7eAubGEJ9Gf0nNSKNRDH33imLXQO5LdO3Vs9u18V1zjFzrV01wVZoC VqTA== 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=cmYNR272NrQQU/ClBRXU0Ogls9o1jmYrTFobQ2Nviak=; b=RCzTxqPVSNXkUt/LkRYW8A4snZJapcSWEcFQdU+6qHW97qJnVxy3PgnfEsI04ZcE3J dY3QxiARzSCpFXQ8XVo5exu0ylMRPq8t7VvRY/Y3xAAKYq+NOlqZ92TrskRnADCREkFB oEL+wajXv1Y5qw1DLgiVS5cOTMFLzicSI76rvNFB7QsMJ9/euzb3uJjJetL9UklofIXg tzE/JzY3Gmv/OEuUBrxIFNiUqTJBqI+GxQNOtUZSo58ab1C6twPY3P+ZzfNtSdmK+9sp fx/A6ysGDR5o0BwFxqMcyl6SnUUDacAnd11kFPz2Jx/6ah1/mQIg7IML40p8yK9mYXGx 3gHQ== X-Gm-Message-State: APt69E3z4GGnVom/ffoS8qAdjPd1NFwdcccpIey0O9wYFptcAOUJFYas SO6MMhl1Eo5XegMOFewBTuG+PxBb X-Google-Smtp-Source: AAOMgpdXfbpKO+duqkUgLXTaPmCi2yVBAJ61PL0HdrhgwDGvThLBVuX+rfnKPWWYitOfq6+vRD2gGQ== X-Received: by 2002:a1c:5b88:: with SMTP id p130-v6mr12385584wmb.69.1530656135033; Tue, 03 Jul 2018 15:15:35 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:34 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:44 +0200 Message-Id: <4dd95d07b484a671a2be5d65ad12a4212093ada8.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 01/27] devargs: add non-variadic parsing function 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" rte_devargs_parse becomes non-variadic, rte_devargs_parsef becomes the variadic version, to be used to compose device strings. Signed-off-by: Gaetan Rivet --- drivers/net/failsafe/failsafe_args.c | 2 +- drivers/net/failsafe/failsafe_eal.c | 2 +- lib/librte_eal/common/eal_common_dev.c | 4 +-- lib/librte_eal/common/eal_common_devargs.c | 42 ++++++++++++++++++++++------- lib/librte_eal/common/include/rte_devargs.h | 40 +++++++++++++++++++++++++-- lib/librte_eal/rte_eal_version.map | 1 + lib/librte_ethdev/rte_ethdev.c | 2 +- 7 files changed, 76 insertions(+), 17 deletions(-) diff --git a/drivers/net/failsafe/failsafe_args.c b/drivers/net/failsafe/failsafe_args.c index 2c002b164..626883ce2 100644 --- a/drivers/net/failsafe/failsafe_args.c +++ b/drivers/net/failsafe/failsafe_args.c @@ -63,7 +63,7 @@ fs_parse_device(struct sub_device *sdev, char *args) d = &sdev->devargs; DEBUG("%s", args); - ret = rte_devargs_parse(d, "%s", args); + ret = rte_devargs_parse(d, args); if (ret) { DEBUG("devargs parsing failed with code %d", ret); return ret; diff --git a/drivers/net/failsafe/failsafe_eal.c b/drivers/net/failsafe/failsafe_eal.c index 5672f3961..ce1633f13 100644 --- a/drivers/net/failsafe/failsafe_eal.c +++ b/drivers/net/failsafe/failsafe_eal.c @@ -86,7 +86,7 @@ fs_bus_init(struct rte_eth_dev *dev) else snprintf(devstr, sizeof(devstr), "%s", rte_eth_devices[pid].device->name); - ret = rte_devargs_parse(da, "%s", devstr); + ret = rte_devargs_parse(da, devstr); if (ret) { ERROR("Probed devargs parsing failed with code" " %d", ret); diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 61cb3b162..ce4b51469 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -138,8 +138,8 @@ int __rte_experimental rte_eal_hotplug_add(const char *busname, const char *devn if (da == NULL) return -ENOMEM; - ret = rte_devargs_parse(da, "%s:%s,%s", - busname, devname, devargs); + ret = rte_devargs_parsef(da, "%s:%s,%s", + busname, devname, devargs); if (ret) goto err_devarg; diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index b0434158b..0a83beb94 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -62,24 +62,18 @@ bus_name_cmp(const struct rte_bus *bus, const void *name) return strncmp(bus->name, name, strlen(bus->name)); } -int __rte_experimental -rte_devargs_parse(struct rte_devargs *da, const char *format, ...) +__rte_experimental +int +rte_devargs_parse(struct rte_devargs *da, const char *dev) { struct rte_bus *bus = NULL; - va_list ap; - va_start(ap, format); - char dev[vsnprintf(NULL, 0, format, ap) + 1]; const char *devname; const size_t maxlen = sizeof(da->name); size_t i; - va_end(ap); if (da == NULL) return -EINVAL; - va_start(ap, format); - vsnprintf(dev, sizeof(dev), format, ap); - va_end(ap); /* Retrieve eventual bus info */ do { devname = dev; @@ -124,6 +118,34 @@ rte_devargs_parse(struct rte_devargs *da, const char *format, ...) return 0; } +__rte_experimental +int +rte_devargs_parsef(struct rte_devargs *da, const char *format, ...) +{ + va_list ap; + size_t len; + char *dev; + + if (da == NULL) + return -EINVAL; + + va_start(ap, format); + len = vsnprintf(NULL, 0, format, ap); + va_end(ap); + + dev = calloc(1, len + 1); + if (dev == NULL) { + fprintf(stderr, "ERROR: not enough memory to parse device\n"); + return -ENOMEM; + } + + va_start(ap, format); + vsnprintf(dev, len, format, ap); + va_end(ap); + + return rte_devargs_parse(da, dev); +} + int __rte_experimental rte_devargs_insert(struct rte_devargs *da) { @@ -150,7 +172,7 @@ rte_devargs_add(enum rte_devtype devtype, const char *devargs_str) if (devargs == NULL) goto fail; - if (rte_devargs_parse(devargs, "%s", dev)) + if (rte_devargs_parse(devargs, dev)) goto fail; devargs->type = devtype; bus = devargs->bus; diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h index 58fbd90a2..6c3b6326b 100644 --- a/lib/librte_eal/common/include/rte_devargs.h +++ b/lib/librte_eal/common/include/rte_devargs.h @@ -96,6 +96,42 @@ int rte_eal_parse_devargs_str(const char *devargs_str, * in argument. Store which bus will handle the device, its name * and the eventual device parameters. * + * The syntax is: + * + * bus:device_identifier,arg1=val1,arg2=val2 + * + * where "bus:" is the bus name followed by any character separator. + * The bus name is optional. If no bus name is specified, each bus + * will attempt to recognize the device identifier. The first one + * to succeed will be used. + * + * Examples: + * + * pci:0000:05.00.0,arg=val + * 05.00.0,arg=val + * vdev:net_ring0 + * + * @param da + * The devargs structure holding the device information. + * + * @param dev + * String describing a device. + * + * @return + * - 0 on success. + * - Negative errno on error. + */ +__rte_experimental +int +rte_devargs_parse(struct rte_devargs *da, const char *dev); + +/** + * 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. + * * The device string is built with a printf-like syntax. * * The syntax is: @@ -124,8 +160,8 @@ int rte_eal_parse_devargs_str(const char *devargs_str, */ __rte_experimental int -rte_devargs_parse(struct rte_devargs *da, - const char *format, ...) +rte_devargs_parsef(struct rte_devargs *da, + const char *format, ...) __attribute__((format(printf, 2, 0))); /** diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index f7dd0e7bc..1c4db72fa 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -254,6 +254,7 @@ EXPERIMENTAL { rte_devargs_insert; rte_devargs_next; rte_devargs_parse; + rte_devargs_parsef; rte_devargs_remove; rte_devargs_type_count; rte_eal_cleanup; diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index a9977df97..cce20d9ae 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -654,7 +654,7 @@ rte_eth_dev_attach(const char *devargs, uint16_t *port_id) } /* parse devargs */ - if (rte_devargs_parse(&da, "%s", devargs)) + if (rte_devargs_parse(&da, devargs)) goto err; ret = rte_eal_hotplug_add(da.bus->name, da.name, da.args); From patchwork Tue Jul 3 22:14:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42171 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1940F1BE56; Wed, 4 Jul 2018 00:15:40 +0200 (CEST) Received: from mail-wm0-f52.google.com (mail-wm0-f52.google.com [74.125.82.52]) by dpdk.org (Postfix) with ESMTP id B6BBD1BE1D for ; Wed, 4 Jul 2018 00:15:36 +0200 (CEST) Received: by mail-wm0-f52.google.com with SMTP id p11-v6so3723194wmc.4 for ; Tue, 03 Jul 2018 15:15:36 -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=o05wWIBefdI3lkZ64u5iCyqaWgbiAT5ocS/Pprxx5hI=; b=mdw+xlma3cEjaneIFfxHNtrPZ7vCG2p9hgVevtdO7+psCmLq63pCZE0AXM2t8eR62b CdoBTzj16tT5L0byZ2F7mPE/jFbtx54hZndVIn3OmvvBY4zYUO7uzKJsdHgNE9jmkdol e/rfhc6nJecfhg+bIraHt9Kim/IX4/1Hf5SHTWk0cZW7T6SYiXQY5JpyexxeX0kSIZ9g FJ8eEtBIPwatEKk+w/E6khJcNTJh2jprUQ0cze7ihMrcJFkC91t94Djx055mVQFyKRuZ fV6MiQVDmQdShzitgRyOs7yJCcDy+NMZQp4Kt4fUBR6kqQiG50Z7NonEVDb07EGHZIsw UjKQ== 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=o05wWIBefdI3lkZ64u5iCyqaWgbiAT5ocS/Pprxx5hI=; b=qMWFeH34vrsZbBpfXCNexUJ6yPM1WfuZ68NahsB6zwHELZmm6aOSPWUCziCsg0A4eB BZBEK3SlmR9+GCQQyGlF2rggexTu1ThuNS9kIU3z1lEmtl2iLV/md8gtS00rnRHTEgjd w1Myx9Bra75VU7QMCOKz6NITpbGS/6ZJQMmndBpPkiJoSMqWGYWSoJnp3RpJZ+bMdBP0 Xr1YlgXpTWL+/bPCpj271n1auCgQ0fmgsuJXU/ZM7jJ/M5EJDTM+qxhU4S4i4UK2MVOR rAH3PRw1sASAAqf6i8WowEQ6wmTiZ6y30T3UthXqzFp1XS9JPl1+nCOZ+UnIymvwoK4q PJXA== X-Gm-Message-State: APt69E05a1tYVZu80fxKJB7Ps5DuV4cwN50IUvJdqtvL9SFE0U1N4OCx ECeXyacdwOkCoGFWn9+2f4J0o6S5 X-Google-Smtp-Source: AAOMgpfPWfI5R4AMPEwX5xwfiImxzaNulgTJG2TWab9vj46b5MsDpvXVgHji01MNqMk995pCkjEIgw== X-Received: by 2002:a1c:e541:: with SMTP id c62-v6mr9358041wmh.154.1530656136037; Tue, 03 Jul 2018 15:15:36 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:35 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:45 +0200 Message-Id: <219ee773c228fc32b7213bca5073258008126a38.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 02/27] kvargs: remove error logs 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" Error logs in kvargs parsing should be better handled in components calling the library. This library must be as lean as possible. Signed-off-by: Gaetan Rivet --- lib/librte_kvargs/rte_kvargs.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index d92a5f9dc..747f14964 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -6,7 +6,6 @@ #include #include -#include #include #include "rte_kvargs.h" @@ -28,29 +27,22 @@ rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) * to pass to rte_strsplit */ kvlist->str = strdup(params); - if (kvlist->str == NULL) { - RTE_LOG(ERR, PMD, "Cannot parse arguments: not enough memory\n"); + if (kvlist->str == NULL) return -1; - } /* browse each key/value pair and add it in kvlist */ str = kvlist->str; while ((str = strtok_r(str, RTE_KVARGS_PAIRS_DELIM, &ctx1)) != NULL) { i = kvlist->count; - if (i >= RTE_KVARGS_MAX) { - RTE_LOG(ERR, PMD, "Cannot parse arguments: list full\n"); + if (i >= RTE_KVARGS_MAX) return -1; - } kvlist->pairs[i].key = strtok_r(str, RTE_KVARGS_KV_DELIM, &ctx2); kvlist->pairs[i].value = strtok_r(NULL, RTE_KVARGS_KV_DELIM, &ctx2); - if (kvlist->pairs[i].key == NULL || kvlist->pairs[i].value == NULL) { - RTE_LOG(ERR, PMD, - "Cannot parse arguments: wrong key or value\n" - "params=<%s>\n", params); + if (kvlist->pairs[i].key == NULL || + kvlist->pairs[i].value == NULL) return -1; - } kvlist->count++; str = NULL; @@ -89,12 +81,8 @@ check_for_valid_keys(struct rte_kvargs *kvlist, for (i = 0; i < kvlist->count; i++) { pair = &kvlist->pairs[i]; ret = is_valid_key(valid, pair->key); - if (!ret) { - RTE_LOG(ERR, PMD, - "Error parsing device, invalid key <%s>\n", - pair->key); + if (!ret) return -1; - } } return 0; } From patchwork Tue Jul 3 22:14:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42172 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 84BFE1BE5C; Wed, 4 Jul 2018 00:15:41 +0200 (CEST) Received: from mail-wr0-f177.google.com (mail-wr0-f177.google.com [209.85.128.177]) by dpdk.org (Postfix) with ESMTP id 4A44E1BE3C for ; Wed, 4 Jul 2018 00:15:38 +0200 (CEST) Received: by mail-wr0-f177.google.com with SMTP id t6-v6so3387555wrn.7 for ; Tue, 03 Jul 2018 15:15:38 -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=Sxhmophs5PVz/xsld34wfEMmtmHs37kn7M6i/VqwFqg=; b=BbR/iwA4UNfPYxm2elBYAiuZ3MWENKUZHonnf9vhRyERV09trM7QkvFJYeS8h5dCPh QciS82bwNXxc0vdh0KSiLAI/CHg11mmi8uL9DOpZ8mf01XKIAtCtUEoX7OCum6wSsWUl rbwXNw6MOSCRd6uEBMmYzgNHPTRFb1Y3v0by5SXB9EIjcFOw7KFm0iofLwaw6RTH4FAw DD4bRVW858QuHQ8mAn/N7VNtFn8jzEv77qUGvd3vO1+9HdAFKWCzY4dH9cysMG3TkEGV RWwnNZCqiNWOX2m5QEZ7A1W7BwA+zS4SQ44KZ6mhNXHVyzxhof+hfCU5XOXLlvZgHPcn 4MEA== 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=Sxhmophs5PVz/xsld34wfEMmtmHs37kn7M6i/VqwFqg=; b=MJZCDLEDVO4mOLuZxA431oD41M0Y6L8if7UGQYQJpR4MZsDSU/kEQ1XDW43xUkvEtw umJgY8K+YPEdvwPDx3cVeORjTfcpbC/1YEUx9EMr5yV6WQk0p0sXK2VEk5j1WZXYWN+2 SaTs0SI1U5pgX7bNCU9hYS5zsGfCzT/iRXiruZ8J4VeKzsuGDclYM3De3LsB9dPyLLDL 1OCqwmulho4s2PJIWKyp9eVo+uO9F39oTHf1MCr0J/2ay4fuzAbMUnBSGndN5VYPEzxz mIvhQjtGJr8EX6w6M+d1bio7oM1G5+yVyZcEUepgyiPziWl8duzkLrjPWHTCFNNpW4+V xu4A== X-Gm-Message-State: APt69E03hit57Am5XtSdE724c26JpQW/6cmk+pyP0ZX4cMbY1y89Do/N nkTjrCOpxeJNCmJd1RIIbRwwbnud X-Google-Smtp-Source: AAOMgpeB2pRiZQ+laIBaZn00G7jOxMrOCi9QOjhLhPDxcgJYyqRZSFma/O4vwrZk0+uCf49AQwCJIg== X-Received: by 2002:adf:e6d0:: with SMTP id y16-v6mr25289658wrm.35.1530656137594; Tue, 03 Jul 2018 15:15:37 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:36 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:46 +0200 Message-Id: <154ef8a16c3634ca4c435ac9ea037ff5fcac7c70.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 03/27] kvargs: build before EAL 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" Signed-off-by: Gaetan Rivet --- lib/Makefile | 3 +-- lib/librte_kvargs/Makefile | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index d82462ba2..e8e903c8f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -4,6 +4,7 @@ include $(RTE_SDK)/mk/rte.vars.mk DIRS-y += librte_compat +DIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += librte_kvargs DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal DIRS-$(CONFIG_RTE_LIBRTE_PCI) += librte_pci DEPDIRS-librte_pci := librte_eal @@ -76,8 +77,6 @@ DEPDIRS-librte_flow_classify := librte_net librte_table librte_acl DIRS-$(CONFIG_RTE_LIBRTE_SCHED) += librte_sched DEPDIRS-librte_sched := librte_eal librte_mempool librte_mbuf librte_net DEPDIRS-librte_sched += librte_timer -DIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += librte_kvargs -DEPDIRS-librte_kvargs := librte_eal DIRS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += librte_distributor DEPDIRS-librte_distributor := librte_eal librte_mbuf librte_ethdev DIRS-$(CONFIG_RTE_LIBRTE_PORT) += librte_port diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile index 39d5ac33d..875939547 100644 --- a/lib/librte_kvargs/Makefile +++ b/lib/librte_kvargs/Makefile @@ -7,7 +7,7 @@ include $(RTE_SDK)/mk/rte.vars.mk LIB = librte_kvargs.a CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -LDLIBS += -lrte_eal +CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include EXPORT_MAP := rte_kvargs_version.map From patchwork Tue Jul 3 22:14:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42173 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3A5571BE4C; Wed, 4 Jul 2018 00:15:43 +0200 (CEST) Received: from mail-wr0-f194.google.com (mail-wr0-f194.google.com [209.85.128.194]) by dpdk.org (Postfix) with ESMTP id 784401BE3F for ; Wed, 4 Jul 2018 00:15:39 +0200 (CEST) Received: by mail-wr0-f194.google.com with SMTP id q10-v6so3379584wrd.4 for ; Tue, 03 Jul 2018 15:15:39 -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=bZU/7VKOPDsaUPRBk2F/ugqQ52BHubQjw6+LsmQ5bAE=; b=ECImR+6w+iPq8iR78PyGEQzuP27Dmx7QdbW46yec0Xd8uE5OxLlJ6cRoSBKznhAqvo 14RZLR3tTUQu4LPrNupwpASJcn2vau4M/kF7XlZ8h87FKvf0rAfFfIipLmv80OXwQOYr 3HxknrStAijzjI4mnn07LfAAOGIEeCOuM1g4Jz1V9z7tt9dC63npHvkbZElYv+stlOHE 04vPQe3i6K0KcF0ztjpTCJsM+movsD97Bsvtv2K3GpY8wnp12Qk5jWf84guWzWG38iuR nqse6jM9lFTrgqN9TD5k8rMgRUUai+hZRdKZCH0NprNsDdfB4fa5xKb9TkklCQFtEwDV QDdA== 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=bZU/7VKOPDsaUPRBk2F/ugqQ52BHubQjw6+LsmQ5bAE=; b=WG7dfPvP9SRlSgVPQRZGtjz7sY1oFezl9vkfH0TQ7vCphGh2L9pO1evai1DaipzzmE 75are8ivf2L36vf0Ad7CKo9SxzLSouP/PBBHOoIOlNzu/QyB3ZGVaAqC5gCxBItHIL8a IRMZMkYZfpSSUhjiaxp/cN6FsdIpleCSPyHalB88Yg2BNgJahEeAFo0B71OZwYv+8TWj zAv/Ir3Q2w/DyZnPajWAhecUYFyX9p+sJh9H1+JzlypVWAI8rsJ8sTwC6DJcx+oi7pyJ AqIlkUD5uRpwg5VtGJG9+QZEiCuDulhK3fw/UFHUIRbAhEb4+NWukJizzU3w+6o9ZaBp 3hYw== X-Gm-Message-State: APt69E2eT6O2YhalT3SQAlsbePeK1++Are9i2VlV/0358S6vSZW+iVmc SlhcRNXdzIT2jBaygiT7ITgbyIak X-Google-Smtp-Source: AAOMgpcOMVCLxUHcgpHA0DVlCCz9Vlsb2TrpYe2ZC1L7XZrIk1JHJuwY5ylnopT44LweVZDG5JerMQ== X-Received: by 2002:adf:874b:: with SMTP id 11-v6mr16310149wrz.117.1530656138848; Tue, 03 Jul 2018 15:15:38 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:37 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:47 +0200 Message-Id: <5f7625162a33c5814f4760babcc1854d260fbed6.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 04/27] kvargs: introduce a more flexible parsing function 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" This function permits defining additional terminating characters, ending the parsing to arbitrary delimiters. Signed-off-by: Gaetan Rivet --- lib/Makefile | 1 + lib/librte_kvargs/rte_kvargs.c | 25 +++++++++++++++++++++++++ lib/librte_kvargs/rte_kvargs.h | 30 ++++++++++++++++++++++++++++++ lib/librte_kvargs/rte_kvargs_version.map | 7 +++++++ 4 files changed, 63 insertions(+) diff --git a/lib/Makefile b/lib/Makefile index e8e903c8f..8a65525cd 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -5,6 +5,7 @@ include $(RTE_SDK)/mk/rte.vars.mk DIRS-y += librte_compat DIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += librte_kvargs +DEPDIRS-librte_kvargs := librte_compat DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal DIRS-$(CONFIG_RTE_LIBRTE_PCI) += librte_pci DEPDIRS-librte_pci := librte_eal diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index 747f14964..519f77679 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -168,3 +168,28 @@ rte_kvargs_parse(const char *args, const char * const valid_keys[]) return kvlist; } + +__rte_experimental +struct rte_kvargs * +rte_kvargs_parse2(const char *args, const char * const valid_keys[], + const char *valid_ends) +{ + struct rte_kvargs *kvlist = NULL; + char *copy; + size_t len; + + if (valid_ends == NULL) + return rte_kvargs_parse(args, valid_keys); + + copy = strdup(args); + if (copy == NULL) + return NULL; + + len = strcspn(copy, valid_ends); + copy[len] = '\0'; + + kvlist = rte_kvargs_parse(copy, valid_keys); + + free(copy); + return kvlist; +} diff --git a/lib/librte_kvargs/rte_kvargs.h b/lib/librte_kvargs/rte_kvargs.h index 51b8120b8..98c4ed1bf 100644 --- a/lib/librte_kvargs/rte_kvargs.h +++ b/lib/librte_kvargs/rte_kvargs.h @@ -72,6 +72,36 @@ struct rte_kvargs *rte_kvargs_parse(const char *args, const char *const valid_keys[]); /** + * Allocate a rte_kvargs and store key/value associations from a string. + * This version will consider any byte from valid_ends as a possible + * terminating character, and will not parse beyond any of their occurrence. + * + * The function allocates and fills an rte_kvargs structure from a given + * string whose format is key1=value1,key2=value2,... + * + * The structure can be freed with rte_kvargs_free(). + * + * @param args + * The input string containing the key/value associations + * + * @param valid_keys + * A list of valid keys (table of const char *, the last must be NULL). + * This argument is ignored if NULL + * + * @param valid_ends + * Acceptable terminating characters. + * If NULL, the behavior is the same as ``rte_kvargs_parse``. + * + * @return + * - A pointer to an allocated rte_kvargs structure on success + * - NULL on error + */ +__rte_experimental +struct rte_kvargs *rte_kvargs_parse2(const char *args, + const char *const valid_keys[], + const char *valid_ends); + +/** * Free a rte_kvargs structure * * Free a rte_kvargs structure previously allocated with diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map index 2030ec46c..b9fe44b98 100644 --- a/lib/librte_kvargs/rte_kvargs_version.map +++ b/lib/librte_kvargs/rte_kvargs_version.map @@ -8,3 +8,10 @@ DPDK_2.0 { local: *; }; + +EXPERIMENTAL { + global: + + rte_kvargs_parse2; + +} DPDK_2.0; From patchwork Tue Jul 3 22:14:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42174 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E1B091BE6A; Wed, 4 Jul 2018 00:15:44 +0200 (CEST) Received: from mail-wr0-f169.google.com (mail-wr0-f169.google.com [209.85.128.169]) by dpdk.org (Postfix) with ESMTP id B4B711B4C1 for ; Wed, 4 Jul 2018 00:15:40 +0200 (CEST) Received: by mail-wr0-f169.google.com with SMTP id q10-v6so3379615wrd.4 for ; Tue, 03 Jul 2018 15:15:40 -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=kjK0X93uJ8qR12GsXLADuXLvB/fMaIlBtKWcJvWWVLY=; b=VD9zsi+0FaQ4heNT1tnpBlP/SLFgMwJpl9A0IB2pGUmXDy1Ag16IAVGt4MPvSk5FL8 vwSaDIxHYz4ExYwElpX69TyuBXwJqeS6WgTXj4/reEjRPbtB35ThlwEHbf7MugOl9gl+ QrCA+12B+vL44PCzRWtaiZa5t3tHVg6MCzthaSpkxrVeShuODu0gRIr8Ksl0DMs6kQA/ vvJX5pfocVOXRH53AI/b4ispy4JG55S4AAqB7/Cz3rGU2uPQLQyylsaXBii8hhYiwjWV mIAjk/5R1qNNB572LS4mAy+75nPoZdHMs51iMJP4q32qy2kF+t7ZLDAStciYko3rEqte Wfvg== 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=kjK0X93uJ8qR12GsXLADuXLvB/fMaIlBtKWcJvWWVLY=; b=G329vrfV+4OLJXCYg6b6HleN1oV26vIeyU0dGj3XN4ra8ITaG57KebWbwzS+54B8Ul 6tWxTMPeKJxXPYkRHlkR9r/B+wDNwHUm6ceosM2sfGKdn6f9q8QjsrFvEgPSBqFkO1HV VSOUkHGKskvE/S/f6kiX1xgyJZohI+HCWGqvCuTONCzMkxmJGtp8RMINXoClogamYMcu fdydXHgqFwqYhnGrCn4HP/h/iU3zBCVKbb4NS6rWwDk4v5GM4nMbE9jNqZzotzUOHbXu 7D5hr8SenYYiI5ObHHeRbSYpduNJMRDGb9Ac0EXS2eE3TvvWpBcvgmN/hSDgp1rT3byv ULhg== X-Gm-Message-State: APt69E1M2RVaBbZ98xbWL/4TGcdPuI5fwjJKwg4tS2CeUKfviPdxYZV5 aBuPO8ljFKnFRlxrAN64AwNPVGo/ X-Google-Smtp-Source: AAOMgpcVd8ncVlRBa+ueTF8edzJWdUchWQKKVw+xrh2oUa3BCaitAabZHGDjc0bZRst5IvJT5qdNJA== X-Received: by 2002:adf:8b01:: with SMTP id n1-v6mr24690402wra.282.1530656140133; Tue, 03 Jul 2018 15:15:40 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:39 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:48 +0200 Message-Id: <1ec567e6991c4959491b9517bce926f32d03ccc8.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 05/27] eal: introduce dtor macros 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" Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/include/rte_common.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h index 434adfd45..0dd832728 100644 --- a/lib/librte_eal/common/include/rte_common.h +++ b/lib/librte_eal/common/include/rte_common.h @@ -112,6 +112,29 @@ static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void) RTE_INIT_PRIO(func, LAST) /** + * Run after main() with low priority. + * + * @param func + * Destructor function name. + * @param prio + * Priority number must be above 100. + * Lowest number is the last to run. + */ +#define RTE_FINI_PRIO(func, prio) \ +static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void) + +/** + * Run after main() with high priority. + * + * The destructor will be run *before* prioritized destructors. + * + * @param func + * Destructor function name. + */ +#define RTE_FINI(func) \ + RTE_FINI_PRIO(func, LAST) + +/** * Force a function to be inlined */ #define __rte_always_inline inline __attribute__((always_inline)) From patchwork Tue Jul 3 22:14:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42175 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 63D8E1BE6D; Wed, 4 Jul 2018 00:15:46 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 1CAFC1BE4B for ; Wed, 4 Jul 2018 00:15:42 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id q10-v6so3379654wrd.4 for ; Tue, 03 Jul 2018 15:15:42 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=ySzzXmGMGcnSxjboLdxOcA2Xkn0pD9CSdoQ29+UPRDw=; b=Tt5idOUN5aCasp/jdLkQPU2qDwlfeCiUPRnTh7eNfKLlZikXTmHPAiIAZ6GX1GeAo/ Q4dQGY95rQGtJZUv5UJOvYZIBdO+zQWCir3kNMl2xoNrubTi/KKkHXH1Z3iuZQh66ExO SxL+C2IwF2AjPHHg/ffT8TMY6EZCzz/Mi/f7zJtcESZBOp8eZwQ7IHkvRrVtUJy1JC08 wcY5815LoRBBDZUPh4YX4qvhcPkrJTFmLOJ8y1DI3M8WvoDSw7lWsZHXDMcAQP2ZtHVA 68VOQwLuFp8hNYycRmc9vwznOo8QdN9KXd25AdHA1aRGuyHsz97mle2vHQMUNY5CaxnU LAIw== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=ySzzXmGMGcnSxjboLdxOcA2Xkn0pD9CSdoQ29+UPRDw=; b=XNmaxjac2SOfcMSEFQk3Z29axBHKkNYLLZYmqBoJzi+d/GZW/fuGzZZyxKuiBtTtfd s9aw/JkjvcA0WFR6BDKROZLJk1pFYJkr6iU0dvYJo4GDWIinn1CmJX7dLES3rtxv+SfI Rj+3KH0S1C1770ZkpkJhV0hU5iwxbr+CrnxowlMfMBGeyL7/Iwg6nKz3hoWR5NqikhGE DVK3dFUtlLT8JbM0dMXgbn77QjzUW5f/4qEWYCQr26OQHEE63v/LftlM8Nj8Kme+9tFV 6VDXSZObJurE06e9wtcpWt+DR5xUdQ038N2BOf/rFQJ+0gq/sII7O94rBfN7X0RV0GIU hGaw== X-Gm-Message-State: APt69E0SW6PCbbgKvnIZbLA7VR9qQNdLSdppg0XsBefE/NfIgcuSR+xy lfYPJqae6Wzkv8+iDmw8pLcaMRgh X-Google-Smtp-Source: AAOMgpdDWhIC877YoRqcGt34NiGoR9r2j8dXJHTQGEaE+iXHJu3IuadqP7paLGuTFT8OEoZgulU+JA== X-Received: by 2002:adf:92e7:: with SMTP id 94-v6mr23707785wrn.70.1530656141370; Tue, 03 Jul 2018 15:15:41 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:40 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:49 +0200 Message-Id: <0830e58980b9324bcf609bd9362d3cb09924962b.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 06/27] eal: introduce device class abstraction 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" Signed-off-by: Gaetan Rivet --- lib/librte_eal/bsdapp/eal/Makefile | 1 + lib/librte_eal/common/Makefile | 2 +- lib/librte_eal/common/eal_common_class.c | 62 +++++++++++++++ lib/librte_eal/common/include/rte_class.h | 121 +++++++++++++++++++++++++++++ lib/librte_eal/common/include/rte_common.h | 1 + lib/librte_eal/linuxapp/eal/Makefile | 1 + lib/librte_eal/rte_eal_version.map | 2 + 7 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 lib/librte_eal/common/eal_common_class.c create mode 100644 lib/librte_eal/common/include/rte_class.h diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile index 3fd33f1e4..b0a1c880a 100644 --- a/lib/librte_eal/bsdapp/eal/Makefile +++ b/lib/librte_eal/bsdapp/eal/Makefile @@ -52,6 +52,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_hypervisor.c SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_string_fns.c SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_hexdump.c SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_devargs.c +SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_class.c SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_bus.c SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_dev.c SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_options.c diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile index 48f870f24..750653093 100644 --- a/lib/librte_eal/common/Makefile +++ b/lib/librte_eal/common/Makefile @@ -11,7 +11,7 @@ INC += rte_per_lcore.h rte_random.h INC += rte_tailq.h rte_interrupts.h rte_alarm.h INC += rte_string_fns.h rte_version.h INC += rte_eal_memconfig.h rte_malloc_heap.h -INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h +INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_class.h INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h INC += rte_malloc.h rte_keepalive.h rte_time.h INC += rte_service.h rte_service_component.h diff --git a/lib/librte_eal/common/eal_common_class.c b/lib/librte_eal/common/eal_common_class.c new file mode 100644 index 000000000..aed4dd8fb --- /dev/null +++ b/lib/librte_eal/common/eal_common_class.c @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 Gaëtan Rivet + */ + +#include +#include +#include + +#include +#include + +struct rte_class_list rte_class_list = + TAILQ_HEAD_INITIALIZER(rte_class_list); + +__rte_experimental void +rte_class_register(struct rte_class *class) +{ + RTE_VERIFY(class); + RTE_VERIFY(class->name && strlen(class->name)); + + TAILQ_INSERT_TAIL(&rte_class_list, class, next); + RTE_LOG(DEBUG, EAL, "Registered [%s] device class.\n", class->name); +} + +__rte_experimental void +rte_class_unregister(struct rte_class *class) +{ + TAILQ_REMOVE(&rte_class_list, class, next); + RTE_LOG(DEBUG, EAL, "Unregistered [%s] device class.\n", class->name); +} + +struct rte_class * +rte_class_find(const struct rte_class *start, rte_class_cmp_t cmp, + const void *data) +{ + struct rte_class *cls; + + if (start != NULL) + cls = TAILQ_NEXT(start, next); + else + cls = TAILQ_FIRST(&rte_class_list); + while (cls != NULL) { + if (cmp(cls, data) == 0) + break; + cls = TAILQ_NEXT(cls, next); + } + return cls; +} + +static int +cmp_class_name(const struct rte_class *class, const void *_name) +{ + const char *name = _name; + + return strcmp(class->name, name); +} + +struct rte_class * +rte_class_find_by_name(const char *name) +{ + return rte_class_find(NULL, cmp_class_name, (const void *)name); +} diff --git a/lib/librte_eal/common/include/rte_class.h b/lib/librte_eal/common/include/rte_class.h new file mode 100644 index 000000000..b5e550a34 --- /dev/null +++ b/lib/librte_eal/common/include/rte_class.h @@ -0,0 +1,121 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 Gaëtan Rivet + */ + +#ifndef _RTE_CLASS_H_ +#define _RTE_CLASS_H_ + +/** + * @file + * + * DPDK device class interface. + * + * This file exposes API and interfaces of device classes. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include + +/** Double linked list of classes */ +TAILQ_HEAD(rte_class_list, rte_class); + +/** + * A structure describing a generic device class. + */ +struct rte_class { + TAILQ_ENTRY(rte_class) next; /**< Next device class in linked list */ + const char *name; /**< Name of the class */ +}; + +/** + * Class comparison function. + * + * @param cls + * Class under test. + * + * @param data + * Data to compare against. + * + * @return + * 0 if the class matches the data. + * !0 if the class does not match. + * <0 if ordering is possible and the class is lower than the data. + * >0 if ordering is possible and the class is greater than the data. + */ +typedef int (*rte_class_cmp_t)(const struct rte_class *cls, const void *data); + +/** + * Class iterator to find a particular class. + * + * This function compares each registered class to find one that matches + * the data passed as parameter. + * + * If the comparison function returns zero this function will stop iterating + * over any more classes. To continue a search the class of a previous search + * can be passed via the start parameter. + * + * @param start + * Starting point for the iteration. + * + * @param cmp + * Comparison function. + * + * @param data + * Data to pass to comparison function. + * + * @return + * A pointer to a rte_class structure or NULL in case no class matches + */ +struct rte_class * +rte_class_find(const struct rte_class *start, rte_class_cmp_t cmp, + const void *data); + +/** + * Find the registered class for a given name. + */ +struct rte_class * +rte_class_find_by_name(const char *name); + +/** + * Register a Class handle. + * + * @param + * A pointer to a rte_class structure describing the class + * to be registered. + */ +__rte_experimental +void rte_class_register(struct rte_class *cls); + +/** + * Unregister a Class handle. + * + * @param class + * A pointer to a rte_class structure describing the class + * to be unregistered. + */ +__rte_experimental +void rte_class_unregister(struct rte_class *cls); + +/** + * Helper for Class registration. + * The constructor has lower priority than Bus constructors. + * The constructor has higher priority than PMD constructors. + */ +#define RTE_REGISTER_CLASS(nm, cls) \ +RTE_INIT_PRIO(classinitfn_ ##nm, CLASS); \ +static void classinitfn_ ##nm(void) \ +{\ + (cls).name = RTE_STR(nm);\ + rte_class_register(&cls); \ +} + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_CLASS_H_ */ diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h index 0dd832728..a2e8e6e32 100644 --- a/lib/librte_eal/common/include/rte_common.h +++ b/lib/librte_eal/common/include/rte_common.h @@ -83,6 +83,7 @@ typedef uint16_t unaligned_uint16_t; #define RTE_PRIORITY_LOG 101 #define RTE_PRIORITY_BUS 110 +#define RTE_PRIORITY_CLASS 120 #define RTE_PRIORITY_LAST 65535 #define RTE_PRIO(prio) \ diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile index 3719ec9d7..babc8617a 100644 --- a/lib/librte_eal/linuxapp/eal/Makefile +++ b/lib/librte_eal/linuxapp/eal/Makefile @@ -60,6 +60,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_hypervisor.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_string_fns.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_hexdump.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_devargs.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_class.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_bus.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_dev.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_options.c diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 1c4db72fa..19d36b4c7 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -244,6 +244,8 @@ DPDK_18.05 { EXPERIMENTAL { global: + rte_class_register; + rte_class_unregister; rte_ctrl_thread_create; rte_dev_event_callback_register; rte_dev_event_callback_unregister; From patchwork Tue Jul 3 22:14:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42176 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5F66F1BE79; Wed, 4 Jul 2018 00:15:48 +0200 (CEST) Received: from mail-wr0-f175.google.com (mail-wr0-f175.google.com [209.85.128.175]) by dpdk.org (Postfix) with ESMTP id 570F81BE63 for ; Wed, 4 Jul 2018 00:15:43 +0200 (CEST) Received: by mail-wr0-f175.google.com with SMTP id r16-v6so251680wrt.11 for ; Tue, 03 Jul 2018 15:15:43 -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=28DRsv+QYAFHOkQRiCRQvubzBQLopqiLihNLEKJfEhQ=; b=iG6enogufd0bU+b5K1kPoxSy4SwvAFCFFEb2ql8MyHMsSC4E0Fl+8Vg2dxQVAJWm27 dD/ByxC0LoAwmwCakdGlI+GQQRPCF/vckg0jmnT5IEK70RvQBhfFan+3/4b83ykZ3rDx V0Li9KZ+IeHbUh8Y6ubq2r/kDFab+ILcSEB6IwydXqWXPTtBbTwVCFeMkqtgHAG13kY9 qpfMIkI4E1uXdr1CN8DE+ELABXEpZ8+sQ9s+hwszMA+2IROWamCtdNXAuDgWMGEgv1Hw i/6XX7mLwclaxQFK4rE4vImfJbCAez31SRWX2ApKrRK4fFcNVOQkVSAybzjt+/HNSurl a+JQ== 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=28DRsv+QYAFHOkQRiCRQvubzBQLopqiLihNLEKJfEhQ=; b=Sm466YWWMJ5JEMXgaRoJSGX4AzH69f61eSHIe01XDW3ha4eJ+WOuVtDe8OcBH9GpLr 1UGG7Kovjx4wwuiB4PeanjIjVido42lvMyVvu9briGzc4uJLqPQ9hDUWwTkECzjz8iur ww1MMQRSJKKkBam1AuW31t+146kU9U7LKW+83PggbhuWCI087UeL7tgXaZ4jdKTAfT9O nqh4rPYN12yAM/HOtCBStUqZ15rtWlbpwK1ySKZshjt6scd1Fkz8LZwKm1InqDxu6Dpi QyGMzwXNtnqPcIaMNHioHn69akWUKesSXDi9f8bEi+DtZ0rAQP3HHYH6p9XidiA5hLHd xqKA== X-Gm-Message-State: APt69E35CZXW+SirhKUYCt81rjSjntDd6T3yM7ShR/sJZqFEpz6c4cXz kuCbxfnNwnfS3H8LGqiAPC88yTUI X-Google-Smtp-Source: AAOMgpdeepLP0njrOwMm3BSWto0IC82x7KUeHLfZHDJrEgQ+OKeDfdGQ0cKbmjTjE8VAHSVYvDS8ZQ== X-Received: by 2002:adf:8345:: with SMTP id 63-v6mr24589348wrd.37.1530656142661; Tue, 03 Jul 2018 15:15:42 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:41 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:50 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 07/27] eal/class: register destructor 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" Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/include/rte_class.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/librte_eal/common/include/rte_class.h b/lib/librte_eal/common/include/rte_class.h index b5e550a34..e8176f5e1 100644 --- a/lib/librte_eal/common/include/rte_class.h +++ b/lib/librte_eal/common/include/rte_class.h @@ -112,6 +112,11 @@ static void classinitfn_ ##nm(void) \ {\ (cls).name = RTE_STR(nm);\ rte_class_register(&cls); \ +} \ +RTE_FINI_PRIO(classfinifn_ ##nm, CLASS); \ +static void classfinifn_ ##nm(void) \ +{ \ + rte_class_unregister(&cls); \ } #ifdef __cplusplus From patchwork Tue Jul 3 22:14:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42177 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C8C091BE7E; Wed, 4 Jul 2018 00:15:49 +0200 (CEST) Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by dpdk.org (Postfix) with ESMTP id 9E0871BE66 for ; Wed, 4 Jul 2018 00:15:44 +0200 (CEST) Received: by mail-wr0-f193.google.com with SMTP id u7-v6so3368706wrn.12 for ; Tue, 03 Jul 2018 15:15:44 -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=UvNqvCl1PWOY6FXGV5JyENWrDFvuGP8TjQlKPnzIcWg=; b=edK5g8K79D7022OVA1ci0o9BHNj6dRTjS4lNBdWz/UllPNVRbfZj8WIHgsR1TAxy64 HOHzmd7+RvNezkTiDdCcWv4SmC4wegUgFpr+vbND2Q/pIgrfu7y2ZTQ98o3CvxDhj7OV qQlEPeFl5xIqAAUIwg0pmGgScJH61y95y/PsUac8g7eTYU8adMA9bZB29nHe1OsmX6Cv Wl7GNC3iJgtfFC3WPtmyk9OzXDATXOttyBJuDX23qt9MCBLNt+33CNWPCVZuHjCFm9UU rDTaH67oaxmkWz/IXwad8ZQEJxEu+fdQNh5Xp3+idNycreNfwuTo/843V4btlLjsvxSv yRFw== 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=UvNqvCl1PWOY6FXGV5JyENWrDFvuGP8TjQlKPnzIcWg=; b=RHHkHEmDilFjKFeq4oa+oHJy78DBXMmD7xkPgt9DrkFSUMYQCMfAAw0kfPZyf1L0gf cXMiMjWZnpGgZis7z71D4TOkzsD3VVDHP8AJq+fYZ1lhH3hryfyodz3x8MrjcuKqfMoo z8gGD5sk2cvplDbMWRUHJ92CFutqgrAC9qffkww5xWQhSRzO+KGS5qYkYX5dtNUFyKN8 y8hZYdA4sZ9aFxUJmkQp+FGjZSNeRjdcYvkfByCK8O6qyRfGmrbJKEZ4kr095BtZN2xd Ps8+eQK9s9JXQ/1OJmWqm6bq6RFSt25JnToRSxJRsR6DLW3H8ElApZgSoUliou2PMSTv Beug== X-Gm-Message-State: APt69E2TdMdx9n8sT/ffZxuzx5Xxe7P+YluzodS54l4DSb9qhf8cdIoQ rgxA1FbA8QEsJ6MIjhuQWoITnHZ9 X-Google-Smtp-Source: AAOMgpfLpM07D+3hJ7Egkd+IJOESHb8IUWiCAeVDK8b28tnnZc5h7uN3nzGk51HG6TOlDMhDr497gw== X-Received: by 2002:adf:9485:: with SMTP id 5-v6mr19205087wrr.82.1530656143948; Tue, 03 Jul 2018 15:15:43 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:42 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:51 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 08/27] devargs: add function to parse device layers 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" This function is private to the EAL. It is used to parse each layers in a device description string, and store the result in an rte_devargs structure. Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/eal_common_devargs.c | 144 ++++++++++++++++++++++++++++ lib/librte_eal/common/eal_private.h | 27 ++++++ lib/librte_eal/common/include/rte_devargs.h | 13 ++- 3 files changed, 181 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index 0a83beb94..5f89e0b6e 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -13,9 +13,13 @@ #include #include +#include +#include #include #include #include +#include +#include #include #include "eal_private.h" @@ -56,6 +60,146 @@ rte_eal_parse_devargs_str(const char *devargs_str, return 0; } +static size_t +devargs_layer_count(const char *s) +{ + size_t i = s ? 1 : 0; + + while (s != NULL && s[0] != '\0') { + i += s[0] == '/'; + s++; + } + return i; +} + +int +rte_devargs_layers_parse(struct rte_devargs *da, + const char *devstr) +{ + struct { + const char *key; + const char *str; + struct rte_kvargs *kvlist; + } layers[] = { + { "bus=", NULL, NULL, }, + { "class=", NULL, NULL, }, + { "driver=", NULL, NULL, }, + }; + struct rte_kvargs_pair *kv = NULL; + struct rte_class *cls = NULL; + struct rte_bus *bus = NULL; + const char *s = devstr; + size_t nblayer; + size_t i = 0; + int ret = 0; + + /* Split each sub-lists. */ + nblayer = devargs_layer_count(devstr); + if (nblayer > RTE_DIM(layers)) { + RTE_LOG(ERR, EAL, "Invalid format: too many layers (%zu)\n", + nblayer); + ret = -E2BIG; + goto get_out; + } + + /* If the devargs points the devstr + * as source data, then it should not allocate + * anything and keep referring only to it. + */ + if (da->data != devstr) { + da->data = strdup(devstr); + if (da->data == NULL) { + RTE_LOG(ERR, EAL, "OOM\n"); + ret = -ENOMEM; + goto get_out; + } + s = da->data; + } + + while (s != NULL) { + if (strncmp(layers[i].key, s, + strlen(layers[i].key)) && + /* The last layer is free-form. + * The "driver" key is not required (but accepted). + */ + i != RTE_DIM(layers) - 1) + goto next_layer; + layers[i].str = s; + layers[i].kvlist = rte_kvargs_parse2(s, NULL, "/"); + if (layers[i].kvlist == NULL) { + RTE_LOG(ERR, EAL, "Could not parse %s\n", s); + ret = -EINVAL; + goto get_out; + } + s = strchr(s, '/'); + if (s != NULL) + s++; +next_layer: + if (i >= RTE_DIM(layers)) { + RTE_LOG(ERR, EAL, "Unrecognized layer %s\n", s); + ret = -EINVAL; + goto get_out; + } + i++; + } + + /* Parse each sub-list. */ + for (i = 0; i < RTE_DIM(layers); i++) { + if (layers[i].kvlist == NULL) + continue; + kv = &layers[i].kvlist->pairs[0]; + if (strcmp(kv->key, "bus") == 0) { + bus = rte_bus_find_by_name(kv->value); + if (bus == NULL) { + RTE_LOG(ERR, EAL, "Could not find bus \"%s\"\n", + kv->value); + ret = -EFAULT; + goto get_out; + } + } else if (strcmp(kv->key, "class") == 0) { + cls = rte_class_find_by_name(kv->value); + if (cls == NULL) { + RTE_LOG(ERR, EAL, "Could not find class \"%s\"\n", + kv->value); + ret = -EFAULT; + goto get_out; + } + } else if (strcmp(kv->key, "driver") == 0) { + /* Ignore */ + continue; + } + } + + /* Fill devargs fields. */ + da->busstr = layers[0].str; + da->clsstr = layers[1].str; + da->drvstr = layers[2].str; + da->bus = bus; + da->cls = cls; + + /* If we own the data, clean up a bit + * the several layers string, to ease + * their parsing afterward. + */ + if (da->data != devstr) { + char *s = (void *)(intptr_t)(da->data); + + while ((s = strchr(s, '/'))) { + *s = '\0'; + s++; + } + } + +get_out: + for (i = 0; i < RTE_DIM(layers); i++) { + if (layers[i].kvlist) + rte_kvargs_free(layers[i].kvlist); + } + if (ret != 0) + rte_errno = -ret; + return ret; +} + static int bus_name_cmp(const struct rte_bus *bus, const void *name) { diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h index bdadc4d50..c4c9283c8 100644 --- a/lib/librte_eal/common/eal_private.h +++ b/lib/librte_eal/common/eal_private.h @@ -258,4 +258,31 @@ int rte_mp_channel_init(void); */ void dev_callback_process(char *device_name, enum rte_dev_event_type event); +/** + * @internal + * Parse a device string and store its information in an + * rte_devargs structure. + * + * Note: if the "data" field of da points to devstr, + * then no dynamic allocation is performed and the rte_devargs + * can be safely discarded. + * + * Otherwise ``data`` will hold a workable copy of devstr, that will be + * used by layers descriptors within rte_devargs. In this case, + * any rte_devargs should be cleaned-up before being freed. + * + * @param da + * rte_devargs structure to fill. + * + * @param devstr + * Device string. + * + * @return + * 0 on success. + * Negative errno values on error (rte_errno is set). + */ +int +rte_devargs_layers_parse(struct rte_devargs *da, + const char *devstr); + #endif /* _EAL_PRIVATE_H_ */ diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h index 6c3b6326b..148600258 100644 --- a/lib/librte_eal/common/include/rte_devargs.h +++ b/lib/librte_eal/common/include/rte_devargs.h @@ -51,12 +51,19 @@ struct rte_devargs { enum rte_devtype type; /** Device policy. */ enum rte_dev_policy policy; - /** Bus handle for the device. */ - struct rte_bus *bus; /** Name of the device. */ char name[RTE_DEV_NAME_MAX_LEN]; + RTE_STD_C11 + union { /** Arguments string as given by user or "" for no argument. */ - char *args; + char *args; + const char *drvstr; + }; + struct rte_bus *bus; /**< bus handle. */ + struct rte_class *cls; /**< class handle. */ + const char *busstr; /**< bus-related part of device string. */ + const char *clsstr; /**< bus-related part of device string. */ + const char *data; /**< Device string storage. */ }; /** From patchwork Tue Jul 3 22:14:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42178 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2F6CB1BE85; Wed, 4 Jul 2018 00:15:51 +0200 (CEST) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id CC0731BE6C for ; Wed, 4 Jul 2018 00:15:45 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id v16-v6so3797647wmv.5 for ; Tue, 03 Jul 2018 15:15:45 -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=+PtSwL92xvH7QaDOLlLEBP1myR80ZkQw2JwqGJe+bOA=; b=k3CrXusUMOVLa+lXJfElspjsm+qcd/OYCmAsvAgaQ89BDZ2yz56HefaZI/tghJnAkW OBnUOlFETB7+vG6jXNDACC7c3N4T6/F1XcuHB0Fwwum72ywAS3JSiybHEUlG250ZtqPh N5xS9IlOnBs0aV/I61kwZsmNKYi83qYj3piacW5Iea2fPnjJ2sJcXM5MpAjVnveL8IPy 6QyiwEd3iDqrx2jchNKnmgartIw9S1oLdrIS900xovGWCuFs1QOUTIRsAmQKoOuOLxY5 uHIymP2D8QZkQ8oL9Unupv3CJj/rOIsrvv6Lf+bdpdds7PTI2CUYMfjUvSLNOhZrerTR StUA== 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=+PtSwL92xvH7QaDOLlLEBP1myR80ZkQw2JwqGJe+bOA=; b=W5LAmtVerq3wd/BeK0YzmavAVDbkHRqN6/IdToScBuBIlj93qeKmGOTdG4HjDX1LO9 CY3pJbGOacZGC9dYLEWJ50tWagOrgS+wMTk5rDfhei/zjsS57lwm8/TGyJUd77Q1BSRZ QP+y6XidWsGDOG+Dum2vYEda7ILe3y6jNAVJln8bPO+KqwTIZ1KbcR9h0xwSW8rFel6k W3f0AqK/3r6Gp27YrcvAVYBYMwteyZcC5s5O9kvD0mk1T/WaRn1VG3SDh2jJfCTcHZS2 ZPP33N8CDqi6nGUf65f1m/jHywD+xBzdwE8gdVrsGHojfKEPXzkTbI0dfsoyAT4TzjMW mYGw== X-Gm-Message-State: APt69E3LOyM2pV5njuUVS3IuCUkik/jea1WPxVmTDBC6JDinv/fgNsZy ywXGtlLvILZAnqgk6YM29JSlQxta X-Google-Smtp-Source: AAOMgpc8ZKZn279OwmbAMHCsJ7A6UhVuEFtOODUZDCiMDrRJ+VFklPbwbzWp3woaBCuXmPk3SYcH+Q== X-Received: by 2002:a1c:f106:: with SMTP id p6-v6mr11571786wmh.68.1530656145139; Tue, 03 Jul 2018 15:15:45 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:44 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:52 +0200 Message-Id: <062cf5694b1776a18f2f0718224d7e379c77ba7c.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 09/27] eal/dev: add device iterator interface 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" A device iterator allows iterating over a set of devices. This set is defined by the two descriptions offered, * rte_bus * rte_class Only one description can be provided, or both. It is not allowed to provide no description at all. Each layer of abstraction then performs a filter based on the description provided. This filtering allows iterating on their internal set of devices, stopping when a match is valid and returning the current iteration context. This context allows starting the next iteration from the same point and going forward. Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/include/rte_dev.h | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index 3879ff3ca..120df729f 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -285,6 +285,53 @@ __attribute__((used)) = str static const char DRV_EXP_TAG(name, kmod_dep_export)[] \ __attribute__((used)) = str +/** + * Iteration context. + * + * This context carries over the current iteration state. + */ +struct rte_dev_iterator { + const char *devstr; /**< device string. */ + const char *busstr; /**< bus-related part of device string. */ + const char *clsstr; /**< class-related part of device string. */ + struct rte_bus *bus; /**< bus handle. */ + struct rte_class *cls; /**< class handle. */ + struct rte_device *device; /**< current position. */ + void *class_device; /**< additional specialized context. */ +}; + +/** + * Device iteration function. + * + * Find the next device matching properties passed in parameters. + * The function takes an additional ``start`` parameter, that is + * used as starting context when relevant. + * + * The function returns the current element in the iteration. + * This return value will potentially be used as a start parameter + * in subsequent calls to the function. + * + * The additional iterator parameter is only there if a specific + * implementation needs additional context. It must not be modified by + * the iteration function itself. + * + * @param start + * Starting iteration context. + * + * @param devstr + * Device description string. + * + * @param it + * Device iterator. + * + * @return + * The address of the current element matching the device description + * string. + */ +typedef void *(*rte_dev_iterate_t)(const void *start, + const char *devstr, + const struct rte_dev_iterator *it); + #ifdef __cplusplus } #endif From patchwork Tue Jul 3 22:14:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42179 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2C59D1BE89; Wed, 4 Jul 2018 00:15:53 +0200 (CEST) Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id 4C0571BE70 for ; Wed, 4 Jul 2018 00:15:47 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id v16-v6so3797683wmv.5 for ; Tue, 03 Jul 2018 15:15:47 -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=m51DksV4EXmxmvGMaTfKNA+K9/HIFbvWXpWsebu3ZoE=; b=s3gBWF9qzXVro5as+jT0kkI26AJMWJ+CEhwJOCtK/LUtZsUVUlz64O1mIpkSEsk3ts 5UtxJ8XUkD47UBku9hmaR4hEQpX4GcRusQ0g9+05zHYKo1xZquntcYvgR+WsnHPK5Y0B lGGQ1tjI08q+0tHIDpXlK+AbN/j6TTtVFlKl2AY1iwouuyBibaqZKtdAy4kXs96Cis68 LvddOS8Kt85MSSK/z9fIOXKZbKKjvnP3vN2Zc3a9MyvQ2DHYdNj61d65I54y6z0kxnwF 1yzZd+XpXvB3Y8X8URjYJKNOZrZjfhgm4WCjYJr8iGUCeP7miWZTDmReLjG/a1AgmUDk 4BKA== 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=m51DksV4EXmxmvGMaTfKNA+K9/HIFbvWXpWsebu3ZoE=; b=bMgIfu/sVxkJQdXnxcCJTTe8CEpn1YgYXFICKSmvEkxZebLMbOcWFNEDoAbYZRUxQI LYtVZmY713M4wm3A/CT5pkH3K77bGN/pUkIdu3pXBtw853GxqrnlAZ17+D1tNV8NtCS8 F8aG9IBskWqVUTGTvz5EbMOB4nSDJISweoxNFDtem/Qif95kg7gZjdbUofLDbImq0M4B oVTOeunpquWMeC4efoTezUY3Uo4jWUakOFC9eygIqKR4KQ/JsCuPjFtFyiGS/1YpH4Ex 17hq18hoGmQ7OyFCHMkIvYDIE9BImzPOMM3Hq7+8Av/I7E5iynTYypit+Ome2L1TUx52 rG4w== X-Gm-Message-State: APt69E2oTe+8KIchiusVso8tm/7uk8h4NKCwAIbh4V/UsluVwja25uQh 6yQ8Oj036RGCvPg3gwinyEaMUjrx X-Google-Smtp-Source: AAOMgpcIxQa7lPefhJQlvsrb2KNjmq8ZE3j04db9o2Bf8LqvUiF4g0vO4HPFOB0NGTm+s1UFH8Nqpg== X-Received: by 2002:a1c:6f06:: with SMTP id k6-v6mr2255755wmc.1.1530656146605; Tue, 03 Jul 2018 15:15:46 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:45 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:53 +0200 Message-Id: <9ce812b5b2bb8bfc84893ac1adb4af6951715d8d.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 10/27] eal/class: add device iteration 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" Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/include/rte_class.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/librte_eal/common/include/rte_class.h b/lib/librte_eal/common/include/rte_class.h index e8176f5e1..9d5b06807 100644 --- a/lib/librte_eal/common/include/rte_class.h +++ b/lib/librte_eal/common/include/rte_class.h @@ -30,6 +30,7 @@ TAILQ_HEAD(rte_class_list, rte_class); struct rte_class { TAILQ_ENTRY(rte_class) next; /**< Next device class in linked list */ const char *name; /**< Name of the class */ + rte_dev_iterate_t dev_iterate; /**< Device iterator. */ }; /** From patchwork Tue Jul 3 22:14:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42180 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A0A3E1BE90; Wed, 4 Jul 2018 00:15:54 +0200 (CEST) Received: from mail-wm0-f53.google.com (mail-wm0-f53.google.com [74.125.82.53]) by dpdk.org (Postfix) with ESMTP id A7EAD1BE7D for ; Wed, 4 Jul 2018 00:15:48 +0200 (CEST) Received: by mail-wm0-f53.google.com with SMTP id p11-v6so3723493wmc.4 for ; Tue, 03 Jul 2018 15:15:48 -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=YSgkLfXIGBP0HLLW+kBNZ/fjgYR4K7+Gu92zfmB4V9Y=; b=dqNJDb+/GyQ0QQ2tQ5V9HDJVmGrQ43RdEL+LapvK0SIvWca1lM8Qp+Z3QZZ4R6E4Mp H7rywxDYqIu5XaaafmSYCyTpqW4XkB4g9mt3gFvyOhDFtcTMN0y5OhepMAtPrktjtM78 sYbSba9oK3do14phaEW7utWCYY/YZXykYUaczLBfA103E7+QHTPgf908H1dFrhw/THQW A7zPjAfGlmalZm//tEtCrLxkId2v6Gwyl/ilvxuSisUhiytMyYS7u0GflvG0QLSXztXj EqkAi2nXZ1cmq0tm6QEyF80F937mrpnftZed+akxe7AFi2oknG4vMwrpl0x/fDNCJfQx TORQ== 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=YSgkLfXIGBP0HLLW+kBNZ/fjgYR4K7+Gu92zfmB4V9Y=; b=OBcaLZU6XdyQd/ai1aUX7/rWplRLiANUa/UN1OfR6+945xgS0Hwkk5RgofnYqrk6Cl fFQfT4PHLXc0yfA6PwauODUEEpeyFVr5f+ii2WsW8nGW3dc273Pfgd+9xe/UeuACeVC2 +VJnl7iZSsky673/a0auGfC3Knh+aZL/ItMMe0nXse+6EK+Yofk1Y5/gSJqgfWq24x2g HK41MkTPtrPVe4/bSJS4lZj5GX3m9+kvCWEWjNpzvjAhOG9wNl9BcdWSUjGLVGg5EXP9 gGvqDVQkRwEQTS2ULo98zSbeEwUmWa6/kHEp2nHFUQxkEcZNdsdwdBr+2pRmp78AHNK2 OvEw== X-Gm-Message-State: APt69E0CBhPWLeHx+ZZpNnlcqA4mx/EvqbiIwdIT0ofdJ6q8QoMPRhFn UNFVnnzxFCesvNAahJG1nWlRUPyB X-Google-Smtp-Source: AAOMgpd7JGuVii5lzACqXYb3nXnwOVTxoQJ7FqdFxMCfzEN5s29tvLlJ/wzVUyrwdqDkxctdb78A/A== X-Received: by 2002:a1c:4c0e:: with SMTP id z14-v6mr9734702wmf.89.1530656147947; Tue, 03 Jul 2018 15:15:47 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:46 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:54 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 11/27] eal/bus: add device iteration 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" Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/include/rte_bus.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h index eb9eded4e..747baf140 100644 --- a/lib/librte_eal/common/include/rte_bus.h +++ b/lib/librte_eal/common/include/rte_bus.h @@ -211,6 +211,7 @@ struct rte_bus { rte_bus_parse_t parse; /**< Parse a device name */ struct rte_bus_conf conf; /**< Bus configuration */ rte_bus_get_iommu_class_t get_iommu_class; /**< Get iommu class */ + rte_dev_iterate_t dev_iterate; /**< Device iterator. */ }; /** From patchwork Tue Jul 3 22:14:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42181 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4BF281BE94; Wed, 4 Jul 2018 00:15:56 +0200 (CEST) Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id 5B4E51BE81 for ; Wed, 4 Jul 2018 00:15:50 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id s14-v6so3756137wmc.1 for ; Tue, 03 Jul 2018 15:15:50 -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=CQP7HwETJDS1+r4uLUc7OtartxXupr/yoyp7uskGZdo=; b=hHUz1zTilsbLTQnCRciUGj5zn2CnKF6LwrSxYfrvOmy07KM0gtSRajeY76zOgSS8RW xfwF6KskTJyptntIMEgobC/fkgFTsV6xWgffsFi0UgUnoi5Ms9M2cZopmtc9lhJ8UZXJ JDMc6LiE6fyJ/XjC/tyqLuRagnVSSFqNHK51IxfdbYN4U+ezanfRAwgkVXKhFqfZyu5I sNtKjn5D8E/aqojRCjYzpUxflL6QPF7wTuuiHX1zg2cwcGS4GDfXCuIpytct7d6lK8GL wSPSMxrunuSdXkTDp08vLQwDxWRnHi6VuYDDhJJi7YL6RDNC+sSSgG6LBPEUhpX2lLTQ 4whw== 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=CQP7HwETJDS1+r4uLUc7OtartxXupr/yoyp7uskGZdo=; b=F9rpkMeUvX+/CkEwBje0UK0nDjLyMfL6GJGST46cXYJex6nTDCT1msa8SvZSIl+1G7 3eQoksKUSrR29Eybbo6NCKSyf2r7Eie8Nr+pUc2K+5iHBtB8a6AbK2WNXBE9a5AsqLP8 W3OkbiIKWJbYZKu5WMajOOsfsUccOLSETiLsw2uVcnZAKC4CSs05WD4BLINmtGLCT54E iappRAHnQCo1iLeif+pSUwuGc+kOW2trKIanLX08cBGjCuWJp28sFp8GDmlXArRtjqjs 9BFaoK/WUqngIOaL5RKCR/eVMXUrydSCM45Bv6AFBwK7ZaUhxqK3BFgzmPS8qL8p/foT xWhw== X-Gm-Message-State: APt69E1KLwdi4tcVkfW5t4Jhk+OwMz9NEIYHMM3v/1Rj9a7k5vjc031u DdbN2CH8uwMpnDPT3LONg8xQzNSY X-Google-Smtp-Source: AAOMgpdXKyMz5n4lZ8IiCCeJe1i0Yaxi5YMVBBmD1MZsW0il6Yh0Qf676r7CZhJfIOf5RQXWccfr4g== X-Received: by 2002:a1c:63d4:: with SMTP id x203-v6mr2078244wmb.9.1530656149604; Tue, 03 Jul 2018 15:15:49 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:48 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:55 +0200 Message-Id: <9e0bdc3acc664e404d19e5358aecdac8b33011cb.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 12/27] eal/dev: implement device iteration initialization 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" Parse a device description. Split this description in their relevant part for each layers. No dynamic allocation is performed. Signed-off-by: Gaetan Rivet --- lib/Makefile | 1 + lib/librte_eal/bsdapp/eal/Makefile | 1 + lib/librte_eal/common/eal_common_dev.c | 55 +++++++++++++++++++++++++++++++++ lib/librte_eal/common/include/rte_dev.h | 24 ++++++++++++++ lib/librte_eal/linuxapp/eal/Makefile | 1 + lib/librte_eal/rte_eal_version.map | 1 + 6 files changed, 83 insertions(+) diff --git a/lib/Makefile b/lib/Makefile index 8a65525cd..afa604e20 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -7,6 +7,7 @@ DIRS-y += librte_compat DIRS-$(CONFIG_RTE_LIBRTE_KVARGS) += librte_kvargs DEPDIRS-librte_kvargs := librte_compat DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal +DEPDIRS-librte_eal := librte_kvargs DIRS-$(CONFIG_RTE_LIBRTE_PCI) += librte_pci DEPDIRS-librte_pci := librte_eal DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile index b0a1c880a..67b10ae0d 100644 --- a/lib/librte_eal/bsdapp/eal/Makefile +++ b/lib/librte_eal/bsdapp/eal/Makefile @@ -18,6 +18,7 @@ CFLAGS += $(WERROR_FLAGS) -O3 LDLIBS += -lexecinfo LDLIBS += -lpthread LDLIBS += -lgcc_s +LDLIBS += -lrte_kvargs EXPORT_MAP := ../../rte_eal_version.map diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index ce4b51469..5b7956d17 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -10,9 +10,12 @@ #include #include +#include #include #include #include +#include +#include #include #include #include @@ -343,3 +346,55 @@ dev_callback_process(char *device_name, enum rte_dev_event_type event) } rte_spinlock_unlock(&dev_event_lock); } + +__rte_experimental +int +rte_dev_iterator_init(struct rte_dev_iterator *it, + const char *devstr) +{ + struct rte_devargs da; + struct rte_class *cls = NULL; + struct rte_bus *bus = NULL; + + /* Having both busstr and clsstr NULL is illegal, + * marking this iterator as invalid unless + * everything goes well. + */ + it->busstr = NULL; + it->clsstr = NULL; + + da.data = devstr; + if (rte_devargs_layers_parse(&da, devstr)) + goto get_out; + + bus = da.bus; + cls = da.cls; + /* The string should have at least + * one layer specified. + */ + if (bus == NULL && cls == NULL) { + RTE_LOG(ERR, EAL, + "Either bus or class must be specified.\n"); + rte_errno = EINVAL; + goto get_out; + } + if (bus != NULL && bus->dev_iterate == NULL) { + RTE_LOG(ERR, EAL, "Bus %s not supported\n", bus->name); + rte_errno = ENOTSUP; + goto get_out; + } + if (cls != NULL && cls->dev_iterate == NULL) { + RTE_LOG(ERR, EAL, "Class %s not supported\n", cls->name); + rte_errno = ENOTSUP; + goto get_out; + } + it->busstr = da.busstr; + it->clsstr = da.clsstr; + it->devstr = devstr; + it->bus = bus; + it->cls = cls; + it->device = NULL; + it->class_device = NULL; +get_out: + return -rte_errno; +} diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index 120df729f..7b7bd83bc 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -332,6 +332,30 @@ typedef void *(*rte_dev_iterate_t)(const void *start, const char *devstr, const struct rte_dev_iterator *it); +/** + * Initializes a device iterator. + * + * This iterator allows accessing a list of devices matching a criteria. + * The device matching is made among all buses and classes currently registered, + * filtered by the device description given as parameter. + * + * This function will not allocate any memory. It is safe to stop the + * iteration at any moment and let the iterator go out of context. + * + * @param it + * Device iterator handle. + * + * @param str + * Device description string. + * + * @return + * 0 on successful initialization. + * <0 on error. + */ +__rte_experimental +int +rte_dev_iterator_init(struct rte_dev_iterator *it, const char *str); + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile index babc8617a..885c48110 100644 --- a/lib/librte_eal/linuxapp/eal/Makefile +++ b/lib/librte_eal/linuxapp/eal/Makefile @@ -27,6 +27,7 @@ LDLIBS += -lrt ifeq ($(CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES),y) LDLIBS += -lnuma endif +LDLIBS += -lrte_kvargs # specific to linuxapp exec-env SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) := eal.c diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 19d36b4c7..ac04120d6 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -251,6 +251,7 @@ EXPERIMENTAL { rte_dev_event_callback_unregister; rte_dev_event_monitor_start; rte_dev_event_monitor_stop; + rte_dev_iterator_init; rte_devargs_add; rte_devargs_dump; rte_devargs_insert; From patchwork Tue Jul 3 22:14:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42182 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 106E71BEA2; Wed, 4 Jul 2018 00:15:59 +0200 (CEST) Received: from mail-wm0-f42.google.com (mail-wm0-f42.google.com [74.125.82.42]) by dpdk.org (Postfix) with ESMTP id 02DE91BE37 for ; Wed, 4 Jul 2018 00:15:51 +0200 (CEST) Received: by mail-wm0-f42.google.com with SMTP id b188-v6so3813770wme.3 for ; Tue, 03 Jul 2018 15:15:51 -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=jiFQq/b0N6qwpPp/G+JTyFUUQLrdWExhtKcMvZahrTY=; b=AjESQ4PoBXkbuh2YnbvbYWt9gbZeehxGondSQiWM36yB52ItAP9vxeNJHD1el3crCk p3XdIeE5a4FLiq99PgSsSplH/a4xJ/MVncjDoAEkh6CzymqBqNtCLalOgNz8VV8oU33z n6LWViFXn9EWt19qAHogjy2u7iCF/iVW4azpcStV0RpHWs7iXnWO4BXZ+/VpiR5xhq5a HlH5SlONTNAuy2huiE3eKEbEhHxYiBTEbZ1UDWWRqr6p5/ZE+rLsTtoGQZ2sDRdk2Q39 DCcUb4mqNJxhGovkpdmo9kUPogouW3dadhGozIYotCL0DUE1jbEzGRMj+eNMCMTDKqve sLSA== 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=jiFQq/b0N6qwpPp/G+JTyFUUQLrdWExhtKcMvZahrTY=; b=MSM7ufnsJvfiU2bQ01plWJtkZ2ZzkFZIrLyFvu2cOR+/UzKUiIjG6T1O9uMMgC71gJ A/RVV3LNx6y2c4wy8vHTuGVgveHqJJwCiWirky0Qs4Mz7OsFQlOwlZ+fe7l33kyDpEI9 WAX7KGcjdJn2ODfSnjHPYrqUwGPhF/GZhpH0CzZscyMR9ngiWtfo0U0lV6lzpMEO81SD Ux6en/MmD+BU5My7VOO0fOvdsbyrguocFCn5nSdtNm30AmTvxq9WWJOqvymsb3f3j3hy /mcd13Mlj1k5GAGcp3k4eU+yQBV3rNa/ka+raH5PtAD370k+5gUGoj0QuHb7L7d4tlUB vPpw== X-Gm-Message-State: APt69E1mwbCymkBQhHs7hBSBf1PgR4e5fZPFbAq7fCibXMI3tQ6T2bvj em+c8TNhZEDPHhFUucS06CHr14dO X-Google-Smtp-Source: AAOMgpckk2wRV59p+mxMgbyeNkGK5N/Af6/YLQo2JBiPprjwP7mui3OQ64t++z5GVy2Vfsrr+ZnMyQ== X-Received: by 2002:a1c:a484:: with SMTP id n126-v6mr12769864wme.140.1530656151254; Tue, 03 Jul 2018 15:15:51 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:50 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:56 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 13/27] eal/dev: implement device iteration 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" Use the iteration hooks in the abstraction layers to perform the requested filtering on the internal device lists. Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/eal_common_dev.c | 168 ++++++++++++++++++++++++++++++++ lib/librte_eal/common/include/rte_dev.h | 26 +++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 195 insertions(+) diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 5b7956d17..3d486a841 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -45,6 +45,28 @@ static struct dev_event_cb_list dev_event_cbs; /* spinlock for device callbacks */ static rte_spinlock_t dev_event_lock = RTE_SPINLOCK_INITIALIZER; +struct dev_next_ctx { + struct rte_dev_iterator *it; + const char *busstr; + const char *clsstr; +}; + +#define CTX(it, busstr, clsstr) \ + (&(const struct dev_next_ctx){ \ + .it = it, \ + .busstr = busstr, \ + .clsstr = clsstr, \ + }) + +#define ITCTX(ptr) \ + (((struct dev_next_ctx *)(intptr_t)ptr)->it) + +#define BUSCTX(ptr) \ + (((struct dev_next_ctx *)(intptr_t)ptr)->busstr) + +#define CLSCTX(ptr) \ + (((struct dev_next_ctx *)(intptr_t)ptr)->clsstr) + static int cmp_detached_dev_name(const struct rte_device *dev, const void *_name) { @@ -398,3 +420,149 @@ rte_dev_iterator_init(struct rte_dev_iterator *it, get_out: return -rte_errno; } + +static char * +dev_str_sane_copy(const char *str) +{ + size_t end; + char *copy; + + end = strcspn(str, ",/"); + if (str[end] == ',') { + copy = strdup(&str[end + 1]); + } else { + /* '/' or '\0' */ + copy = strdup(""); + } + if (copy == NULL) { + rte_errno = ENOMEM; + } else { + char *slash; + + slash = strchr(copy, '/'); + if (slash != NULL) + slash[0] = '\0'; + } + return copy; +} + +static int +class_next_dev_cmp(const struct rte_class *cls, + const void *ctx) +{ + struct rte_dev_iterator *it; + const char *clsstr = NULL; + void *dev; + + if (cls->dev_iterate == NULL) + return 1; + it = ITCTX(ctx); + clsstr = CLSCTX(ctx); + dev = it->class_device; + /* it->clsstr != NULL means a class + * was specified in the devstr. + */ + if (it->clsstr != NULL && cls != it->cls) + return 1; + /* If an error occurred previously, + * no need to test further. + */ + if (rte_errno != 0) + return -1; + dev = cls->dev_iterate(dev, clsstr, it); + it->class_device = dev; + return dev == NULL; +} + +static int +bus_next_dev_cmp(const struct rte_bus *bus, + const void *ctx) +{ + struct rte_device *dev = NULL; + struct rte_class *cls = NULL; + struct rte_dev_iterator *it; + const char *busstr = NULL; + + if (bus->dev_iterate == NULL) + return 1; + it = ITCTX(ctx); + busstr = BUSCTX(ctx); + dev = it->device; + /* it->busstr != NULL means a bus + * was specified in the devstr. + */ + if (it->busstr != NULL && bus != it->bus) + return 1; + /* If an error occurred previously, + * no need to test further. + */ + if (rte_errno != 0) + return -1; + if (it->clsstr == NULL) { + dev = bus->dev_iterate(dev, busstr, it); + goto end; + } + /* clsstr != NULL */ + if (dev == NULL) { +next_dev_on_bus: + dev = bus->dev_iterate(dev, busstr, it); + it->device = dev; + } + if (dev == NULL) + return 1; + if (it->cls != NULL) + cls = TAILQ_PREV(it->cls, rte_class_list, next); + cls = rte_class_find(cls, class_next_dev_cmp, ctx); + if (cls != NULL) { + it->cls = cls; + goto end; + } + goto next_dev_on_bus; +end: + it->device = dev; + return dev == NULL; +} +__rte_experimental +struct rte_device * +rte_dev_iterator_next(struct rte_dev_iterator *it) +{ + struct rte_bus *bus = NULL; + int old_errno = rte_errno; + char *busstr = NULL; + char *clsstr = NULL; + + rte_errno = 0; + if (it->busstr == NULL && it->clsstr == NULL) { + /* Invalid iterator. */ + rte_errno = EINVAL; + return NULL; + } + if (it->bus != NULL) + bus = TAILQ_PREV(it->bus, rte_bus_list, next); + if (it->busstr != NULL) { + busstr = dev_str_sane_copy(it->busstr); + if (busstr == NULL) + goto out; + } + if (it->clsstr != NULL) { + clsstr = dev_str_sane_copy(it->clsstr); + if (clsstr == NULL) + goto out; + } + while ((bus = rte_bus_find(bus, bus_next_dev_cmp, + CTX(it, busstr, clsstr)))) { + if (it->device != NULL) { + it->bus = bus; + goto out; + } + if (it->busstr != NULL || + rte_errno != 0) + break; + } + if (rte_errno == 0) + rte_errno = old_errno; +out: + free(busstr); + free(clsstr); + return it->device; +} diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index 7b7bd83bc..1553c0970 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -356,6 +356,32 @@ __rte_experimental int rte_dev_iterator_init(struct rte_dev_iterator *it, const char *str); +/** + * Iterates on a device iterator. + * + * Generates a new rte_device handle corresponding to the next element + * in the list described in comprehension by the iterator. + * + * The next object is returned, and the iterator is updated. + * + * @param it + * Device iterator handle. + * + * @return + * An rte_device handle if found. + * NULL if an error occurred (rte_errno is set). + * NULL if no device could be found (rte_errno is not set). + */ +__rte_experimental +struct rte_device * +rte_dev_iterator_next(struct rte_dev_iterator *it); + +#define RTE_DEV_FOREACH(dev, devstr, it) \ + for (rte_dev_iterator_init(it, devstr), \ + dev = rte_dev_iterator_next(it); \ + dev != NULL; \ + dev = rte_dev_iterator_next(it)) + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index ac04120d6..4cd5ab3df 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -252,6 +252,7 @@ EXPERIMENTAL { rte_dev_event_monitor_start; rte_dev_event_monitor_stop; rte_dev_iterator_init; + rte_dev_iterator_next; rte_devargs_add; rte_devargs_dump; rte_devargs_insert; From patchwork Tue Jul 3 22:14:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42183 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CB0CE1BEAA; Wed, 4 Jul 2018 00:16:00 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 3A3111BE8A for ; Wed, 4 Jul 2018 00:15:53 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id f16-v6so3389823wrm.3 for ; Tue, 03 Jul 2018 15:15:53 -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=jGyq3YX/SpzlLJhCRUQjjB5lz8oMEzUUbU6w4qfpCyY=; b=hhplUCRLut3htZGNt8+wwv++IPsFxCSt16owVaVQpddyntwxeht3izSc2iteTNDw72 040sCvCfJ/Sv3N7dWbrE/QHvKrvMEvsRP00LpvMPqR2M/QD8IDB9ibmAKtqNJtCSgx/Y MHByeltflWjWD/CNgHoe+KqiY6wZFN1t8sClFwmWP+mtMzte0w5EZJSKGmHS/3UDXQxV KZz/IOY7s5L0p2TtVqfJtcq6wqnSifAZGu2UwxqJVUJvhgcpcHPWBkxAlSvVYw8ijP5l g4XNTiPOFRjh6JEWzrIUiarg5Y0YSAuAHJt4MSEIClNZoag+IZ1lnCOAV/sHBPATLYz8 zv8g== 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=jGyq3YX/SpzlLJhCRUQjjB5lz8oMEzUUbU6w4qfpCyY=; b=UNOW72dNruM0QMzMyLrqqaDIkLWgOJDG69/JFtB1Qi+AK59XDrt2lmoiozSM+z1MYI zM2X7KNN876cGOkG3KJm8nWXsT2Cid/rLHpQZolQsKU3am7+ZG5c/Qbij/9T8cSXZ+0r nNWlZJFvOH38qaJdZ6OyAYrooxh1tRT7no8IX9MXX7MHmi9vT8sytDfylX1qkRVL32bE foC5+COTfyslUqZx3aSvRCGeOnPIvfRBtYTBuvYZp43zcBrYQBJWZSb5OUIcfGSlZvl/ D2LNMMy9lARz51u7MfRXmDT0p/pigVDSoYPKrH7LYPBNGS2C60oJErzCXld2QHam9aKI 8t3g== X-Gm-Message-State: APt69E3j9egjUgtokkMAUtOsnGpXFlNky8kQTBOlFTUpWCFDPRA0mkFT EYWleJ/J6zR+dwWhQIMRxgTFTQ5g X-Google-Smtp-Source: AAOMgpeqifw12A3F8S8VZGvqEPVV09FwSFPFZrGepjHipEGIgNS3RRK1LZIE0ogmrlNEOJ6wUnDL9g== X-Received: by 2002:adf:ff49:: with SMTP id u9-v6mr6777255wrs.15.1530656152526; Tue, 03 Jul 2018 15:15:52 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:51 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:57 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 14/27] kvargs: add generic string matching callback 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" This function can be used as a callback to rte_kvargs_process. This should reduce code duplication. Signed-off-by: Gaetan Rivet --- lib/librte_kvargs/rte_kvargs.c | 10 ++++++++++ lib/librte_kvargs/rte_kvargs.h | 28 ++++++++++++++++++++++++++++ lib/librte_kvargs/rte_kvargs_version.map | 1 + 3 files changed, 39 insertions(+) diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index 519f77679..8270d2939 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -193,3 +193,13 @@ rte_kvargs_parse2(const char *args, const char * const valid_keys[], free(copy); return kvlist; } + +__rte_experimental +int +rte_kvargs_strcmp(const char *key __rte_unused, + const char *value, void *opaque) +{ + const char *str = opaque; + + return -abs(strcmp(str, value)); +} diff --git a/lib/librte_kvargs/rte_kvargs.h b/lib/librte_kvargs/rte_kvargs.h index 98c4ed1bf..ac2999ef3 100644 --- a/lib/librte_kvargs/rte_kvargs.h +++ b/lib/librte_kvargs/rte_kvargs.h @@ -25,6 +25,8 @@ extern "C" { #endif +#include + /** Maximum number of key/value associations */ #define RTE_KVARGS_MAX 32 @@ -151,6 +153,32 @@ int rte_kvargs_process(const struct rte_kvargs *kvlist, unsigned rte_kvargs_count(const struct rte_kvargs *kvlist, const char *key_match); +/** + * Generic kvarg handler for string comparison. + * + * This function can be used for a generic string comparison processing + * on a list of kvargs. + * + * @param key + * kvarg pair key. + * + * @param value + * kvarg pair value. + * + * @param opaque + * Opaque pointer to a string. + * + * @return + * 0 if the strings match. + * !0 otherwise or on error. + * + * Unless strcmp, comparison ordering is not kept. + * In order for rte_kvargs_process to stop processing on match error, + * a negative value is returned even if strcmp had returned a positive one. + */ +__rte_experimental +int rte_kvargs_strcmp(const char *key, const char *value, void *opaque); + #ifdef __cplusplus } #endif diff --git a/lib/librte_kvargs/rte_kvargs_version.map b/lib/librte_kvargs/rte_kvargs_version.map index b9fe44b98..6a41a6b65 100644 --- a/lib/librte_kvargs/rte_kvargs_version.map +++ b/lib/librte_kvargs/rte_kvargs_version.map @@ -13,5 +13,6 @@ EXPERIMENTAL { global: rte_kvargs_parse2; + rte_kvargs_strcmp; } DPDK_2.0; From patchwork Tue Jul 3 22:14:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42184 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 544581BEAD; Wed, 4 Jul 2018 00:16:02 +0200 (CEST) Received: from mail-wr0-f194.google.com (mail-wr0-f194.google.com [209.85.128.194]) by dpdk.org (Postfix) with ESMTP id 8D9A91BE8E for ; Wed, 4 Jul 2018 00:15:54 +0200 (CEST) Received: by mail-wr0-f194.google.com with SMTP id r16-v6so252094wrt.11 for ; Tue, 03 Jul 2018 15:15:54 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=ZA0pz5764HLLjXKe1GWiXzpsCYylgzuh/27TrMnFKsw=; b=bunU5yNN1kzNZHL/aDGyyWRCgIycvnKLmL1RIbSzSQB1oRoXUBcojId2aHswbvMW5m ad/5kjdha0SZdDicaNp/hN3Tuvhl4lOHwMF3yQJc77sVbIHtSCSo4WEM+7Ly7jVB8EDF p7FU8XswewjgDgKqzcn1XgQn8mP8Lx4MigSRakVrqZY/BUx2tu8NArKSZqlZgMXpAvNH SxL9w3LU89tY5rZFieAZme7yisunJpByqKe63LWoB6DbaQScTGDcZFGfA509IlLKj4Jl hVwLDzmLjMkLsEjq3ciX9jB6wwgejLF9jAnDTSJJxgEi4Qhi2PLWsksSHxYZb4ChZL9o zNCw== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=ZA0pz5764HLLjXKe1GWiXzpsCYylgzuh/27TrMnFKsw=; b=P6efIvtjf8MF2V07vKajuBFHVbHATkRSu3cGEG/M5qgM1MvlQfhYK+Y6cW/Sg0dSwd +009/CUW579LdX+q8vWWOp+bxecGI6FlC9xK6DjfPhYuZbZjPOn970I//duUHvTLaojw spEUPjHAQ+7cW2zsldeurgqZZCXPx1cQHGcoJmwTbihNB1/cRlLSSA0X74wSjcV7WQFU Y3q06FSt40huu66cEiPNrzQNmfgB16ZP5AkTjt81swInUkZvUR2iMLGl9qFr7bfII6pl XLavu6MUVXuXHb1vR1fyJkHPJGsQBBgCEcKm+lvn5slFzyS98VGQOAddBOI+E1OstYUH kkvw== X-Gm-Message-State: APt69E32Lpct/NS6+qWec4XVtz6xykz+O3JNTOho/qRIYLID54TQNY9z vFK9RH8k6Sbse6K8os4wnQJy+D3o X-Google-Smtp-Source: AAOMgpeW/IKVwBp3wlFffWTVwDh5HZn/mvfgVWMdnWfM0Sp/vBvOIF4joQQS444Ic0zdCHPRt7oyMg== X-Received: by 2002:adf:f086:: with SMTP id n6-v6mr13303955wro.49.1530656153948; Tue, 03 Jul 2018 15:15:53 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:53 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:58 +0200 Message-Id: <538a47f24ec47d61b58a3b8c686b209946b1e483.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 15/27] bus/pci: implement device iteration and comparison 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" Signed-off-by: Gaetan Rivet --- drivers/bus/pci/Makefile | 3 ++- drivers/bus/pci/pci_common.c | 1 + drivers/bus/pci/pci_params.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ drivers/bus/pci/private.h | 25 +++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 drivers/bus/pci/pci_params.c diff --git a/drivers/bus/pci/Makefile b/drivers/bus/pci/Makefile index cf373068a..4de953f8f 100644 --- a/drivers/bus/pci/Makefile +++ b/drivers/bus/pci/Makefile @@ -26,10 +26,11 @@ CFLAGS += -I$(RTE_SDK)/lib/librte_eal/$(SYSTEM)app/eal CFLAGS += -DALLOW_EXPERIMENTAL_API LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring -LDLIBS += -lrte_ethdev -lrte_pci +LDLIBS += -lrte_ethdev -lrte_pci -lrte_kvargs include $(RTE_SDK)/drivers/bus/pci/$(SYSTEM)/Makefile SRCS-$(CONFIG_RTE_LIBRTE_PCI_BUS) := $(addprefix $(SYSTEM)/,$(SRCS)) +SRCS-$(CONFIG_RTE_LIBRTE_PCI_BUS) += pci_params.c SRCS-$(CONFIG_RTE_LIBRTE_PCI_BUS) += pci_common.c SRCS-$(CONFIG_RTE_LIBRTE_PCI_BUS) += pci_common_uio.c diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 94b0f4143..749b6eee3 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -437,6 +437,7 @@ struct rte_pci_bus rte_pci_bus = { .unplug = pci_unplug, .parse = pci_parse, .get_iommu_class = rte_pci_get_iommu_class, + .dev_iterate = rte_pci_dev_iterate, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list), .driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list), diff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c new file mode 100644 index 000000000..0fde75803 --- /dev/null +++ b/drivers/bus/pci/pci_params.c @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 Gaëtan Rivet + */ + +#include +#include +#include +#include +#include + +#include "private.h" + +enum pci_params { + RTE_PCI_PARAMS_MAX, +}; + +static const char * const pci_params_keys[] = { + [RTE_PCI_PARAMS_MAX] = NULL, +}; + +static int +pci_dev_match(const struct rte_device *dev, + const void *_kvlist) +{ + const struct rte_kvargs *kvlist = _kvlist; + + (void) dev; + (void) kvlist; + return 0; +} + +void * +rte_pci_dev_iterate(const void *start, + const char *str, + const struct rte_dev_iterator *it __rte_unused) +{ + rte_bus_find_device_t find_device; + struct rte_kvargs *kvargs = NULL; + struct rte_device *dev; + + if (str != NULL) { + kvargs = rte_kvargs_parse(str, pci_params_keys); + if (kvargs == NULL) { + RTE_LOG(ERR, EAL, "cannot parse argument list\n"); + rte_errno = EINVAL; + return NULL; + } + } + find_device = rte_pci_bus.bus.find_device; + dev = find_device(start, pci_dev_match, kvargs); + rte_kvargs_free(kvargs); + return dev; +} diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index 8ddd03e16..0e689fa74 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -10,6 +10,8 @@ #include #include +extern struct rte_pci_bus rte_pci_bus; + struct rte_pci_driver; struct rte_pci_device; @@ -166,4 +168,27 @@ rte_pci_match(const struct rte_pci_driver *pci_drv, enum rte_iova_mode rte_pci_get_iommu_class(void); +/* + * Iterate over internal devices, + * matching any device against the provided + * string. + * + * @param start + * Iteration starting point. + * + * @param str + * Device string to match against. + * + * @param it + * (unused) iterator structure. + * + * @return + * A pointer to the next matching device if any. + * NULL otherwise. + */ +void * +rte_pci_dev_iterate(const void *start, + const char *str, + const struct rte_dev_iterator *it); + #endif /* _PCI_PRIVATE_H_ */ From patchwork Tue Jul 3 22:14:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42185 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0E7511BEB2; Wed, 4 Jul 2018 00:16:04 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 0B9A91BE8E for ; Wed, 4 Jul 2018 00:15:56 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id f16-v6so3389884wrm.3 for ; Tue, 03 Jul 2018 15:15:56 -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=GDAM0+BY9zdzKzqAvSmkL7Cyo+VOwFhWZYWz8JjTZ8Y=; b=J81o7hGl3KRGSLMCzyMnwtq11DbCzdK0gHKcRjgQLxzY3xxi+3iZkr71O/9MxjDObM cGo0uy9ftc1RtW6g94OrEUNqIKrWKOEHbFOmao/TQWpczlsywopEiF72E9ZmAbvJn1AM SMMcSQNUTeeE59Xb9oSOWFdUrlKQr3CzaM3vSzD4WY0EorCnQ/lhFVN4YsKKWFl+2NCy U0jVMmz+HCsCl+jq8c7M9HXrTZqG7RwLLVAv+qVAIAEhrtR7RIYpZ3NjKEFMuGXt7pCe gSzLoMPETJCY9I5CYDTQEWWkAQYdpn1MMyLi5ZtRfZ1p7cUYa2p9pitRH9fcHHdgslL6 n/QA== 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=GDAM0+BY9zdzKzqAvSmkL7Cyo+VOwFhWZYWz8JjTZ8Y=; b=NzilLaMdPncBspxR7Udx0bzjOl0Nrl+tN266eYPFmA2/2zhQloj+8ZjFUB4xGGCM6B kFTUUj+DgLsID97v3kIJP79d7T4HY+eLsSkwzhUiZikDpQf7kQPN5wuxyKLJGLbLO3T7 tppUAPjtpMeQC6Ke5LnFTKzgVIGqyY/LUHyI3L+BwoJnXCKX+U+eX3IaUENuA6WIONrK 8cYWQFmjUA7i+kQ8/0feFjIAuEA0I7g+Gaq0SRASUVwJkj2NO2iv8o+HrndSK/UsKKPb 9uKnb/PIuGx42aCoOsbXqOGLvT/y7TnSx3QKsccFY35ZmjNJHvgwpexyKrme/Kx+QTeA 9SQw== X-Gm-Message-State: APt69E2cCrZWppZHuG8APf/W/x3TUfbQz5FIVAEsym69V1Y0K2EevEsl 5TpscCxhBeaVlIsTka7GRVXJuT4J X-Google-Smtp-Source: AAOMgpezoRpdPiadokZcA54FqAkgXPcyF3MeFmGLbafHjG0jrGw53jXXZ8b20RF0pcMnFSzKM67+pw== X-Received: by 2002:adf:a211:: with SMTP id p17-v6mr2709737wra.196.1530656155414; Tue, 03 Jul 2018 15:15:55 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:54 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:14:59 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 16/27] bus/pci: add device matching field id 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" The PCI bus can now parse a matching field "id" as follows: "bus=pci,id=0000:00:00.0" or "bus=pci,id=00:00.0" Signed-off-by: Gaetan Rivet --- drivers/bus/pci/pci_params.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c index 0fde75803..7630d4845 100644 --- a/drivers/bus/pci/pci_params.c +++ b/drivers/bus/pci/pci_params.c @@ -3,6 +3,7 @@ */ #include +#include #include #include #include @@ -11,21 +12,45 @@ #include "private.h" enum pci_params { + RTE_PCI_PARAMS_ID, RTE_PCI_PARAMS_MAX, }; static const char * const pci_params_keys[] = { + [RTE_PCI_PARAMS_ID] = "id", [RTE_PCI_PARAMS_MAX] = NULL, }; static int +pci_addr_kv_cmp(const char *key __rte_unused, + const char *value, + void *_addr2) +{ + struct rte_pci_addr _addr1; + struct rte_pci_addr *addr1 = &_addr1; + struct rte_pci_addr *addr2 = _addr2; + + if (rte_pci_addr_parse(value, addr1)) + return -1; + return -abs(rte_pci_addr_cmp(addr1, addr2)); +} + +static int pci_dev_match(const struct rte_device *dev, const void *_kvlist) { const struct rte_kvargs *kvlist = _kvlist; + const struct rte_pci_device *pdev; - (void) dev; - (void) kvlist; + if (kvlist == NULL) + /* Empty string matches everything. */ + return 0; + pdev = RTE_DEV_TO_PCI_CONST(dev); + /* if any field does not match. */ + if (rte_kvargs_process(kvlist, "id", + &pci_addr_kv_cmp, + (void *)(intptr_t)&pdev->addr)) + return 1; return 0; } From patchwork Tue Jul 3 22:15:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42186 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 75F951BEB8; Wed, 4 Jul 2018 00:16:05 +0200 (CEST) Received: from mail-wr0-f195.google.com (mail-wr0-f195.google.com [209.85.128.195]) by dpdk.org (Postfix) with ESMTP id E1BD61BE8E for ; Wed, 4 Jul 2018 00:15:57 +0200 (CEST) Received: by mail-wr0-f195.google.com with SMTP id q10-v6so3380185wrd.4 for ; Tue, 03 Jul 2018 15:15:57 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=6zLB/7Lvj/weV9uPcrzjEA180HzB3jVsaOXY8Z/yJZQ=; b=yqMFh/aDPqezTy7mTVZqycXz30Zuogzq904IiNC/i9yle7uE/eRdjY+fqw33s/O3wi Zlt+p3qzHW0Wo60OG16awDa0+t5Lca6gYTDvJayoiGIjE5b7K0OX1TQXGO7ZF5phTeJk 1EWGNIvvoxeW9qT0eh0/lFRM6HxFIXib2m/aexJzaYJLnMlRl3KoqFyhbIwojOjMYM5I TZCcZEkmB6qktzSOo6IWCMjs1Z+/N2GlNok+4GXG778wBjcDX3fuVrnr2NYnL6Ue5P6S d6L5PhNa+XMSaWo3av0T2Hd+i1vQAtd6XQJD5D9C+POtxNuWQ2YAoouUuNWRfgb88yoj pOjQ== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=6zLB/7Lvj/weV9uPcrzjEA180HzB3jVsaOXY8Z/yJZQ=; b=XFN4vbPdQx5kTNjrw85kjIn4CkozAIz/WG0uj+CmJOvOhkiMR0V+3to88Knfd/9/Sd ZGhZYiK51J8k3TyGabuPMGCJoc2r9FSFxW2UcEmmss/DzoXJ3w0IMQlLHrsIFM1FanJZ 7G6jJi5Ik+jGPfYCXghWJ18BiLPPnsir1wYmN7zwWbDe5f9ToXl+G7Ltw7cp/jfjnSiL d0swsq9Pba0bsVNC28rC2cE8M2zdRHtWS3cmy+CUyU2/M6+14bz/XZVXe+WP5TJjqqpE SdTCM5JTJRHug70oco+fiSpW+Nz8gJotFWGkMHrQE77GQJlyrNgfGet+yxYskdmrsAm2 pGJw== X-Gm-Message-State: APt69E3lQ3IUxD9I58gMYXwKavd/MLuJlnVmC+Qdu8B2SJ6EVTGsopTR oOsXVsPjB443g94agO2wOFahQ9f6 X-Google-Smtp-Source: AAOMgpelfcOULdEmBCtZLZ6NmPOoFUnY+nErJsBiD5mXE4I/1uA33InlyWKMiaarDmzXyHQ24uVLOg== X-Received: by 2002:adf:8e89:: with SMTP id q9-v6mr22328296wrb.261.1530656157184; Tue, 03 Jul 2018 15:15:57 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:55 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:00 +0200 Message-Id: <3667a6b1e86515385b245e6dfe9d919aadaa3309.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 17/27] bus/vdev: implement device iteration 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" Signed-off-by: Gaetan Rivet --- drivers/bus/vdev/Makefile | 3 ++- drivers/bus/vdev/vdev.c | 10 ++++---- drivers/bus/vdev/vdev_params.c | 51 +++++++++++++++++++++++++++++++++++++++++ drivers/bus/vdev/vdev_private.h | 26 +++++++++++++++++++++ 4 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 drivers/bus/vdev/vdev_params.c create mode 100644 drivers/bus/vdev/vdev_private.h diff --git a/drivers/bus/vdev/Makefile b/drivers/bus/vdev/Makefile index bd0bb8955..1f9cd7ebe 100644 --- a/drivers/bus/vdev/Makefile +++ b/drivers/bus/vdev/Makefile @@ -19,8 +19,9 @@ EXPORT_MAP := rte_bus_vdev_version.map LIBABIVER := 1 SRCS-y += vdev.c +SRCS-y += vdev_params.c -LDLIBS += -lrte_eal +LDLIBS += -lrte_eal -lrte_kvargs # # Export include files diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index 6139dd551..e8518833d 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -23,6 +23,7 @@ #include "rte_bus_vdev.h" #include "vdev_logs.h" +#include "vdev_private.h" #define VDEV_MP_KEY "bus_vdev_mp" @@ -493,9 +494,9 @@ vdev_probe(void) return ret; } -static struct rte_device * -vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, - const void *data) +struct rte_device * +rte_vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, + const void *data) { const struct rte_vdev_device *vstart; struct rte_vdev_device *dev; @@ -532,10 +533,11 @@ vdev_unplug(struct rte_device *dev) static struct rte_bus rte_vdev_bus = { .scan = vdev_scan, .probe = vdev_probe, - .find_device = vdev_find_device, + .find_device = rte_vdev_find_device, .plug = vdev_plug, .unplug = vdev_unplug, .parse = vdev_parse, + .dev_iterate = rte_vdev_dev_iterate, }; RTE_REGISTER_BUS(vdev, rte_vdev_bus); diff --git a/drivers/bus/vdev/vdev_params.c b/drivers/bus/vdev/vdev_params.c new file mode 100644 index 000000000..842a4684e --- /dev/null +++ b/drivers/bus/vdev/vdev_params.c @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 Gaëtan Rivet + */ + +#include +#include +#include +#include + +#include "vdev_logs.h" +#include "vdev_private.h" + +enum vdev_params { + RTE_VDEV_PARAMS_MAX, +}; + +static const char * const vdev_params_keys[] = { + [RTE_VDEV_PARAMS_MAX] = NULL, +}; + +static int +vdev_dev_match(const struct rte_device *dev, + const void *_kvlist) +{ + const struct rte_kvargs *kvlist = _kvlist; + + (void) kvlist; + (void) dev; + return 0; +} + +void * +rte_vdev_dev_iterate(const void *start, + const char *str, + const struct rte_dev_iterator *it __rte_unused) +{ + struct rte_kvargs *kvargs = NULL; + struct rte_device *dev; + + if (str != NULL) { + kvargs = rte_kvargs_parse(str, vdev_params_keys); + if (kvargs == NULL) { + VDEV_LOG(ERR, "cannot parse argument list\n"); + rte_errno = EINVAL; + return NULL; + } + } + dev = rte_vdev_find_device(start, vdev_dev_match, kvargs); + rte_kvargs_free(kvargs); + return dev; +} diff --git a/drivers/bus/vdev/vdev_private.h b/drivers/bus/vdev/vdev_private.h new file mode 100644 index 000000000..ba6dc48ff --- /dev/null +++ b/drivers/bus/vdev/vdev_private.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2018 Gaëtan Rivet + */ + +#ifndef _VDEV_PRIVATE_H_ +#define _VDEV_PRIVATE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct rte_device * +rte_vdev_find_device(const struct rte_device *start, + rte_dev_cmp_t cmp, + const void *data); + +void * +rte_vdev_dev_iterate(const void *start, + const char *str, + const struct rte_dev_iterator *it); + +#ifdef __cplusplus +} +#endif + +#endif /* _VDEV_PRIVATE_H_ */ From patchwork Tue Jul 3 22:15:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42187 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E27B31BEBF; Wed, 4 Jul 2018 00:16:06 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 1B6A71BEA3 for ; Wed, 4 Jul 2018 00:15:59 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id t6-v6so3388244wrn.7 for ; Tue, 03 Jul 2018 15:15:59 -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=asEL7KDRrDSON5+PzJnFF6wFSrQ+kM9WHbufKyn5N6Q=; b=rCq690lVXajXY64YXDfa5z7TYQfMSzzlSfBwRBhpyRVIaf5ctd8muW2k1H9Rsf/6A/ ySSsZEyvFx/zIsxUIHjfld7PEcdmwIe3jpATS2fVwgJUuZwXeEtP30MNf766pkQ9NUQS 93uTkHNhVn+2VN9d2WjRVfOUVfWLFtD32MhuJmv7frYVbbVibrVEQqllU7s1+2pnRN7N 9fBib6Yq/Xzz/fQXz0SSObCbUhmcjJrPYzud3RB3RohvlbxbpJRjoMuydqLIb88tyL/P aXeLp4nLIbNFoq98aax0cqSjorKl6CIrhaup32qXbJFXX2Oxcn2+RXrjhww8MIbMVCiH 2fqg== 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=asEL7KDRrDSON5+PzJnFF6wFSrQ+kM9WHbufKyn5N6Q=; b=Yt7etfgRKDowxbBGDYC05Gk3sjAMpUlcuSWgK69grbtJkL/XiqsxYXkY0pvoTeO6PP LYnqplsCyZ0qLH4T84vBTDWvSTHIk6RYx9/QHJl3uyH9rGFmb5PQxEJj+V+iPmCkbQNj zZg498Wm9dYluLiVGWcuEzvpIbnO+63mm287DbbXpGNTAqK3FSTlB8qcdS74A8XTFiT9 1ICWyBsGTUhHhUb84Jo1xof4v5eefO8cqDtvQQOKz6D6ttGw+H06o83SwTG+uFQINMUZ QYCyFPqSxMNzI1ZoQ+7D+glZOUww2wOid0wnBZrXbbHzwssvhMNeavxlsiPy56J6L898 Ow4Q== X-Gm-Message-State: APt69E0zQlXbf/RqU6ENirXHw3CUI+7qPYfaRD2//7buzpnsm/oFEoKe Of0JEjcGFm9MKu6uw46GZ4Izmz1h X-Google-Smtp-Source: AAOMgpdVV6oZrGYMkrjQNMpnhBw/YTygnQ9Z5vBgal+vaX0xsLKn2XRDZm8v+jXPPVYstI+d/XJ2wQ== X-Received: by 2002:a5d:4e49:: with SMTP id r9-v6mr22765894wrt.27.1530656158518; Tue, 03 Jul 2018 15:15:58 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:57 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:01 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 18/27] bus/vdev: add device matching field driver 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" The vdev bus parses a field "driver", matching a vdev driver name with one passed as follows: "bus=vdev,driver=xxxx" Signed-off-by: Gaetan Rivet --- drivers/bus/vdev/vdev_params.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/bus/vdev/vdev_params.c b/drivers/bus/vdev/vdev_params.c index 842a4684e..2f55f451f 100644 --- a/drivers/bus/vdev/vdev_params.c +++ b/drivers/bus/vdev/vdev_params.c @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -11,10 +12,12 @@ #include "vdev_private.h" enum vdev_params { + RTE_VDEV_PARAMS_DRIVER, RTE_VDEV_PARAMS_MAX, }; static const char * const vdev_params_keys[] = { + [RTE_VDEV_PARAMS_DRIVER] = "driver", [RTE_VDEV_PARAMS_MAX] = NULL, }; @@ -23,9 +26,17 @@ vdev_dev_match(const struct rte_device *dev, const void *_kvlist) { const struct rte_kvargs *kvlist = _kvlist; + const struct rte_vdev_device *vdev; - (void) kvlist; - (void) dev; + if (kvlist == NULL) + /* Empty string matches everything. */ + return 0; + vdev = RTE_DEV_TO_VDEV_CONST(dev); + /* if any field does not match. */ + if (rte_kvargs_process(kvlist, "driver", + rte_kvargs_strcmp, + (void *)(intptr_t)vdev->device.driver->name)) + return -1; return 0; } From patchwork Tue Jul 3 22:15:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42188 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 445021BEC8; Wed, 4 Jul 2018 00:16:09 +0200 (CEST) Received: from mail-wm0-f41.google.com (mail-wm0-f41.google.com [74.125.82.41]) by dpdk.org (Postfix) with ESMTP id 90AB81BE9F for ; Wed, 4 Jul 2018 00:16:00 +0200 (CEST) Received: by mail-wm0-f41.google.com with SMTP id l15-v6so11492794wmc.1 for ; Tue, 03 Jul 2018 15:16:00 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=lUsn9elOsx36tiyiVi1gKRkyWM8pEbQruUHMhEz7E2Q=; b=xMHNw3jNlt+nyA6bmlwUSA5cxc3A+HURu4vQXi8Pq6gqUESOhPhubGCWdsXsE2GHfi YTzqQqN6aLYmILYB3kNkHmJDRMvOGHSDMiItXU9qZwwmKd4XgEV6zLAbwmkPql3wkl6a HYBGlUGDxiiDJ/YPCc5te9KpxUO8Vsxq0OC64mg3VXCXyqU2f7GWrhnQrpU34znOaqWB LGeUi5LXtvr8KarUEB2uJlM6YWJVzlZ6uiHp+GAVgs08/C67WQX/8xyfQU2paWNBtvzQ In41mV0onXXINc47qD8Z/8aX0OMhNqdOQbDlvl26FBoH20D+EiXvEiuYvALE9ZycJySE C2WQ== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=lUsn9elOsx36tiyiVi1gKRkyWM8pEbQruUHMhEz7E2Q=; b=RkxK0P81gn00pJYwffAgf7ETpjpbmyRo8+QUeijCIMiqzdhZPVdRBoL/FtcPCV0Ihh oa9zAw9udVtWxN/7FCFuYDfTd0pqNoq6uMQWjAo8qwW4rVc/nd1n92ioUIUo06gg5s2M PiVEPxYykKSJ+D1seNWgp+WLAEnkghxWZrXPwEq4XGymtOXGB2XlcDCDtzqVNUI+GtFd rSQAPqDOlgPQVuW2U7KpK5fVHgbOxMQ50XlYoeEj1GDCyuR2nLaa7DERz47sXLSxgQiZ +pw87rqUy47VVa2KFUFyZ4SEc1MOIVScx4f1XiIhhcU8pxnVpcbmY6RHREFo2p+1DVDS SmVQ== X-Gm-Message-State: APt69E3/VimVlN1FVjcSLI+LJK/JT5Fq+HxgI3FRspVAnBgV4yhbV7Ow ccfRikqLHSOHAlq+7Z9T/YW5b8Vn X-Google-Smtp-Source: AAOMgpcCaI9elRstVnkCTXMXxL6RIol6WF6qCp5nbCw+qa2wEHDPPkbCfvwdb6kMJh1OzruZsSJDww== X-Received: by 2002:a1c:928c:: with SMTP id u134-v6mr11610496wmd.106.1530656159901; Tue, 03 Jul 2018 15:15:59 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:15:58 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:02 +0200 Message-Id: <1e945f9d91a2ca8b2f6d2682f35a370083d09dad.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 19/27] ethdev: add private generic device iterator 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" This iterator can be customized with a comparison function that will trigger a stopping condition. It can be leveraged to write several different iterators that have similar but non-identical purposes. It is private to librte_ethdev. Signed-off-by: Gaetan Rivet --- lib/librte_ethdev/Makefile | 1 + lib/librte_ethdev/eth_private.c | 31 +++++++++++++++++++++++++++++++ lib/librte_ethdev/eth_private.h | 26 ++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 lib/librte_ethdev/eth_private.c create mode 100644 lib/librte_ethdev/eth_private.h diff --git a/lib/librte_ethdev/Makefile b/lib/librte_ethdev/Makefile index c2f2f7d82..2fa133fbc 100644 --- a/lib/librte_ethdev/Makefile +++ b/lib/librte_ethdev/Makefile @@ -18,6 +18,7 @@ EXPORT_MAP := rte_ethdev_version.map LIBABIVER := 9 +SRCS-y += eth_private.c SRCS-y += rte_ethdev.c SRCS-y += rte_flow.c SRCS-y += rte_tm.c diff --git a/lib/librte_ethdev/eth_private.c b/lib/librte_ethdev/eth_private.c new file mode 100644 index 000000000..d565568a0 --- /dev/null +++ b/lib/librte_ethdev/eth_private.c @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Gaëtan Rivet + */ + +#include "rte_ethdev.h" +#include "eth_private.h" + +struct rte_eth_dev * +eth_find_device(const struct rte_eth_dev *start, rte_eth_cmp_t cmp, + const void *data) +{ + struct rte_eth_dev *edev; + ptrdiff_t idx; + + /* Avoid Undefined Behaviour */ + if (start != NULL && + (start < &rte_eth_devices[0] || + start > &rte_eth_devices[RTE_MAX_ETHPORTS])) + return NULL; + if (start != NULL) + idx = start - &rte_eth_devices[0] + 1; + else + idx = 0; + for (; idx < RTE_MAX_ETHPORTS; idx++) { + edev = &rte_eth_devices[idx]; + if (cmp(edev, data) == 0) + return edev; + } + return NULL; +} + diff --git a/lib/librte_ethdev/eth_private.h b/lib/librte_ethdev/eth_private.h new file mode 100644 index 000000000..0f5c6d5c4 --- /dev/null +++ b/lib/librte_ethdev/eth_private.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Gaëtan Rivet + */ + +#ifndef _RTE_ETH_PRIVATE_H_ +#define _RTE_ETH_PRIVATE_H_ + +#include "rte_ethdev.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Generic rte_eth_dev comparison function. */ +typedef int (*rte_eth_cmp_t)(const struct rte_eth_dev *, const void *); + +/* Generic rte_eth_dev iterator. */ +struct rte_eth_dev * +eth_find_device(const struct rte_eth_dev *_start, rte_eth_cmp_t cmp, + const void *data); + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_ETH_PRIVATE_H_ */ From patchwork Tue Jul 3 22:15:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42189 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6BD461BED2; Wed, 4 Jul 2018 00:16:11 +0200 (CEST) Received: from mail-wr0-f195.google.com (mail-wr0-f195.google.com [209.85.128.195]) by dpdk.org (Postfix) with ESMTP id 5AF471BEAE for ; Wed, 4 Jul 2018 00:16:02 +0200 (CEST) Received: by mail-wr0-f195.google.com with SMTP id f18-v6so3376816wre.10 for ; Tue, 03 Jul 2018 15:16:02 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=rZKGiEjUpkRjzJrFoVp0UVqkqGWKBiX/7X7BIuix/FY=; b=Q3G2gL0FMjQGdbdj7nvpLHVEiLbZI7xOpKSqa16Qjkt37zENBuaEbR/n1y8PMycFZb dUCnN1DWdLiyHppeAjRP39fGJdp2q11syBaKOudAIJnPEj0vXvFjimHQWgGBUMEA4WCG D/vHxRRi8dWdMZLVIS/A4avq4RcuhHFG+PwoIqV1+OsxhlZra2sMR8lR9PszNbvmltPE Vi/GwR4nMwtD7NFaq3rqiYsnETZ1ULbHzFq1uXxX1OBvQB+o4cpdTrX3ICFSNm5sxEr8 AJeCa+EtsP27NqjNIsDncnRKOOBGO43tLiN+I/cI1NEAkMrgEdlhLajnxvr3ww7r2Htf KGyQ== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=rZKGiEjUpkRjzJrFoVp0UVqkqGWKBiX/7X7BIuix/FY=; b=jyacJnwyN3Jcd7MM1ETyrqWOfc7wRX1NuvHN1jAeccadwp9m9CBFXON2U9zFjkXBOl ZlKC3rS4KX3O7edOhZTzj6h3xhDzqBzG3kDlTwjZMzUK+rc4BtvKRa9bczOexvBmDNdG 1tRAoUH2ipt7nfy46f11JrrDPBlEGcpyO6zIjCHwIx60027EX654603+Om5wRZ5V/nj/ E3oCMaN+nNeDGdsS0491iNfIARUqBrH5kPEJWzH7OsjJMean1nfhrJiskzVRdXhUapu+ KETtlahyjFl1HvK25R9c2JU6KFEK0soTMcpHfGcG0UwguAX20MF6Eb2opbPW3Cgu7BBe FnNg== X-Gm-Message-State: APt69E1Xb8ED96PjWY/zCmyCOQQJrK9rr0jduWNbYD7RzZVElaO/0Wdl N1w5mHcsdAt8Q27wpO/NrashDm92 X-Google-Smtp-Source: AAOMgpeFIrdC/HuqmKcNm/GfYfilNsfWl/AaoJeYtgCStncW4BeurBMcNV3y3DyxcHgnnvVI7SRgYg== X-Received: by 2002:a5d:6981:: with SMTP id g1-v6mr9910950wru.77.1530656161555; Tue, 03 Jul 2018 15:16:01 -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 i190-v6sm3771084wmd.33.2018.07.03.15.15.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:00 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:03 +0200 Message-Id: <58a5a7ac27a6ac6206246e8534ebf67168813318.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 20/27] ethdev: register ether layer as a class 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" Signed-off-by: Gaetan Rivet --- lib/librte_ethdev/Makefile | 3 +- lib/librte_ethdev/rte_class_eth.c | 79 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 lib/librte_ethdev/rte_class_eth.c diff --git a/lib/librte_ethdev/Makefile b/lib/librte_ethdev/Makefile index 2fa133fbc..d4c3a8d06 100644 --- a/lib/librte_ethdev/Makefile +++ b/lib/librte_ethdev/Makefile @@ -12,7 +12,7 @@ CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_net -lrte_eal -lrte_mempool -lrte_ring -LDLIBS += -lrte_mbuf +LDLIBS += -lrte_mbuf -lrte_kvargs EXPORT_MAP := rte_ethdev_version.map @@ -20,6 +20,7 @@ LIBABIVER := 9 SRCS-y += eth_private.c SRCS-y += rte_ethdev.c +SRCS-y += rte_class_eth.c SRCS-y += rte_flow.c SRCS-y += rte_tm.c SRCS-y += rte_mtr.c diff --git a/lib/librte_ethdev/rte_class_eth.c b/lib/librte_ethdev/rte_class_eth.c new file mode 100644 index 000000000..32c736d32 --- /dev/null +++ b/lib/librte_ethdev/rte_class_eth.c @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Gaëtan Rivet + */ + +#include + +#include +#include +#include +#include +#include + +#include "rte_ethdev.h" +#include "rte_ethdev_core.h" +#include "eth_private.h" + +enum eth_params { + RTE_ETH_PARAMS_MAX, +}; + +static const char * const eth_params_keys[] = { + [RTE_ETH_PARAMS_MAX] = NULL, +}; + +struct eth_dev_match_arg { + struct rte_device *device; + struct rte_kvargs *kvlist; +}; + +#define eth_dev_match_arg(d, k) \ + (&(const struct eth_dev_match_arg) { \ + .device = (d), \ + .kvlist = (k), \ + }) + +static int +eth_dev_match(const struct rte_eth_dev *edev, + const void *_arg) +{ + const struct eth_dev_match_arg *arg = _arg; + const struct rte_kvargs *kvlist = arg->kvlist; + + if (edev->state == RTE_ETH_DEV_UNUSED) + return -1; + if (edev->device != arg->device) + return -1; + if (kvlist == NULL) + /* Empty string matches everything. */ + return 0; + return 0; +} + +static void * +eth_dev_iterate(const void *start, + const char *str, + const struct rte_dev_iterator *it) +{ + struct rte_kvargs *kvargs = NULL; + struct rte_eth_dev *edev = NULL; + + if (str != NULL) { + kvargs = rte_kvargs_parse(str, eth_params_keys); + if (kvargs == NULL) { + RTE_LOG(ERR, EAL, "cannot parse argument list\n"); + rte_errno = EINVAL; + return NULL; + } + } + edev = eth_find_device(start, eth_dev_match, + eth_dev_match_arg(it->device, kvargs)); + rte_kvargs_free(kvargs); + return edev; +} + +struct rte_class rte_class_eth = { + .dev_iterate = eth_dev_iterate, +}; + +RTE_REGISTER_CLASS(eth, rte_class_eth); From patchwork Tue Jul 3 22:15:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42190 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9824B1BED6; Wed, 4 Jul 2018 00:16:12 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id AA2EE1BE75 for ; Wed, 4 Jul 2018 00:16:03 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id b8-v6so3392624wro.6 for ; Tue, 03 Jul 2018 15:16:03 -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=un2v2GEX2SYq994wd9ePKkFEbROYL9EMUomtxevCaA4=; b=Dt6pDwToAEmEMC70bgVWDk+6/mJnB7Hk5qWQMPTLbflR6xcEBouwWJRXDxkiOxk1j+ DBGnjzjHGGof/sGCoRXuYJusGfz6BsyUT/b63P49QouVt3UkDNcR7gviDY86i6bnHPj4 HZUD4M9jYzvhlLJBm2FcFgLmglNLuUizIqn5cNlVAWn1T+DxIYTj1PnOC6FnlTKfmt/p wgmqOzPV+NgVbFtdGVJu+GLf9lt5AFx+W9yCaykJkQeIoJvHXjU5q4R63B26Om95ljW7 QCV/mMtbQ8tsg96Om3e/WDNjUxjel/AeSREymAwKi1ctOfb9pkf7LPsPBNYzVL5s88qm rgrA== 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=un2v2GEX2SYq994wd9ePKkFEbROYL9EMUomtxevCaA4=; b=Z7UDBrdQaT6NoTiBHf5IG+ydwc6LsKv8h/rr65N0ZesSIR7dVT75WvhWXP3qccWKRn smI4S1u+gl69LtwsDJX51VxTs8M0wU6zFV69lEeQtI3+U8zq02Pz2e69xGUhDDiJM2Rk sxd4/zH7slDF3G54CNaLK0zaeHJExj82CuXv0BpkJjVztYesDboRgC67CQ1xgBBVc2u0 7lVOXPaCFw3V9Ahzhk7hf3C+ZeP8HG4Uba6BshoCPDgj6Sh2EXo8npWbsbGbKt0bve3Z n7BV9VXelXxRnOIfdHQ3Hh+Ro9McRltRG/qsKDAqygaN+Nxd9EciKnSm65zC9GrrPvMz R95A== X-Gm-Message-State: APt69E2vsvYJEsh/Be9WCT/KrZbslGaJMutN4qDxtBx/8BdmdmNhAm5X 23PquvuWwTaC1/pNWvOfike/9Fc1 X-Google-Smtp-Source: AAOMgpdlp9Y7nhcqlLS9Jmzd8fowPrf6JN4AN6otgG7TVkeqAhUMqK1DnfbUBxcRgOaUCzZAD5X3VA== X-Received: by 2002:adf:e6d0:: with SMTP id y16-v6mr25290412wrm.35.1530656163116; Tue, 03 Jul 2018 15:16:03 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:01 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:04 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 21/27] ethdev: add device matching field name 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" The eth device class can now parse a field name, matching the eth_dev name with one passed as "class=eth,name=xxxxxx" Signed-off-by: Gaetan Rivet --- lib/librte_ethdev/rte_class_eth.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/librte_ethdev/rte_class_eth.c b/lib/librte_ethdev/rte_class_eth.c index 32c736d32..d8d8e8845 100644 --- a/lib/librte_ethdev/rte_class_eth.c +++ b/lib/librte_ethdev/rte_class_eth.c @@ -15,10 +15,12 @@ #include "eth_private.h" enum eth_params { + RTE_ETH_PARAMS_NAME, RTE_ETH_PARAMS_MAX, }; static const char * const eth_params_keys[] = { + [RTE_ETH_PARAMS_NAME] = "name", [RTE_ETH_PARAMS_MAX] = NULL, }; @@ -39,6 +41,7 @@ eth_dev_match(const struct rte_eth_dev *edev, { const struct eth_dev_match_arg *arg = _arg; const struct rte_kvargs *kvlist = arg->kvlist; + struct rte_eth_dev_data *data; if (edev->state == RTE_ETH_DEV_UNUSED) return -1; @@ -47,6 +50,10 @@ eth_dev_match(const struct rte_eth_dev *edev, if (kvlist == NULL) /* Empty string matches everything. */ return 0; + data = edev->data; + if (rte_kvargs_process(kvlist, "name", + rte_kvargs_strcmp, data->name)) + return -1; return 0; } From patchwork Tue Jul 3 22:15:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42191 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CD13B1BEDA; Wed, 4 Jul 2018 00:16:13 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 4D4B11BE60 for ; Wed, 4 Jul 2018 00:16:05 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id h10-v6so3389624wrq.8 for ; Tue, 03 Jul 2018 15:16:05 -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=CN9okOYTGDX9JsHmdlhuZxzkLM2P9+YlDpslKSyoQLw=; b=CFpYZni+e5DEDdkdJ6lPoUHMExY45aGSkmc3n1JtwTQX+/si8qHCjTQprpICGDwQBK cPR0qrRtT5p5pJizGsn2vFftVDQ8Enf1UqnnLkjMwsSqPAFeiiA4u7M+Zu2H2aHu/UKm 5OCmgUz7l9NbKgOxmM1U/Sh/CJJy5JHmpbKPxXjVEVEJKAeMkvkoFISzm3e8axjN5Afb MMJBkVeJjnDBEM3L38/lYO/6bdfrzQJyH7pTgAab7I9cuecZjLPbvgE8QxkjPYYjbzNf XR94l6IglpDKbcaMUblM0eJwWcjzi7fzXTa1g6QiPNXejV/ymwsp/E+2Ws9FZY6Z+nkf QOLQ== 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=CN9okOYTGDX9JsHmdlhuZxzkLM2P9+YlDpslKSyoQLw=; b=JQYdH5PoAB1K1UqkEOotz07IVTkO3pavSnRkKxQGi4Q2c65sD12pl+alpeppstDFKz 0fy1S+72eK3le7HZevW836G6TrDYQiDRA2ietLoHM50iw1cbf5A6ouB/S3rOoIafe9IU i1bKz+1L3rncmOl1lYrqHSpmD7dkbNz6a2rM61Dvli0E1jUdEEPvGP7l57N4Jw1XRziB p7UVeaT5hcl5k3KaHs3CoVOpMcs6f7D2uVkQ8kLFmfBiZpSqiEqBC+fOq5ahSxhT0my0 aHpfUlxNqZM/JjkgCx90StL+rhxNWKRnTRRnoD63WxcQ4S0DILyt5defdlpxu1tmKlt9 QcAw== X-Gm-Message-State: APt69E2tYB3hUemLxf/R3qlf01bG5pwCkGnWVqP3NHkAJUk++KwfvXH5 sHRbbIE60+8WrfNgSX1IaevbLfIg X-Google-Smtp-Source: AAOMgperpbPuzjFSZKeOuxFiXktO1c7PsEd1RNNCmc7wNjr2xaRwrWoEoJaxo1XCybl8YHaUS85SWw== X-Received: by 2002:adf:992d:: with SMTP id x42-v6mr23534985wrb.81.1530656164656; Tue, 03 Jul 2018 15:16:04 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:03 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:05 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 22/27] app/testpmd: add show device command 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" A new interactive command is offered: show device This commands lists all rte_device element matching the device description. e.g.: show device bus=pci show device bus=vdev show device bus=vdev/class=eth show device bus=vdev,driver=net_ring/class=eth show device bus=vdev/class=eth,name=net_ring0 These devices may not be otherwise useful, some buses will spawn devices to keep track of their assets without having a driver to use them. Signed-off-by: Gaetan Rivet --- app/test-pmd/cmdline.c | 54 +++++++++++++++++++++++++++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 24 +++++++++++++ 2 files changed, 78 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 27e2aa8c8..3b86bfe48 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -228,6 +228,9 @@ static void cmd_help_long_parsed(void *parsed_result, "show port tm node stats (port_id) (node_id) (clear)\n" " Display the port TM node stats.\n\n" + "show device (device_string)\n" + " Display devices matching the device string.\n\n" + ); } @@ -7083,6 +7086,56 @@ cmdline_parse_inst_t cmd_showportall = { }, }; +/* *** SHOW DEVICE INFO *** */ +struct cmd_showdevice_result { + cmdline_fixed_string_t show; + cmdline_fixed_string_t device; + cmdline_fixed_string_t filter; +}; + +static void +cmd_showdevice_dump_device(const struct rte_device *dev) +{ + const struct rte_driver *drv = dev->driver; + + printf("0x%p: %s:%s\n", (const void *)dev, dev->name, + drv ? drv->name : ""); +} + +static void cmd_showdevice_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_showdevice_result *res = parsed_result; + struct rte_dev_iterator it; + const struct rte_device *dev; + + RTE_DEV_FOREACH(dev, res->filter, &it) + cmd_showdevice_dump_device(dev); +} + +cmdline_parse_token_string_t cmd_showdevice_show = + TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, + show, "show"); +cmdline_parse_token_string_t cmd_showdevice_device = + TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, + device, "device"); +cmdline_parse_token_string_t cmd_showdevice_filter = + TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, + filter, NULL); + +cmdline_parse_inst_t cmd_showdevice = { + .f = cmd_showdevice_parsed, + .data = NULL, + .help_str = "show device ", + .tokens = { + (void *)&cmd_showdevice_show, + (void *)&cmd_showdevice_device, + (void *)&cmd_showdevice_filter, + NULL, + }, +}; + /* *** SHOW PORT INFO *** */ struct cmd_showport_result { cmdline_fixed_string_t show; @@ -17262,6 +17315,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_help_long, (cmdline_parse_inst_t *)&cmd_quit, (cmdline_parse_inst_t *)&cmd_load_from_file, + (cmdline_parse_inst_t *)&cmd_showdevice, (cmdline_parse_inst_t *)&cmd_showport, (cmdline_parse_inst_t *)&cmd_showqueue, (cmdline_parse_inst_t *)&cmd_showportall, diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index 0d6fd50ca..4f1009a3a 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -2628,6 +2628,30 @@ set the traffic management default hierarchy on the port:: testpmd> set port tm hierarchy default (port_id) +Device functions +---------------- + +Show devices +~~~~~~~~~~~~ + +Display any registered devices:: + + testpmd> show device + +where: + +* ``device_string``: Device description string, of the format + + layer[/layer[/layer]] + + where one layer is in the form + + layer_key=layer_name[,key1=value1[,...]] + + Valid layer keys are ``bus`` and ``class``. + Their respective values is defined by registered ``bus`` and ``class`` + drivers. + Filter Functions ---------------- From patchwork Tue Jul 3 22:15:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42192 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0BC131BEE0; Wed, 4 Jul 2018 00:16:15 +0200 (CEST) Received: from mail-wr0-f195.google.com (mail-wr0-f195.google.com [209.85.128.195]) by dpdk.org (Postfix) with ESMTP id F41461BEC1 for ; Wed, 4 Jul 2018 00:16:06 +0200 (CEST) Received: by mail-wr0-f195.google.com with SMTP id u7-v6so3369411wrn.12 for ; Tue, 03 Jul 2018 15:16:06 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=kNSu5jGTr4hWtkkgP21roR7INfsKTWJDt0wrGRnfwO8=; b=RiIWKK/5iZjaf/kw9OaPbQkk757B/3lUIQ844A3Q2C75l48i4oiLjUttNek2+AbL5l A2/ieYjkpKtorrthZc0kYptKiUyXDsM2t8g3YtCfr19lmoyWAePhNl0DNEqq91hopaM/ lxkr0MEBvN88qOJlJIIZEbzV8vWIGSsXOAfdxgr8xAVNbhwLqV0NGAIQiLagQ3FaJQ5n 2V0yeODPiVIZSNDc31oefLLRMXZeSI9CyRhFhPvI4P+g7+s1Grg5djONFiOIA6wKP9MH QEDGePHS4Sw3jF93NDf0sojRW9OpsFw2vdgmwWGCP25rSEQFoWhjT8tqUf8zKxIXRUQ5 wjlg== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=kNSu5jGTr4hWtkkgP21roR7INfsKTWJDt0wrGRnfwO8=; b=KEL8MEFcXwlFFUAn6vNMzsKse50IzQKlnznQeXCpr0Asb5uycS70ZdWrYANprmWl7U fduPsJjUdDxI5Ch5Lg0EO62TAT+dPhqbVuCAKxWNTXmEa35tL2TOcYxrmQT1BBUBCbe1 UI+mpqxyR5823VfcU2WVJncu/N+sULE5a1Ls+DQK10ZL0rHhJbwxeJf1quZOF8Xq+UOs LC9hWanPN30LCK+WoJog4Q94GuLBabR6o9FBQB/NMW94X+00nm+pjVvgqY4PFMOm9S05 KhUzXNG2wXR/dCEBDkTqGoOsEla3Vp0NROJqVMGr8R0xyUnF5JUcN4MyDPmNQU6bycg2 5czQ== X-Gm-Message-State: APt69E3wZyTCfzGkCqPdHSM9GsbtzZl0F26+TkYMGFVp0r+rPe7/89si TJgh4V//60XQ4dyPAdjlsMzpXi7Z X-Google-Smtp-Source: AAOMgpcXpCFwQUU9FnpwbMPgcaLO4ICitPKPOPgU5Rp04BkW9kTKplqJ3ZbprsEhnhPyPbzSfk8ROA== X-Received: by 2002:adf:8b01:: with SMTP id n1-v6mr24691132wra.282.1530656166295; Tue, 03 Jul 2018 15:16:06 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:04 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:06 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 23/27] bus/pci: pre-process declarative PCI devargs 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" The new devargs format does not recognize a particular device name. Each bus uses its specific format. Instead of introducing a new bus API, process those devargs privately for the moment. Prepare them for matching during scan against the bus devices. Signed-off-by: Gaetan Rivet --- drivers/bus/pci/bsd/pci.c | 5 ++++ drivers/bus/pci/linux/pci.c | 5 ++++ drivers/bus/pci/pci_params.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ drivers/bus/pci/private.h | 16 +++++++++++++ 4 files changed, 81 insertions(+) diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c index 655b34b7e..046cd11d5 100644 --- a/drivers/bus/pci/bsd/pci.c +++ b/drivers/bus/pci/bsd/pci.c @@ -327,6 +327,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf) int rte_pci_scan(void) { + struct rte_devargs *devargs; int fd; unsigned dev_count = 0; struct pci_conf matches[16]; @@ -342,6 +343,10 @@ rte_pci_scan(void) if (!rte_eal_has_pci()) return 0; + RTE_EAL_DEVARGS_FOREACH("pci", devargs) + if (rte_pci_devargs_prepare(devargs)) + continue; + fd = open("/dev/pci", O_RDONLY); if (fd < 0) { RTE_LOG(ERR, EAL, "%s(): error opening /dev/pci\n", __func__); diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index 004600f1c..0c20a4337 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -430,6 +430,7 @@ parse_pci_addr_format(const char *buf, int bufsize, struct rte_pci_addr *addr) int rte_pci_scan(void) { + struct rte_devargs *devargs; struct dirent *e; DIR *dir; char dirname[PATH_MAX]; @@ -439,6 +440,10 @@ rte_pci_scan(void) if (!rte_eal_has_pci()) return 0; + RTE_EAL_DEVARGS_FOREACH("pci", devargs) + if (rte_pci_devargs_prepare(devargs)) + continue; + #ifdef VFIO_PRESENT if (!pci_vfio_is_enabled()) RTE_LOG(DEBUG, EAL, "VFIO PCI modules not loaded\n"); diff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c index 7630d4845..bb62bcb80 100644 --- a/drivers/bus/pci/pci_params.c +++ b/drivers/bus/pci/pci_params.c @@ -2,9 +2,12 @@ * Copyright 2018 Gaëtan Rivet */ +#include + #include #include #include +#include #include #include #include @@ -76,3 +79,55 @@ rte_pci_dev_iterate(const void *start, rte_kvargs_free(kvargs); return dev; } + +static int +pci_addr_kv_parse(const char *key __rte_unused, + const char *value, + void *_da) +{ + struct rte_devargs *da = _da; + struct rte_pci_addr addr; + + /* Verify address is valid. */ + if (rte_pci_addr_parse(value, &addr)) { + rte_errno = ENODEV; + return -1; + } + /* Write down the address as the devargs name. */ + rte_pci_device_name(&addr, da->name, sizeof(da->name)); + return 0; +} + +int +rte_pci_devargs_prepare(struct rte_devargs *da) +{ + struct rte_kvargs *kvargs = NULL; + char *args; + int ret; + + if (da->busstr == NULL) + return 0; + + args = strchr(da->busstr, ','); + if (args == NULL) + return 0; + args++; + + kvargs = rte_kvargs_parse(args, pci_params_keys); + if (kvargs == NULL) { + RTE_LOG(ERR, EAL, "unable to parse parameter list: %s\n", + da->busstr); + rte_errno = EINVAL; + return -1; + } + + if (rte_kvargs_process(kvargs, "id", + &pci_addr_kv_parse, da)) { + ret = -1; + goto free_kvargs; + } + +free_kvargs: + rte_kvargs_free(kvargs); + return ret; +} diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index 0e689fa74..9beb24c6a 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -191,4 +191,20 @@ rte_pci_dev_iterate(const void *start, const char *str, const struct rte_dev_iterator *it); +/* + * Prepare a devargs meant for this bus. + * This function is only used for a transitory period, + * to translate the new devargs format in one + * compatible with the old form. + * + * @param da + * Devargs to process. + * + * @return + * 0 on success. + * <0 on error. + */ +int +rte_pci_devargs_prepare(struct rte_devargs *da); + #endif /* _PCI_PRIVATE_H_ */ From patchwork Tue Jul 3 22:15:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42193 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8E6081BEDE; Wed, 4 Jul 2018 00:16:16 +0200 (CEST) Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id 64CFA1BEC5 for ; Wed, 4 Jul 2018 00:16:08 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id n17-v6so3759000wmh.2 for ; Tue, 03 Jul 2018 15:16:08 -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 :mime-version:in-reply-to:references:content-transfer-encoding; bh=go46P7hXF6U8uUnAgtW23Ie0yAZ98Rq2fDQ8vb96Z0c=; b=b0eQOkLGzqv8SRcuMwSQE3vDyAPU7Mds99HaLUEftKfURc7CWceTXJ8hwou50bILWB jc5pKTSfkpqq+HeMR8AO870kXXnVTRZbRFwgxphedAgGi9D3lxjzGlgJa6GiQVFT+oVR S+xN90PpYugVzU3iDHA7PlFiGUVnb4Xd9gHQfpMcDyicBUJw7eSEqkFV7wXDNdGTG85D BTqr06EIXrHZC4RzHR2iST1rHQ0O4Zj6N8wcicSBsXCJWuC2pIh6J6My00LPZrkyr4gD Egd5pg0ZglYjUvccN2pHaC3+B6hjijYWWqf889uIS4O6U7mKHd3jUmT/Kpk4bFR6REfD rkbw== 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:mime-version:in-reply-to:references :content-transfer-encoding; bh=go46P7hXF6U8uUnAgtW23Ie0yAZ98Rq2fDQ8vb96Z0c=; b=F5Pmsx7jShxXPr1mDmoYPZFN5PmKSO9Rj/f6Y/Pxz7eB6CYC0YfUc7pelP0jhjTnM+ buY5UrZ5SfYRXrxf9wqM3qprmKvc2RRghX7Z6oAwoYaJcB3H3gY2Gc6+y4cdw3Ubewvg xszHItWnLbI+3DHZ1zKAD0Pt/AzBJjyt9BXB2yZWNKZZQNBSK3MzP+fudGWKNGQSpXd7 wtluzHN6ZAO2oxyZV4sUfKiYSsSb4VdPG/PO4aieeNz7hBW45uFFH6VBnOR9FKtWJPIr yashksM/m/J1XmnzZZng86I00m0lK4sP1hgbxKsWoipoJvSHwusJJwOZGpGVTIN+2hER Kdhw== X-Gm-Message-State: APt69E1nizaqj5AQZNjdtbeoq9vnv/HKc7OgHfu3q7EhpEN5vtJABl1P kljn2wvZgB61WAO87LejYVitNU/4 X-Google-Smtp-Source: AAOMgpe+OkUGStna7qALss9bckqkZyjNa4K8GUmcbyHWn6ZrZPi0Z95MYiJmRkGBJcANrup4OsU2TA== X-Received: by 2002:a1c:f407:: with SMTP id z7-v6mr11369124wma.143.1530656167730; Tue, 03 Jul 2018 15:16:07 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:06 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:07 +0200 Message-Id: <17afddeae52fa1f523aa8f32a62f62861adc9cad.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 24/27] bus/vdev: pre-process declarative vdev devargs 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" The new devargs format does not recognize a particular device name. Each bus uses its specific format. Process each devargs privately prior to attempting a bus scan. Prepare them if they are using the new devargs format. Signed-off-by: Gaetan Rivet --- drivers/bus/vdev/vdev.c | 10 +++++---- drivers/bus/vdev/vdev_params.c | 50 +++++++++++++++++++++++++++++++++++++++++ drivers/bus/vdev/vdev_private.h | 6 +++++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index e8518833d..f2dace245 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -115,8 +115,8 @@ rte_vdev_remove_custom_scan(rte_vdev_scan_callback callback, void *user_arg) return 0; } -static int -vdev_parse(const char *name, void *addr) +int +rte_vdev_parse(const char *name, void *addr) { struct rte_vdev_driver **out = addr; struct rte_vdev_driver *driver = NULL; @@ -148,7 +148,7 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev) VDEV_LOG(DEBUG, "Search driver %s to probe device %s", name, rte_vdev_device_name(dev)); - if (vdev_parse(name, &driver)) + if (rte_vdev_parse(name, &driver)) return -1; dev->device.driver = &driver->driver; ret = driver->probe(dev); @@ -443,6 +443,8 @@ vdev_scan(void) /* for virtual devices we scan the devargs_list populated via cmdline */ RTE_EAL_DEVARGS_FOREACH("vdev", devargs) { + if (rte_vdev_devargs_prepare(devargs)) + continue; dev = calloc(1, sizeof(*dev)); if (!dev) @@ -536,7 +538,7 @@ static struct rte_bus rte_vdev_bus = { .find_device = rte_vdev_find_device, .plug = vdev_plug, .unplug = vdev_unplug, - .parse = vdev_parse, + .parse = rte_vdev_parse, .dev_iterate = rte_vdev_dev_iterate, }; diff --git a/drivers/bus/vdev/vdev_params.c b/drivers/bus/vdev/vdev_params.c index 2f55f451f..7ad11b092 100644 --- a/drivers/bus/vdev/vdev_params.c +++ b/drivers/bus/vdev/vdev_params.c @@ -2,11 +2,14 @@ * Copyright 2018 Gaëtan Rivet */ +#include + #include #include #include #include #include +#include #include "vdev_logs.h" #include "vdev_private.h" @@ -60,3 +63,50 @@ rte_vdev_dev_iterate(const void *start, rte_kvargs_free(kvargs); return dev; } + +static int +vdev_driver_kv_parse(const char *key __rte_unused, + const char *value, + void *_da) +{ + struct rte_devargs *da = _da; + struct rte_vdev_driver *driver; + + /* Verify that the driver matches. */ + if (rte_vdev_parse(value, &driver)) + return -1; + + /* Copy the driver name as-is. */ + snprintf(da->name, sizeof(da->name), "%s", value); + return 0; +} + +int +rte_vdev_devargs_prepare(struct rte_devargs *da) +{ + struct rte_kvargs *kvargs = NULL; + char *args; + int ret; + + if (da->busstr == NULL) + return 0; + + args = strchr(da->busstr, ','); + if (args == NULL) + return 0; + args++; + + kvargs = rte_kvargs_parse(args, vdev_params_keys); + if (kvargs == NULL) { + VDEV_LOG(ERR, "unable to parse parameter list: %s\n", + da->busstr); + rte_errno = EINVAL; + return -1; + } + + ret = rte_kvargs_process(kvargs, "driver", + vdev_driver_kv_parse, da); + + rte_kvargs_free(kvargs); + return ret; +} diff --git a/drivers/bus/vdev/vdev_private.h b/drivers/bus/vdev/vdev_private.h index ba6dc48ff..da57b84dd 100644 --- a/drivers/bus/vdev/vdev_private.h +++ b/drivers/bus/vdev/vdev_private.h @@ -19,6 +19,12 @@ rte_vdev_dev_iterate(const void *start, const char *str, const struct rte_dev_iterator *it); +int +rte_vdev_parse(const char *name, void *addr); + +int +rte_vdev_devargs_prepare(struct rte_devargs *da); + #ifdef __cplusplus } #endif From patchwork Tue Jul 3 22:15:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42194 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BA3A11BEF9; Wed, 4 Jul 2018 00:16:17 +0200 (CEST) Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id 926D51BECE for ; Wed, 4 Jul 2018 00:16:09 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id s14-v6so3756664wmc.1 for ; Tue, 03 Jul 2018 15:16:09 -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=0jLZPSxklafVV0nT4KrmMQ9BUMSTGDLdETqxeqgfh8c=; b=1mok8ld7G5xdLvP6umDWjaC/sxzhQR3sXe7N/wtLSmO1jeCSFJ3UelESzNrpjnXDWO fxB3fc5xEVpg9sld6qhvAPgpSxv7Umkysif201ukAtRmdHoxDZpDshRO2EkCDZ5Y8UzK rXM6lBrnzJlkdSKiaF/zsNKIXKEhu9By2mtqZxzQhSEGQBP4e2Qwfj0CO/vZ+CXhqNUN xK1wLAeERN0MUZfECyis/Kl7/wng/5rRoQSloxA9urYWZQPjAQn0vIjLL2a6g0uY74U9 tXh5XF4+O5LmMOJsMkoZfTxMFG+/J5aedLAjKEm9XvMtBuQxTnrZkJIGm+pX5wDSwKET oBWw== 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=0jLZPSxklafVV0nT4KrmMQ9BUMSTGDLdETqxeqgfh8c=; b=CRiunUc9xF+3qeszejBtf43vshkmmDzE2bjKEP1yKERa/sB69gB3tfNY7mXcPAz7Dx 9iF547BA8IKFuq3yCRl/lHjXec0rm4g+iqFKD44taPuT4FUdLRN/SsoryBGg9Vjc8f6z vxbreMB7WzTvSXqYr3c7jDI4X2a/q6nolDkFWmvOXwTU4QfQcrz4MSmooasWD42ryFS3 jV7UOfaE1IgOR3bP9xHXfKLKgvqaAqogRbXaIyFZYbiHh2bA/T+OHID0zUGwPNM/Xz+4 cwFGgXq5qlD1uKqsN7Rf1+g4/hrodihYbtj5Icugy+WuFPqY8Kp3QTysyOZ88m7OL0PT yblg== X-Gm-Message-State: APt69E2aO9PMUpJdmBGsL/Zx6jMZ5GqXyPJw5xSr0qldugGBFd2/9hIb EyJYULW2pp8mkV3RJ71d4/4Tpv/M X-Google-Smtp-Source: AAOMgpd8SS3QTlAvd9StEDruJ74vd1jF3d0DbiUl1DXbccAuzRRV2hIb6EEeQKEDjfn1Ywoz+dyjHA== X-Received: by 2002:a1c:f46:: with SMTP id 67-v6mr9071951wmp.122.1530656168989; Tue, 03 Jul 2018 15:16:08 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:08 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:08 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 25/27] bus/pci: process declarative PCI devargs 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" Introduce the facility to process future PCI parameters. Once the matching between PCI devices and devargs has been done, it is possible to process each devargs. New parameters would have the PCI device handle to work with when parsing the device (bus specific) parameters. Signed-off-by: Gaetan Rivet --- drivers/bus/pci/pci_common.c | 3 +++ drivers/bus/pci/pci_params.c | 10 ++++++++++ drivers/bus/pci/private.h | 13 +++++++++++++ 3 files changed, 26 insertions(+) diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 749b6eee3..e2816eedb 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -251,6 +251,9 @@ pci_probe_all_drivers(struct rte_pci_device *dev) if (dev->driver != NULL) return 0; + if (rte_pci_devargs_process(dev) < 0) + return -1; + FOREACH_DRIVER_ON_PCIBUS(dr) { rc = rte_pci_probe_one_driver(dr, dev); if (rc < 0) diff --git a/drivers/bus/pci/pci_params.c b/drivers/bus/pci/pci_params.c index bb62bcb80..7dceef89b 100644 --- a/drivers/bus/pci/pci_params.c +++ b/drivers/bus/pci/pci_params.c @@ -131,3 +131,13 @@ rte_pci_devargs_prepare(struct rte_devargs *da) rte_kvargs_free(kvargs); return ret; } + +int +rte_pci_devargs_process(struct rte_pci_device *pdev) +{ + /* For the moment, no PCI param + * needs to be processed. + */ + (void) pdev; + return 0; +} diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index 9beb24c6a..06dc85e85 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -207,4 +207,17 @@ rte_pci_dev_iterate(const void *start, int rte_pci_devargs_prepare(struct rte_devargs *da); +/* + * Process the device devargs, if any. + * + * @param pdev + * PCI device + * + * @return + * 0 on success. + * <0 on error. + */ +int +rte_pci_devargs_process(struct rte_pci_device *pdev); + #endif /* _PCI_PRIVATE_H_ */ From patchwork Tue Jul 3 22:15:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42195 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D0D0B1BEFE; Wed, 4 Jul 2018 00:16:18 +0200 (CEST) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by dpdk.org (Postfix) with ESMTP id 2DB711BEBD for ; Wed, 4 Jul 2018 00:16:11 +0200 (CEST) Received: by mail-wm0-f43.google.com with SMTP id v25-v6so3822428wmc.0 for ; Tue, 03 Jul 2018 15:16:11 -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=QdFoI4PAYRZ4EyFu4BqTTYdN+Gh8G7Ywbw5IuLjj6nA=; b=bruDLuXHz9McHIK2p1gDBGc/YpF01z4wipMcx1027ldFiu1IBSADqLm5CXOeFzxoE2 RgU9PLeRiab32b7bk6bAjnoubnW4V6Bg1+KbMHOhDi1fcruHHIaPtcGomULM7u10PDWP oKm1tGIL+LGIXgYi01C5XBlRbHFlPEpPKg8N1iEpRyOmkSUb2KxpWth2i1DRcvSkag6t 13OkZXntgiUhme/+dtl/Qqb12qn649DrfRmYnBijPGgiJBMjFoxnO7RO3tLIfyCR5bFh jVwrKxpSDIgGmoD/y2DYE+zwhAYOawI/2ilVlBEdsfqHi4KR3Uub1yAD3QnoOzXD3k2k ae4Q== 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=QdFoI4PAYRZ4EyFu4BqTTYdN+Gh8G7Ywbw5IuLjj6nA=; b=lNPcjWQbKuH2tyW+Py78towrBtqqFDqfDaL9QlioyeUTVsh9VLZy1Usem2Y+Z55WdS CflpmFPjUHskSMagL7ZYSChzpbw8l20thz0Gz/lroo9ZT0JCMAYyBvuQldRw1yOslxGv oBbtT6XUoAJ3XG/QBP4EPps0tVk16mYKYXNmmXIa5XD9X7jwRR5epf5CzCQ/WfyInusm pQ5wH8GhDz3WNYt9ajbMktl5Kvv7kT2Lu4Mt4yvtAflzXlKUW/YEpRa61F2Mzj8jg9C0 IjbBZZ7s/MdAvvuUF1gdrYZj2DAG3/qd5oK6wrE6s+P91QT6+SSILOyiuQ8VqYBf2Rle gUTQ== X-Gm-Message-State: APt69E2gYbdY4UMvVqAaLCaoN1d9VnzlxH0yPmo8F1jD/l5503HrpNCH QnLM1J2e4hc7cwHyaGYHdIQL8apH X-Google-Smtp-Source: AAOMgpeLtjW23Gm2qLlrxDsYOI5lrnZhxnum3G59bC+4db4fTY42+a7teLRCljT8kgRxn25J7fAVGw== X-Received: by 2002:a1c:5b88:: with SMTP id p130-v6mr12386388wmb.69.1530656170537; Tue, 03 Jul 2018 15:16:10 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:09 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:09 +0200 Message-Id: X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 26/27] ethdev: process declarative eth devargs 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" Process the class-specific arguments in a devargs. This processing takes the form of setting the proper eth_dev fields when relevant. Signed-off-by: Gaetan Rivet --- lib/librte_ethdev/eth_private.h | 5 ++++ lib/librte_ethdev/rte_class_eth.c | 61 +++++++++++++++++++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev.c | 7 +++++ 3 files changed, 73 insertions(+) diff --git a/lib/librte_ethdev/eth_private.h b/lib/librte_ethdev/eth_private.h index 0f5c6d5c4..c0c065165 100644 --- a/lib/librte_ethdev/eth_private.h +++ b/lib/librte_ethdev/eth_private.h @@ -19,6 +19,11 @@ struct rte_eth_dev * eth_find_device(const struct rte_eth_dev *_start, rte_eth_cmp_t cmp, const void *data); +/* Generic rte_eth_dev parameters processor. */ +int +rte_eth_dev_args_parse(struct rte_eth_dev *eth_dev, + struct rte_devargs *da); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ethdev/rte_class_eth.c b/lib/librte_ethdev/rte_class_eth.c index d8d8e8845..f02b6fd6a 100644 --- a/lib/librte_ethdev/rte_class_eth.c +++ b/lib/librte_ethdev/rte_class_eth.c @@ -35,6 +35,19 @@ struct eth_dev_match_arg { .kvlist = (k), \ }) +typedef int (*eth_dev_set_t)(struct rte_eth_dev *edev, const char *value); + +static enum eth_params +ethdev_param_id(const char *key) +{ + int i; + + for (i = 0; i < RTE_ETH_PARAMS_MAX; i++) + if (strcmp(key, eth_params_keys[i]) == 0) + return i; + return RTE_ETH_PARAMS_MAX; +} + static int eth_dev_match(const struct rte_eth_dev *edev, const void *_arg) @@ -79,6 +92,54 @@ eth_dev_iterate(const void *start, return edev; } +static int +eth_dev_set_name(struct rte_eth_dev *edev, + const char *value) +{ + snprintf(edev->data->name, + sizeof(edev->data->name), + "%s", value); + return 0; +} + +static int +ethdev_args_process(const char *key, + const char *value, + void *_edev) +{ + static eth_dev_set_t eth_dev_set[] = { + [RTE_ETH_PARAMS_NAME] = eth_dev_set_name, + [RTE_ETH_PARAMS_MAX] = NULL, + }; + struct rte_eth_dev *edev = _edev; + int param; + + param = ethdev_param_id(key); + if (eth_dev_set[param]) + return eth_dev_set[param](edev, value); + return 0; +} + +int +rte_eth_dev_args_parse(struct rte_eth_dev *edev, + struct rte_devargs *da) +{ + struct rte_kvargs *kvargs = NULL; + + if (da == NULL || da->clsstr == NULL) + return 0; + + kvargs = rte_kvargs_parse2(da->clsstr, eth_params_keys, "/"); + if (kvargs == NULL) { + RTE_LOG(ERR, EAL, "cannot parse argument list\n"); + return -EINVAL; + } + if (rte_kvargs_process(kvargs, NULL, ethdev_args_process, edev)) + return -1; + rte_kvargs_free(kvargs); + return 0; +} + struct rte_class rte_class_eth = { .dev_iterate = eth_dev_iterate, }; diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index cce20d9ae..4583509dd 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -41,6 +41,7 @@ #include "rte_ethdev.h" #include "rte_ethdev_driver.h" #include "ethdev_profile.h" +#include "eth_private.h" static int ethdev_logtype; @@ -3594,6 +3595,12 @@ rte_eth_dev_create(struct rte_device *device, const char *name, } } + retval = rte_eth_dev_args_parse(ethdev, device->devargs); + if (retval) { + RTE_LOG(ERR, EAL, "ethdev parsing failed"); + goto probe_failed; + } + retval = ethdev_init(ethdev, init_params); if (retval) { RTE_LOG(ERR, EAL, "ethdev initialisation failed"); From patchwork Tue Jul 3 22:15:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42196 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0014B1BF04; Wed, 4 Jul 2018 00:16:19 +0200 (CEST) Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id 872D41BE91 for ; Wed, 4 Jul 2018 00:16:12 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id l15-v6so11493079wmc.1 for ; Tue, 03 Jul 2018 15:16:12 -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=T5uPh9sAczvEaPKi1t8nJgmi5GdqEglAstltDvtI8Qk=; b=qaluboGjuOyzuNE8cGK2AFP1+QTaDexpZacUw9H1j8RQA6kHwMu6t5ozntG0vxBwOh aGQjZVCsF0XANwUdeKF9P6hov4cm9UJ0/1jwpQ7t+KHi4xuTqRWTBz0pktWoO3ZwmTYh IXOWUnqWAZVpMWQimO1iQ0B9/L8oN5FzobCxihta63aTxQD6F7HWUrsN0Mr/KlVsMtfZ tcN4xaLo2Aa9zB7GfcPo1T3aGyYdbSP2NLchK+MG6P/5Dl7Vxf0Cd8AYVl8O2k3rX9X/ 63gA3wwRrhXsT6txHESZgEf0C5xEc0HLp/KwMphefH4hepHuApcQBbnCCtr+ypqZuGbt teug== 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=T5uPh9sAczvEaPKi1t8nJgmi5GdqEglAstltDvtI8Qk=; b=hY2AQMAqZ+hgyrKTrtZrakWzctdE428AOYmo0PUkaPlE2H7OiX+IuZhNECqTwrDJVc LVYIP6duk0nQLTZ11ZOcmL9ze7oV3wS/PZeRLTe4ERany5OE6PCCHmgZCB3l1DlPqpVM FoSpsSKUsn9zbiCIwObBErOGEC6CydmXrvXn5JZFXHGlnoRRGH3Z0BohnV1SW6w8H9xk +ZVbnrNOjI8wH/GIROkF4vN3ltnfCyyg7jKBBA8XTFukNuCG67/5EyVWAkSBHNttrVjp 4t/JUHeFHPRw5VfpHjLMXWi8E0FnnmLA3jiOSawuF1xfJiDV5mPNvZ6MYsL5DY6FHTuC PJtQ== X-Gm-Message-State: APt69E2POSrJvbG2zLrLs58VMGnVZ1TaZsNT3PH+0Qe9BtAp9Xng5wE3 vyQXiKC9lhQNT1h+p5BN6ecO6KR4 X-Google-Smtp-Source: AAOMgpcW5CByVuxjbPoYUW9XlvJJo7Ob0rwhZ5G4rSsxBEt4Xb7Xwx/oCR0OlbIrtyykqq4KOe79Xg== X-Received: by 2002:a1c:e541:: with SMTP id c62-v6mr9358768wmh.154.1530656171887; Tue, 03 Jul 2018 15:16:11 -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 i190-v6sm3771084wmd.33.2018.07.03.15.16.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Jul 2018 15:16:10 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 4 Jul 2018 00:15:10 +0200 Message-Id: <6408c8c42d43eba322aee3078a6f082c34da0eca.1530655929.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 27/27] eal: add generic dev parameter 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" Add the --dev parameter to the EAL. This new parameter takes a generic device declaration as argument. It uses the new devargs parsing API. Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/eal_common_devargs.c | 4 ++++ lib/librte_eal/common/eal_common_options.c | 36 +++++++++++++++++++++++++----- lib/librte_eal/common/eal_options.h | 2 ++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index 5f89e0b6e..bc3ba9fe0 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -218,6 +218,10 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev) if (da == NULL) return -EINVAL; + if (strncmp(dev, "bus=", 4) == 0 || + strncmp(dev, "class=", 6) == 0) + return rte_devargs_layers_parse(da, dev); + /* Retrieve eventual bus info */ do { devname = dev; diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index ecebb2923..89d608180 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -54,6 +54,7 @@ const struct option eal_long_options[] = { {OPT_BASE_VIRTADDR, 1, NULL, OPT_BASE_VIRTADDR_NUM }, {OPT_CREATE_UIO_DEV, 0, NULL, OPT_CREATE_UIO_DEV_NUM }, + {OPT_DEV, 1, NULL, OPT_DEV_NUM }, {OPT_FILE_PREFIX, 1, NULL, OPT_FILE_PREFIX_NUM }, {OPT_HELP, 0, NULL, OPT_HELP_NUM }, {OPT_HUGE_DIR, 1, NULL, OPT_HUGE_DIR_NUM }, @@ -109,6 +110,7 @@ TAILQ_HEAD(device_option_list, device_option); struct device_option { TAILQ_ENTRY(device_option) next; + int new; enum rte_devtype type; char arg[]; }; @@ -121,7 +123,8 @@ static int mem_parsed; static int core_parsed; static int -eal_option_device_add(enum rte_devtype type, const char *optarg) +eal_option_device_add(enum rte_devtype type, const char *optarg, + int new) { struct device_option *devopt; size_t optlen; @@ -135,6 +138,7 @@ eal_option_device_add(enum rte_devtype type, const char *optarg) } devopt->type = type; + devopt->new = new; ret = snprintf(devopt->arg, optlen, "%s", optarg); if (ret < 0) { RTE_LOG(ERR, EAL, "Unable to copy device option\n"); @@ -154,7 +158,22 @@ eal_option_device_parse(void) TAILQ_FOREACH_SAFE(devopt, &devopt_list, next, tmp) { if (ret == 0) { - ret = rte_devargs_add(devopt->type, devopt->arg); + if (devopt->new) { + struct rte_devargs *da; + + da = calloc(1, sizeof(*da)); + ret = rte_devargs_parse(da, devopt->arg); + if (ret) { + free(da); + } else { + ret = rte_devargs_insert(da); + if (ret) + free(da); + } + } else { + ret = rte_devargs_add(devopt->type, + devopt->arg); + } if (ret) RTE_LOG(ERR, EAL, "Unable to parse device '%s'\n", devopt->arg); @@ -1038,7 +1057,7 @@ eal_parse_common_option(int opt, const char *optarg, if (w_used) goto bw_used; if (eal_option_device_add(RTE_DEVTYPE_BLACKLISTED_PCI, - optarg) < 0) { + optarg, 0) < 0) { return -1; } b_used = 1; @@ -1048,7 +1067,7 @@ eal_parse_common_option(int opt, const char *optarg, if (b_used) goto bw_used; if (eal_option_device_add(RTE_DEVTYPE_WHITELISTED_PCI, - optarg) < 0) { + optarg, 0) < 0) { return -1; } w_used = 1; @@ -1177,9 +1196,16 @@ eal_parse_common_option(int opt, const char *optarg, } break; + case OPT_DEV_NUM: + if (eal_option_device_add(RTE_DEVTYPE_VIRTUAL, + optarg, 1) < 0) { + return -1; + } + break; + case OPT_VDEV_NUM: if (eal_option_device_add(RTE_DEVTYPE_VIRTUAL, - optarg) < 0) { + optarg, 0) < 0) { return -1; } break; diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index 211ae06ae..b1851864f 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -21,6 +21,8 @@ enum { OPT_BASE_VIRTADDR_NUM, #define OPT_CREATE_UIO_DEV "create-uio-dev" OPT_CREATE_UIO_DEV_NUM, +#define OPT_DEV "dev" + OPT_DEV_NUM, #define OPT_FILE_PREFIX "file-prefix" OPT_FILE_PREFIX_NUM, #define OPT_HUGE_DIR "huge-dir"