From patchwork Thu Jul 5 11:48: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: 42336 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 36DD91BEC6; Thu, 5 Jul 2018 13:49:03 +0200 (CEST) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by dpdk.org (Postfix) with ESMTP id 19D5C1BEB9 for ; Thu, 5 Jul 2018 13:48:59 +0200 (CEST) Received: by mail-wr1-f68.google.com with SMTP id s11-v6so1012407wra.13 for ; Thu, 05 Jul 2018 04:48: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; bh=BtXr4NfMI+ivRdthjStaMQ5UqenQ5lHF1Bj/skYUi6w=; b=l4nCO8Ih3hUVs2+WOuw0IzzakDXCrszC5BQvEVB/4MousRwkbQmxmL5uqBUWRPNfnA qziv+9803YD5rAaT0nwjOQzL4puy5jDrL21rrD3BxISMXxCDLMRnkH8H4BmxynBe3nXW 7LM/1K/te6cRjdAN9o4slCdiGhlQ9RK0Q753BDHMESxyg7QK3vnzStzt3cZhJ3lZsvTE BMclj39AdMCUFF1SB8ldj+4PoMmTlsC1GExb3zlQVNOsPA0HlsZChYYXaWih+wcxWZ/D ANWBEq/P3CpqFxMmG1dFPWm8hVntxrQ0nbS7ZThyIxtbUzz2UipWMZcbnOQwzrml3fV4 Abqg== 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; bh=BtXr4NfMI+ivRdthjStaMQ5UqenQ5lHF1Bj/skYUi6w=; b=JkeSGm4YEAlYnFKPrn6zP8oGygrJELk3JKRafIBjxL+b1mFOThhXU3V1SGOBBvrwRP 4Q9BwE8qL6qv3apdvc+acErfYucIUet6Co44M5X37h7gXGs7ftGf/8Qi1LK6pbavn+6L JMrBBuBrPv99s5Ue5CiTda4HU1Cbd0QQDq2r23A9zRPIcpbEyiyUx8jUXJNM0RyRIjC4 UUNbVShEnt206vfvwbRk1cyNbGer4qavOZZCVxR37R446fgg7yq32QPz8CiHDn/wCprY AkLZKIefs67k/saj6hf1HOkaeuMqpffkruy/zsA+9FdoHeLg3m6PzjaYSECNOPMpnmOD 0zBw== X-Gm-Message-State: APt69E3v3pt80akQHU7OoBlnu+vdNjbH83aLR/BPzyWVBQ7tQjLFYcus fIdN0NsPpIuHyh+ZLoZ5j/CVLBgh X-Google-Smtp-Source: AAOMgpdET1NPJVqA2r78UVnQFmvvS5f/iP8TlNk9hR6JR2biHMadzliklEBnSJ0r8W2iQkRo43U4FA== X-Received: by 2002:adf:8796:: with SMTP id b22-v6mr4541511wrb.92.1530791338244; Thu, 05 Jul 2018 04:48: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 o42-v6sm15809183wrc.50.2018.07.05.04.48.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:48:57 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:08 +0200 Message-Id: <4dd95d07b484a671a2be5d65ad12a4212093ada8.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Acked-by: Thomas Monjalon Acked-by: Shreyansh Jain --- 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 @@ -89,6 +89,42 @@ __rte_deprecated int rte_eal_parse_devargs_str(const char *devargs_str, char **drvname, char **drvargs); +/** + * Parse a device string. + * + * Verify that a bus is capable of handling the device passed + * in argument. Store which bus will handle the device, its name + * and the eventual device parameters. + * + * 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. * @@ -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 Thu Jul 5 11:48: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: 42337 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 6850B1BED1; Thu, 5 Jul 2018 13:49:06 +0200 (CEST) Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by dpdk.org (Postfix) with ESMTP id 2A5C51BEC0 for ; Thu, 5 Jul 2018 13:49:00 +0200 (CEST) Received: by mail-wm0-f47.google.com with SMTP id w16-v6so10583912wmc.2 for ; Thu, 05 Jul 2018 04:49: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; bh=V8N2JaBZxbM/kmNjb6RWPhqNiLeLC838ugWs18AVS7I=; b=f5N5RYKfxKvp2uEsiPiqmG5RV9SqaELr3P8F58Ou/dk9xPjkMJvxIW1tKGMSW+Ypo2 NlwVzUc9n60nnS8TW6GVmq8FbQ0CR617OSV7dhM5CdD/GQ7044WFXUBwaGPd1CdXIeMx luT8CjcjLreQkHtXKTL7Rm3/SKkDUqEXoX9caLFNuP2YuOkB6CwWY4uOhKPaGGxd0URl 6PzlWmTq9glXAMVqKe+9HMVWwEglRiFoS5LO+Fjmkh+v8HizAIwREgn1piDoi6m/St48 SCua0XypPfe8BeAV6jZltYky/qkdK5UY7eb6/tesVPQjSb78BligS9RlvOD5WOf95Ki7 VfgQ== 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; bh=V8N2JaBZxbM/kmNjb6RWPhqNiLeLC838ugWs18AVS7I=; b=DZiY2U1uEs86fQdZY5rAuVSJxJWz+prUm0QXjjCeE9gDa60k68cm/pCHArJmVqs8Bh Hs3wnt3N57Ag6WUIZrUoZAU4V9mWBs6hc8UZsqCkTe7mIoLudlg/Jq2VhGiqK+qijGf9 TZgece1H4LmHvu+ZfjJcsWf9y2v8zWjj0XMykXjuRYb0uG6/iBtcavMmJ58Dtj7tIr9J 2so/AxnZjU8pKub2M4LYPKo3MzKlmrEh2pRH2VyTVbmts2E8HBr6PFP87spt4Lm8ezsu uf3WaQANkyOUMzjtmHUss7AxqAASk45sJS1jXk/VllGf4q9tiQ2oMGLSuW27U1Wl3TG+ zOPQ== X-Gm-Message-State: APt69E32GZ6qdDbbFNKHyF25T/DLp6iFxDrV6Ih6EUABnCGv3GDGQAxL XPKmSA1Px0oWC5cnbNk3lFVJuNti X-Google-Smtp-Source: AAOMgpfXPlLaG+KuhWi0OdqXWut79WIkBsOqHDInZVdho8n85dHkYw/hbBZK0BUQhWU92PWPyhAeNw== X-Received: by 2002:a1c:b590:: with SMTP id e138-v6mr4074808wmf.154.1530791339252; Thu, 05 Jul 2018 04:48: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 o42-v6sm15809183wrc.50.2018.07.05.04.48.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:48:58 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:09 +0200 Message-Id: <219ee773c228fc32b7213bca5073258008126a38.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Acked-by: Thomas Monjalon --- 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 Thu Jul 5 11:48: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: 42338 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 324801BEE4; Thu, 5 Jul 2018 13:49:10 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 629841BEC0 for ; Thu, 5 Jul 2018 13:49:01 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id u7-v6so1013356wrn.12 for ; Thu, 05 Jul 2018 04:49:01 -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; bh=nQ98j6qRpUh5Sw+AkRzfOmFP69ilY/mlJDYmjk8fB48=; b=Zzoa3zVdlNSTxbOPtNC62c/1Z+4I3bPGhADSrPNM7tcF9p1XMTw52RvLHW+FRqPk3f g1ElxZwzAGQb7oSO/bsDD/b/2/W0N0skhFru8454rxS/dsec3jak81WytlU2SrT6TBtB GTyIbVevpw+iPL/ygswM+/57NXxkjedw3WD5sta5M52CbWd7qMd2gz87mVdDEgoCas7Y qUOKOBaIVrSNvGXJaaCMBIzt2Gm/a9dZMUodj6l5RfCLa61cxQoPH0pDFd0JXQOwz5wu 1lNfz/vmm1deMgfSNLsgQ24XyLAdyVouvKbjjJOSTKfwH8zrzsNU5f8KiR/Zz3VZSKEU OtoA== 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; bh=nQ98j6qRpUh5Sw+AkRzfOmFP69ilY/mlJDYmjk8fB48=; b=EJP1LUPrp69D0Js/O2SceU9IetDJ2oCbNs8lmTCktygPmT8AmNgvd5TPe4a2YRKdnG PHUgTwuq4MjGYskDkcXjp1tLkgbC/zLx83YhMzmIiATlQKGY3PT55OR5wQpb7X7xmQYF aIjexEz1u1iEgi2uhbwCZhVAEWJj7jgSAV0Nd0tQ8w1Q6yu39f9gFIDM3BnGvC4zRogz HPiiLBfrZj1j6balurrbT6qrED6ZyhrnqgDV2gYST2d8uCgaEp5+nTbLeDmz6R7N02fv 2DIJXxD1PySB5qKvXpReN2B7ququmeXRutHPZyeNX0PgwqR+Fe9A3FiiGZJyhRTIty2J p6Bg== X-Gm-Message-State: APt69E2SQC13UT63KEx+Vh/+Pb2jbBe+vY9leW9rVTxPwO7vdwISYeGT 0DsPKxeJwVnQkI6SYJZuSTwgOAyT X-Google-Smtp-Source: AAOMgpcVlHquwYSXrb+uTJw552ryupmQjcdoR4k4u/elx7+HjGLlcPPSMqfGzjAjcNmiG9S4Y+md/Q== X-Received: by 2002:adf:a197:: with SMTP id u23-v6mr4670746wru.50.1530791340687; Thu, 05 Jul 2018 04:49:00 -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 o42-v6sm15809183wrc.50.2018.07.05.04.48.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:48:59 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:10 +0200 Message-Id: <6180e28453a34b92cf179a5e2c820bc3f31422d4.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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_eal/meson.build | 1 + lib/librte_kvargs/Makefile | 2 +- lib/librte_kvargs/meson.build | 3 +++ lib/meson.build | 8 ++++++-- 5 files changed, 12 insertions(+), 5 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_eal/meson.build b/lib/librte_eal/meson.build index 4aa63e3d0..259bb4464 100644 --- a/lib/librte_eal/meson.build +++ b/lib/librte_eal/meson.build @@ -24,6 +24,7 @@ endif version = 7 # the version of the EAL API allow_experimental_apis = true deps += 'compat' +deps += 'kvargs' cflags += '-D_GNU_SOURCE' sources = common_sources + env_sources objs = common_objs + env_objs 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 diff --git a/lib/librte_kvargs/meson.build b/lib/librte_kvargs/meson.build index 0c5b9cb20..0a81e8da7 100644 --- a/lib/librte_kvargs/meson.build +++ b/lib/librte_kvargs/meson.build @@ -1,6 +1,9 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017 Intel Corporation +includes = [global_inc] +includes += include_directories('../../../lib/librte_eal/common/include') + version = 1 sources = files('rte_kvargs.c') headers = files('rte_kvargs.h') diff --git a/lib/meson.build b/lib/meson.build index 9d11571f9..5f7eb310e 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -9,7 +9,8 @@ # given as a dep, no need to mention ring. This is especially true for the # core libs which are widely reused, so their deps are kept to a minimum. libraries = [ 'compat', # just a header, used for versioning - 'eal', 'ring', 'mempool', 'mbuf', 'net', 'kvargs', 'ethdev', 'pci', # core + 'kvargs', + 'eal', 'ring', 'mempool', 'mbuf', 'net', 'ethdev', 'pci', # core 'metrics', # bitrate/latency stats depends on this 'hash', # efd depends on this 'timer', # eventdev depends on this @@ -41,9 +42,12 @@ foreach l:libraries # external package/library requirements ext_deps = [] deps = ['eal'] # eal is standard dependency except for itself - if l == 'eal' + if l == 'kvargs' deps = [] endif + if l == 'eal' + deps = ['kvargs'] + endif dir_name = 'librte_' + l subdir(dir_name) From patchwork Thu Jul 5 11:48:11 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: 42339 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 12EB81BEF4; Thu, 5 Jul 2018 13:49:13 +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 A356B1BEC0 for ; Thu, 5 Jul 2018 13:49:02 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id s12-v6so10651799wmc.1 for ; Thu, 05 Jul 2018 04:49: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; bh=pv6jnBk/zq+IBiM4PRxSCoZK85hbZX5yBbbjL1gSTQc=; b=EG9Mx8n/awR/qZjeDS6AyKvM1XdzYKK1g2ivkIk4wbVbunLpAn7y7dI8sxkVA+Rpny AQau1JcIqVjaTPmMmFxIWssPxXufm5NXFemujOumZgNKn+vRLMkWX+TNtrt0f210n9ju njxnq2j3VD35zge4WJzRzRdC/UKed5MRXOlbNa+z2TuSuofMDlCg77ERBzDRckcbRMIo 8kZKSxL7QBeUTfaaF6AE5GIPoQKA4V2/rUS47wjtkouAbNHuBGUnwFdkoTMoGdxqkint vVYuNU/k7uKhpGUry57PAKx3kmI/653ECRdFGEVgyj8DygXceGfcpvBP662bn8lpoYHL VgDg== 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; bh=pv6jnBk/zq+IBiM4PRxSCoZK85hbZX5yBbbjL1gSTQc=; b=SHLWjL9hE3XKdo9htbgqMCy0C4MUMMGfMLxqBv7MPBBnOn2CV4rEoELeLs6lXuaZg3 U9HEn+aKk9BJXZyDjuEpJaQPnqNQImr+SMEf+QFUww1DGSwupVO3kc8yRJjsLcjVIuLJ IPOq2LzVio63J43erzvIWgU7p0QyPPa1YF6cxSlrBGkm8wGNcFs0iPdxfarzYmngDis3 4c2W7OdQ4HvRpDgnht9bfbWnY8JDBbctm6sAAL5U+vJsfKrXq2/x9n4qCP5JLPOhPQt+ bQdQAD7kYDxSYlcjzVYD5gY9CEa1Pob+Xtmtkkq4ASPkV/xBztd+7Gkscsg0hBOgeaIg HPHg== X-Gm-Message-State: APt69E3TteeA9hv0G0l6zvit9oESl6MuFf24HNJz2IzHRYWbZrzT9jQ2 7auvAyC+4C5PngB8y0/opCljhc8K X-Google-Smtp-Source: AAOMgpf0awDB86kaFB+pdF4kvcPhDhRcF49UpIDPe68ID3bUkUH9981fnSq54jW/lbU87Jz+3D4PEA== X-Received: by 2002:a1c:894f:: with SMTP id l76-v6mr3817216wmd.103.1530791341928; Thu, 05 Jul 2018 04:49: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 o42-v6sm15809183wrc.50.2018.07.05.04.49.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:00 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:11 +0200 Message-Id: <6816f4a37e4f3869422377392689ec9ff3f25e7b.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Acked-by: Thomas Monjalon Acked-by: Shreyansh Jain --- lib/Makefile | 1 + lib/librte_kvargs/meson.build | 2 ++ lib/librte_kvargs/rte_kvargs.c | 25 ++++++++++++++++++++ lib/librte_kvargs/rte_kvargs.h | 30 ++++++++++++++++++++++++ lib/librte_kvargs/rte_kvargs_version.map | 7 ++++++ 5 files changed, 65 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/meson.build b/lib/librte_kvargs/meson.build index 0a81e8da7..a1c724961 100644 --- a/lib/librte_kvargs/meson.build +++ b/lib/librte_kvargs/meson.build @@ -7,3 +7,5 @@ includes += include_directories('../../../lib/librte_eal/common/include') version = 1 sources = files('rte_kvargs.c') headers = files('rte_kvargs.h') + +deps += 'compat' 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 @@ -71,6 +71,36 @@ struct rte_kvargs { 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 * 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 Thu Jul 5 11:48:12 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: 42340 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 E65001BEFC; Thu, 5 Jul 2018 13:49:17 +0200 (CEST) Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by dpdk.org (Postfix) with ESMTP id 200CB1BECA for ; Thu, 5 Jul 2018 13:49:04 +0200 (CEST) Received: by mail-wm0-f48.google.com with SMTP id 69-v6so10305352wmf.3 for ; Thu, 05 Jul 2018 04:49:04 -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; bh=ZtfNPlBkZCCYph80cHi2zc7zewiEPP0tLPgIMEpMWxE=; b=xe2zOcO8ZoYuKf5DYw2mOUs0Rr0zQYW8g92H2YfMlsQS5o4zovEbj+eznfWo8pg4q/ Tv9hLtEqF+p+9YMJoU6WY0eQtuwwyRLXcCF7sYYuB+TdfX5DQ9WyV+1srqu8l/X3OPHF 78ObfM2/SHuE6CduJ7V6j5Jlw6VQA1daZkC1546RBlSNuMxSlWvAeFGGjAlprhZYyvcG fgP2Tb61/hhqLm5X6asptnZXtM8SVUKGsIgGErh0fE/SWMu4vPD16uU9eEDjQ24SEsOg VjBlrMoHp1WlPExdJQPi+VFsOftl8pBPFxUibGk7WIiMThJ809YFWHWlW9sdH/0wY9lS o21Q== 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; bh=ZtfNPlBkZCCYph80cHi2zc7zewiEPP0tLPgIMEpMWxE=; b=tgjB3bA4SvZxFtmQ50V6jkDE+29uhlgfqWKO/vXpvpDBZQFqJOfpakJCqsCf9t8Qnd CYZtjpB/SFRsFb3l/heJ905TfVaxHBxZvtoIr7xJjQgbu6W7maIt0F9SCF19ZbTyXjKB ozRQNNbBrPma+HXy/0zVFfXGeywyJLvmVHVqNJyMRAlnNeG/0vO0behyO+owzXMfxFay rzjfbsWooqEDI+GDzuni6/jzuD2ljMzL2RhLi2t4D24sCtcPkPkQdt26/ZbvC3tNCF+l IuAlCpu8gd78tfOisOKoEX+5u1LAOhL4wzX4HjkMceX7P6D7VH+g0bL+4O2hFvNwFMXb cH1Q== X-Gm-Message-State: APt69E0LkvigU3dKE3YEDAVJGYF5jAeA6F2dwWa2PN4f3FTTD4qx8wLu M6RjtcnBoB6spah8UMGFEucTHauu X-Google-Smtp-Source: AAOMgpdhtRTxQCGizUpJfwLSgDWmER0GesIwbyqDiyoLoREF1K6Tud0Rdk7kf/aZpVNtJ+sZmPQ+cw== X-Received: by 2002:a1c:acc1:: with SMTP id v184-v6mr4333312wme.114.1530791343475; Thu, 05 Jul 2018 04:49: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 o42-v6sm15809183wrc.50.2018.07.05.04.49.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:02 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:12 +0200 Message-Id: <42037d90036505fc764572b8a4c8b25a529c4ec7.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Acked-by: Shreyansh Jain Acked-by: Thomas Monjalon --- 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 @@ -111,6 +111,29 @@ static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void) #define RTE_INIT(func) \ 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 */ From patchwork Thu Jul 5 11:48:13 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: 42341 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 0ECA31BF06; Thu, 5 Jul 2018 13:49:22 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 6AED91BECD for ; Thu, 5 Jul 2018 13:49:05 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id q10-v6so1016610wrd.4 for ; Thu, 05 Jul 2018 04:49: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 :mime-version:content-transfer-encoding; bh=U7kPLkEjGpmnvugg/iDJyH6BaTOGs9Tph70S2j9iOqc=; b=ObD4wLMqJ/dLxl1RHXvouibAtijZUIagUdRw2alii0bv0oWi1VVuZsGCtwdbu69hwT 3UDuOSqLn56/eNE7E5ts5gJvW8P3eZDXJVUTjdvivryXXLiZudPW9jA5/YRgCdgby7ck nJbA1kts+7ySEqxGRFfWrqDSgndjr2Ulf9nMcZVd/Src62G6xM8iEPMxc4k7R7M+rEjM Gb7sYzgsw+6I+Ayl0LyAwswl17u0NmVkGIjsZOXXMXA9MWCkjK7f6oK4aLt8zQoi8vGZ TIoO+3yZD7oHhglCLfB+bZQGA1Pu2nh3TAL+f2d0rCD5wS5fxSfZRYch9MVerQstQvlz wJiA== 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:content-transfer-encoding; bh=U7kPLkEjGpmnvugg/iDJyH6BaTOGs9Tph70S2j9iOqc=; b=h6k0r7ZR3wlXwlUprXnMnf/Q01J9PuOxVLTivgaESmfvlIgMd0A/34MvHsmjlHL1ix m4ufukZy7hr/MDtkbbZImWhtDAZ8BcDVh3HnD/bJpXvcJlvaNlZUxqmYmbVUEQ+R3YxT rYw/WU5P/mzDdY1nsB5nkJYZG/0SVwYrZNg+pQLsJ4ozm4qVP1II35fjNAxVSUGuCNrJ 2J41Ew/3NyKjyJlv+ld54ym81O0BJej4SfudaTjkUaSqk8YdW8FiQbYa8toKeOvSIRCx L3nv0YOgpGVauLAdpD6trof33w23Qugma7IQxGjRdD+QeZLJnwfXtYXR6Zf39tRTUMlF s7Aw== X-Gm-Message-State: APt69E0PXyDKLORn32zZPerPwgxLJcCXEvFW+ysCoOc5GHRBSbNXBJuk 3Vm3A9+tNnWXMt+b76l0OIT+Q7L6 X-Google-Smtp-Source: AAOMgpdihGeTGZpmUJXW96SrVRsJp4QVPpOATv96Wv5LCktKlo9vK8AtE9qg5J52gbkXyj7aYtp/5A== X-Received: by 2002:adf:80c4:: with SMTP id 62-v6mr4124708wrl.95.1530791344713; Thu, 05 Jul 2018 04:49: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 o42-v6sm15809183wrc.50.2018.07.05.04.49.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:03 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:13 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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/common/meson.build | 2 + lib/librte_eal/linuxapp/eal/Makefile | 1 + lib/librte_eal/rte_eal_version.map | 2 + 8 files changed, 191 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/common/meson.build b/lib/librte_eal/common/meson.build index 8a3dcfee0..3009cd0a2 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -8,6 +8,7 @@ common_objs = [] common_sources = files( 'eal_common_bus.c', 'eal_common_cpuflags.c', + 'eal_common_class.c', 'eal_common_devargs.c', 'eal_common_dev.c', 'eal_common_errno.c', @@ -46,6 +47,7 @@ common_headers = files( 'include/rte_branch_prediction.h', 'include/rte_bus.h', 'include/rte_bitmap.h', + 'include/rte_class.h', 'include/rte_common.h', 'include/rte_debug.h', 'include/rte_devargs.h', 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 Thu Jul 5 11:48:14 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: 42342 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 4E78D1BF14; Thu, 5 Jul 2018 13:49:26 +0200 (CEST) Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by dpdk.org (Postfix) with ESMTP id 91D011BED7 for ; Thu, 5 Jul 2018 13:49:06 +0200 (CEST) Received: by mail-wm0-f54.google.com with SMTP id n17-v6so10381492wmh.2 for ; Thu, 05 Jul 2018 04:49: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; bh=FcfHZwJj2++2zFd3tjiryPVfINYFEtqKre4w5Koeb+8=; b=BMWriSxcPtsU59MqYjUeNK1vCq+mrhon6FPuG0ZUrVUktAm/ePJv32F8Aq3MLFw3SF 0odwRpi6i4Kue8A1TYGtSrGZtWK+6GUgwAQ1tWuo+CcRvxahPUbg7I6oJ98UxFaeloS9 uuiGDbmcAHXnnOMhmUVRtP1wlLFIcfis2mQMTgIR6PY5Y+Sbb6xioOoH8LOeDyX0NkXg 9LmofAgKjxpGwCyj7NdHy/gOTAN+E5g4c4nWlkklZZYCT6Uj/enRLF6tcmJgMcFUmQ2F /fOQLgNGgJZa2FmVXqvMis43cXRYsL4tvuiGqvjPkmsuXCPSC4MBNuBHXMCXeg731ZBK ofTQ== 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; bh=FcfHZwJj2++2zFd3tjiryPVfINYFEtqKre4w5Koeb+8=; b=ZwkWT/WdtcQKZk77msd2/0qZXG12t6OpTnBnagec2+sdjS9DkKHq4frK2hrC2+3WUg V4GMuwzx0GTc0GJhpZZ5x8fm0blMQCeAV/UimJQfy4gvfZopUAwnGSR7a/KGzQ+orK92 3bg/LZwK0M/V7dqnISwEUVaFhR5k7u2fgajzLPCXG8c5Q4FOI8V7dImEZudSQ/naV/wo 7hzTMEP/uaeMZqZbjN4f74NQpiR9j9ith7YV+TmVYPy3WUBSwHWu4tin5DKg60JrcA9W jBJjr6cTwx3I3nBNgWU1uW+nBxnGvg4+YlUmDfX+gEA2MPkCF9PsT6jyB4fIThqfyIJq T2ig== X-Gm-Message-State: APt69E1U5hb6l3N+qRaFH+OklX3sD1BgGVyrpusp9Or26UamoGGPVd3M 7omoTyW6WEals5uK0zYjW8WT4wun X-Google-Smtp-Source: AAOMgpeqHG27zYmBMz/+tKupCXt10wM6C8pLvxCjm1kYZe1xPOz37UTgFQm7MWAJuyrbT5p04siZrg== X-Received: by 2002:a1c:82c8:: with SMTP id e191-v6mr3635736wmd.35.1530791345953; Thu, 05 Jul 2018 04:49:05 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:04 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:14 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:15 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: 42343 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 3F95B1BF1B; Thu, 5 Jul 2018 13:49:29 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id C50661BED7 for ; Thu, 5 Jul 2018 13:49:07 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id v25-v6so10655977wmc.0 for ; Thu, 05 Jul 2018 04:49:07 -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; bh=YM6KHRri73F0XIIpq0JTRiq1BBgfRhxoV9BuSy/BjHA=; b=S7f2A1hMNHZPD7JWlpLmigqSPHk7EXrue2jVgLcrdUTPd/CpZ5s/hgB6qo1yHLHVD9 q0g3cL+l3/Qt8WqQxWEThqanPcoaO7MVizmICUNQ9TZ1Vb4PMMAiPPy/DOJHsADuL8nN buYypU2NJFbQjO7h50tAkjSyY6NlkZmwjusp+xQc3qdXcbpiq6PyyvN3mPEOXuJK+uxX h0aU7iSZXbT94zuv0dxf7YSwpzd0cx9AEGKzIxiFcNbuoZxgvRHn9CFlrNToFwVnEexD jeedCe9b2NriKqgbxYGkJpW9zy47feNtVt6sqnyPBKQxNzd65zYtZQQ8aDj6lsBJf72x BRHw== 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; bh=YM6KHRri73F0XIIpq0JTRiq1BBgfRhxoV9BuSy/BjHA=; b=QCURQxcrRWB6g9l8/6jpm77P99nZUCx9oe33R28slkwK+SjufOjlWLQp/qOoM3WNuz Io+q5D5w1G0UZvXTQvMNrhjpK73U9esBZCTs1j9Lz3r5pFdbD4mPdv0pVJYv1S9nRUFe 73f2Yl1tOgP620yFtlx4FBL3OuB5NMKbOOFlXaMbnynwxZxu8n5JGfmDuzc19qFy3Iks gowPrK9epZ9vdmrU8ThREVpD+EvqLsc4Cmm3Zwx0iI/WUTPQl4AmXtBNwAL0oeFSExAV ydW1MAMaT7ToxB4Fr5hOssivAOGs7e4flw4d59ZRmLlinw38muoGD2mhv7QdM5OC2uN1 cZCw== X-Gm-Message-State: APt69E3pEi6THsdLGzjxv8lEijgxYwz7YWcXgxtC14XSEvsjlo6R78q5 GklmmAQnJeWReUVDSC/BQEDZvFJm X-Google-Smtp-Source: AAOMgpfDlmfQBdFDy3sjDfFALDE1UBYPOCuVUjE2PJ588lTZYnCBxEYFiWv1+VGWOi+TDe1+JMXfXQ== X-Received: by 2002:adf:e285:: with SMTP id v5-v6mr4066413wri.54.1530791347135; Thu, 05 Jul 2018 04:49: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 o42-v6sm15809183wrc.50.2018.07.05.04.49.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:06 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:15 +0200 Message-Id: <0a2d77e22658987a6e1e650913f020a140c2c1a9.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:16 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: 42344 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 D59DA1BF2B; Thu, 5 Jul 2018 13:49:30 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id 414061BEDA for ; Thu, 5 Jul 2018 13:49:09 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id s12-v6so10652275wmc.1 for ; Thu, 05 Jul 2018 04:49: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; bh=ZaTY600S/w2aMPXxpxdxYg2oJRiJH9R4k/SlAVvW0/0=; b=Lc8RvlDSpO32FC1v0dCccIYJG98iAbGMPOLMJUdvZdI/XkgWkxECrAlQmMZvBAtuyG FbUMY6GLcrq+LZA8ctigaKTu+t2ZbctgBqFqNCCwTjFHIsOOm2h4mJvxfUheGFfN+Vf3 1UP1MYfyW1qqLg1APdaP0iJK6hv7D0KntsU4Jzy10bLpvjsOy8BJoxoXAFoLRqQboKSg Xs/9dkpdjl7cYF40ilvI0eFCRoP/TRPiBl1yqP32cjIySp9LpqUFySDW5/R//JjwE5+d DgYsRKtJXHRgQsdGvtv2kZzv6HQPKyMBzBhMCXplzKYF+sMI34pjX0mHhUqhTwumGKv3 vVzg== 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; bh=ZaTY600S/w2aMPXxpxdxYg2oJRiJH9R4k/SlAVvW0/0=; b=WljtjKOo2tjrYBbXQGJUmyMFOtxL295sGcmZOWvo2134ltfl5d+EUSLx9kuI+5ZJXs NE4h9YMQLU78W1l87QkOjHCMnpYd6BDW9G+U+xXARfrpy6N2BF199BO+osa1ouwN7MU+ jZYYW4ZOVq7Jp9Yp4qQePLpLZBXUtesr4xoTqOv2e6qUYsBAVVwGCPwOwzpZ03rdkACS skg2xXmRyD2N1PYJm0GvdaEbhSgTAhgVx6i5J0AqGvefgaogx2v3M8+kJLcgHeShiiZE idN/5hpgzFaWZFQNcRTsCoNoGxriAU/Pli1sggpjzyST4jWI+5CZgLr1h8FNd9zqYzoe Bu3w== X-Gm-Message-State: APt69E2g6HTpMVy4hxNh9M3lj0XyHIvNW4zuHoCILicFYxenhkp4T4Yu HuNGXpthMGPSS/WCNhNYc/RcTcXs X-Google-Smtp-Source: AAOMgpcJZhw+TlrX+HV37JajCBK3V2BzIah0YUBubCphjSZco11IvXj5MSIo6xamtuJoRx5gRU0HCA== X-Received: by 2002:adf:b726:: with SMTP id l38-v6mr4517669wre.115.1530791348442; Thu, 05 Jul 2018 04:49: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 o42-v6sm15809183wrc.50.2018.07.05.04.49.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:07 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:16 +0200 Message-Id: <133ee7dfdeaad08347346daeb088d1df0d042e55.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:17 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: 42345 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 2EDB81BF34; Thu, 5 Jul 2018 13:49:32 +0200 (CEST) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by dpdk.org (Postfix) with ESMTP id 6B6451BEE8 for ; Thu, 5 Jul 2018 13:49:10 +0200 (CEST) Received: by mail-wm0-f67.google.com with SMTP id s13-v6so1501169wmc.1 for ; Thu, 05 Jul 2018 04:49:10 -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; bh=gV/YIctDTEJxi5C2BAbanafpE1KVankgD3vSzsC/cXQ=; b=SKuS9ubFl9kUguBmC4IY6LpKN4T1eZ16NSqfQ46n4xZVsYyp7wwBh206vvX86KLobJ zt+djowX3+5exqp/zeUkkBHyU0amyTJApaG0TeTuSjZePVqDGFCHXHNWf01kkdiKY1Al BPRjOoyQqiN71cHbCHCHBMoMWvfUvh8TXTaYL6bXXpKUMH8N+ty5Qj+qvKh5pFS95dRE n+QUOZoTXCcNlCmjxw5+WGfvnHH/6WRCQyrV2uXEZTXctZLJlJAOZpzUFVnZ6uHusn5E yM94fs3X5TIxqrdox7aCV0LcwZI7qro6vj273ick/ThalG7jjXsu10fko51jY/o08l9u evwg== 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; bh=gV/YIctDTEJxi5C2BAbanafpE1KVankgD3vSzsC/cXQ=; b=TXEW4HDwcSFL4qbBvNjjuHSkpD6o02NWDslXYCKnVWSLIIxMUFx6zBCMDJyYvf+aSE kFvSY3CzNZ51fziFabJ/8PBqNt8WsQ/NW4KVlmOrjKmCrDxNoPlerGZSuj/1ds033ykn LLWclycmW+zC5TldggMdA8wrkhYxjijcFRtL55uyr58O5IAtr7/AhJTYLV3WKMN25Gzq fvlBI1Umq6lxCA9+8O8gMEVkvPTueDpoovjc9iEJXmQQ934taO6eSsdVBia/nr2QxxaR aJ62AXSupJxeNpvKvuuVg3RXFDiS2h7Hkf6TLeS3Y7AAPn3qY27WyUhHtu/pOkgBJl3K 8f7g== X-Gm-Message-State: APt69E1MsRUKOUmpKt8cGBSeZpKbL3UdzJaoqKjOs2mqX6NQL0WNw/ft VWtLQKzjoUpVKzsvJxgqv3qqMHc5 X-Google-Smtp-Source: AAOMgpfbxWpF1XtKaAcf/RR1Usl4MjIvXuk3uQ1YpnXluTeokHXRO+XR/DSeSWeqTMKeH55xP9wM5w== X-Received: by 2002:adf:9d81:: with SMTP id p1-v6mr4372609wre.12.1530791349794; Thu, 05 Jul 2018 04:49:09 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:08 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:17 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:18 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: 42346 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 577CF1BF3F; Thu, 5 Jul 2018 13:49:34 +0200 (CEST) Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by dpdk.org (Postfix) with ESMTP id 819401BEF3 for ; Thu, 5 Jul 2018 13:49:11 +0200 (CEST) Received: by mail-wm0-f54.google.com with SMTP id p11-v6so10304617wmc.4 for ; Thu, 05 Jul 2018 04:49: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; bh=eMfldAQipU4EMMeoXzQ37imMfcBAGhww6g5+cEKj1Fg=; b=pZBXOTkB24gh2YjHsGtffARV9SJNm5gsmdLqP57hIeXD8vx0iTJCiU5fdapg1BBZu6 oly6jXGG15YyNXu4mkwk3pNw26RNJgCIDt5ekx6vP6lw+X27sHaRb72/CaXP92Ow/uMY Z4iiSMXt2hpAXS5junuH7W1k+epPS8lUf2T9ntX37Bxt8+rx4cM1mb/iZCuDZuX5AUUa bh6Js8uD7rclO1H1Nc+7/bC0zuMIj2COkA/2shAgt0mPuwG1OVk9w1Q+ciK8Oe4KX972 KhPjX5xRbmmJZ3pT0L35PxhXhDj/zu+9F3nFX4T6QjlsKzkHw7dgZ4jOVV38Ua6ompLI zzRg== 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; bh=eMfldAQipU4EMMeoXzQ37imMfcBAGhww6g5+cEKj1Fg=; b=VIgrENezCDXAmy4LhE4TMDVz6qanAX9Mvvj6kGUq8bBjvW6U5v22xE1v5VyJ6vPpXY 08iDq3cXUS87Gt/BW5KJGCVsypRPU/6Wp8c97FMpkAKEywzUr+ZLFDZ730CaFXieEDOg uZOBRHjCOdjhmhVpifWVpEJsPZhDV3ArmmiiP5077phFMI+tzLeliYtGq9LfKilFQXGZ ppx60hc1W2g+skoozObVmHU6rKdHTcKjowiTQ+6SeNB5DFBBdehYiSIFiC04aLtT2lO5 JVAUeImdlii5PToQNQuUq0tHRrjDuMretNWtnW8Ow/eCsCTfz0R67Yc5qKnbM6kOxPlh PX4w== X-Gm-Message-State: APt69E2LqE9gwnKsuTfzFjSSlny4WfA4yC2nZdx5+/I7BLb7ipFIUzY0 9M664Axgesv92BE9WfK3iZdxOJ19 X-Google-Smtp-Source: AAOMgpcHNfd3ccAf8S2JEpek7g5+Uc85Dx37+ccoGWATXCFTuJ5OdsAJgWu/IEBBDcnR+zNCMpShVw== X-Received: by 2002:a1c:415:: with SMTP id 21-v6mr4207387wme.128.1530791350897; Thu, 05 Jul 2018 04:49: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 o42-v6sm15809183wrc.50.2018.07.05.04.49.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:10 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:18 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:19 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: 42347 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 885611BF4B; Thu, 5 Jul 2018 13:49:35 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id E9C9F1BED9 for ; Thu, 5 Jul 2018 13:49:12 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id n17-v6so10381943wmh.2 for ; Thu, 05 Jul 2018 04:49: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; bh=rgl50crsTMdz8uMA9l9eRovWUssSsKezern0x9vWcy0=; b=NZ4cPeTqOlJXodHD/PdiGgl4IuX4vLNOJJtXQ1TEfZmr6xSvawuzptY3WRzaeB7IPu 7cnxfqLeLaNT3hfjdIyY+e/f8K2rCLeEH/b7CxmXSxjLMnZ8SsFJsC5MgM6/zE171rnY UWWK4mm90ubTAPQXrWKy181FCNn2GC5EuqyUshO6oCUu7SXNdkvTJoFEFQqyqov/qyuU rHiZL+IFI198YqKU8gGKMrrvyEx0BtoREccuPCD2SU7upZizyhWWcBFRkNQHYKADEHne fRQNXsXr70hcnDCsc4qrMaobB41jcFPqwp1VlvL77KCiQkGchD95a3EkfvDIQdedlvCu 9lcg== 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; bh=rgl50crsTMdz8uMA9l9eRovWUssSsKezern0x9vWcy0=; b=EnknH8VVglcxdQWV5qauhIKRyMyGcyCGxv1DZB6WnAwS0wLWzzwQLbfYp1ko+iyei+ 3IN2d9JVkXpy3GzQFI8x6PILYC3aGnLd8kzIXwLso7prOZh6fscv4kM60nunU0fzQPF/ 8FMfWqdWtcZTbKbVeHSART9BQi8EJwQHDkQFc97fCvIJ+PYNhk91lfjaqgfL7A+IhYKe pKBBgVbdkwweJ0v0A1nn8EdHEGUAol1/B4BFsdDfjP70MllHuQfqZftIFKN7nzKyOTBW SnO7xqMDl8ho+KwXPPL2bGBowTPxP09iFMzJLd8ULxO4pH8UitHxpN2vPQvtYFnuH71y ODXg== X-Gm-Message-State: APt69E00m9y9sXZlPtgjrC1IrMx2BjbI8mLI96IFuazhT3aVwaWwlcHx eNiKRfA3UhpJBq8ll7HFRbeTFMTT X-Google-Smtp-Source: AAOMgpcOfMkAalTWy8dM0VwTmI3ClkiTB3t0SRLuoi980Fszz98gsNevsDPH4GxTYIh879EqG6wh/Q== X-Received: by 2002:a1c:8893:: with SMTP id k141-v6mr4039172wmd.36.1530791352298; Thu, 05 Jul 2018 04:49:12 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:11 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:19 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:20 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: 42348 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 E0DF21BF51; Thu, 5 Jul 2018 13:49:36 +0200 (CEST) Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50]) by dpdk.org (Postfix) with ESMTP id 351021BEFC for ; Thu, 5 Jul 2018 13:49:14 +0200 (CEST) Received: by mail-wm0-f50.google.com with SMTP id i139-v6so10576760wmf.4 for ; Thu, 05 Jul 2018 04:49:14 -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; bh=lW3jHlnRhfN2aBmSCSE+TxwoKO+DJP6lU7B9ktdGrlg=; b=hK/nQ82gYGma+p5mJ1kBRWQK/pzuGFdsq8eLT+xo7ffU/F0qfwbo9MqoZt+ogMpeRC xUHr1oUsqKVUQMVQmzbIOtz45B0/ggpgN6wK1XHukMo1r0sDUPpqm8PlebtOH6t3lh+V 32O4BRB6oWLhpxrA5+8jJL9v4k6aX1gJGaj5akRXAVzn8KLRbURHH2r5JTlkss6qto79 KmbB2zf+MfAtig+hDggiOHpIvOcpLqC1vBiVRH8Rte7bULoQ9EiDkayjClGqfKlM445i 0sIuBpQMG2QnWARAIeWWkCde0CXyBUCSMTuTzICSVub7GRaKMBiqlh/4Nv7y8+FNH+hb kfDg== 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; bh=lW3jHlnRhfN2aBmSCSE+TxwoKO+DJP6lU7B9ktdGrlg=; b=lqlaCygqaphkEy5FUHu3DbOxlrm9akzplVEi/xdeabMj+G0zor4hiapr9hwIirpLpD Kb4IjUeZAWLzjzW1GyVWeuUp1tJDihlDqPG3f7nNl9m3booYcGSmadhUZKRs2t9LUtE9 XpqAYe5So1snoiCmP2aA0YGouhJ0PyQrsbbvIZfNzwq1NjydtWYeRinOb9POT0a0o0LT r51repxCtcumIzbQlCM5EEGu4QGTH6LiaI2Z7DfgiB6PtweNdtD3pkJ4UMPVmAie8bLJ W5H511l5dEDeYu/0NSZP9b/hIj5yFwZmlAc9a2Cph7WeIEcJHdNRJ6OpcqmdMWVyvEX8 1xhw== X-Gm-Message-State: APt69E0E2MUMr4JZlHeAYK8Rrw7+96kOXlGo3YeqOPwC1Ioam4UMPGN6 M6eaACWuB0OEf6OrpAydRq74qqSr X-Google-Smtp-Source: AAOMgpewfUiwkuk64vVqW32CKCCQx7OlgtyKb4fpPnQMufzYADo3VqGGSOxGdcPY+ixjLAa2Fd+3hA== X-Received: by 2002:a1c:9c0b:: with SMTP id f11-v6mr3881376wme.148.1530791353490; Thu, 05 Jul 2018 04:49:13 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:12 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:20 +0200 Message-Id: <379a32c4447eed32b982d5d04b0cc0be2cf38ce0.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:21 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: 42349 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 5ECEE1BF61; Thu, 5 Jul 2018 13:49: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 8318E1BED9 for ; Thu, 5 Jul 2018 13:49:15 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id b188-v6so10645864wme.3 for ; Thu, 05 Jul 2018 04:49:15 -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; bh=ro5b/V/df5FS4FmkLaHb19yi4/xQrxaDntciNRLw1E8=; b=IPlNdmKKQ0NcBfpyjoTjvaFsLVt3D9XpD/HDv9Fgwv+TF1Cdkhn+7sydHKBIkX5Eo9 z+yDBRUGWvL8ovkgsMuwnh4tZ0TxZ/XfccAfPXG6h2SJqo+kP6j2FhKNLXHp87oZ8u7n SnYCYCaHuNqGLNO6hSnG4scSDn+7Jt6QSKmmVYsbapui6ilVOPX03/l6TnrV0dbNdka7 farKGuXP8hq5XYzz+q/wewiKElXk1++vFG+tybNb8tmX7wR3yeKLmzXGKho9ec+OoyIS rSNJxhFWvK+o0LdH1JR9D0TZS943Oiqe11pE5jXiKhAM0jznKcYoWD4eysAO+hLfmJqR c9WA== 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; bh=ro5b/V/df5FS4FmkLaHb19yi4/xQrxaDntciNRLw1E8=; b=RwiRjixHVHj9BpNCRMxf2ujnUFehUJDr9jN0fDbTRCjQ/NRdIN4O3y2KXDZtNuPhvc Z7g3PJBYi6Y8KSUwFnbyi0hFGAW1NSVgqqPintsUeI6oPgoXC8QzYgRh/mjzjNVMpNla V0j9RujtUpQolSpMAFYbtwJ0/X0MvEYiQDsGCtm/xRlYzqdQnfdVQmMufOP+MfQqBHl7 oYVrpfHZHax02rQwDMKXIsMfUisk7AwPglQcpcumetLzgwR4B0GcQecIW8tg0MX8MvFC J5QkNhrFaHD+goqy1OlUXFk3YiwDFLogmRIu5VWOON1avFkfJNC0IJVLIHMW8Pi9CKBQ vSLA== X-Gm-Message-State: APt69E3y5ImNIxeocjX6E/Q05eICcis3hazIkMv2IAAJlpL2htYT81MK n9tjqXp82gajmdKupabBBaxJNhFj X-Google-Smtp-Source: AAOMgpc/tU2iYETThxUzt342PxMcrZdZfANdoQ93yHftNScPSk9H1foPReiYf/366V807vVRXI7/ZQ== X-Received: by 2002:a1c:894f:: with SMTP id l76-v6mr3817662wmd.103.1530791354813; Thu, 05 Jul 2018 04:49:14 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:13 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:21 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:22 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: 42350 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 C5B031BF76; Thu, 5 Jul 2018 13:49:39 +0200 (CEST) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by dpdk.org (Postfix) with ESMTP id B3AB51BEC7 for ; Thu, 5 Jul 2018 13:49:16 +0200 (CEST) Received: by mail-wr1-f68.google.com with SMTP id t6-v6so1015562wrn.7 for ; Thu, 05 Jul 2018 04:49:16 -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:content-transfer-encoding; bh=h0xkCD8pXmexmiB8DVL8tN3zJgZ4vg1US2nLekosT40=; b=j0gGLS0fwrnffTg36lsRmkwtx8ccsjov4POB6g7uNXYRO6xAHucBPYzZnlf5XwTLUB kVMzR+UqwxN3nHPTqbiD4BlWOrneopKr5leHudqufIASX3eqzV7IOO5mbHNs2j8Lr0Di PdL1dwVNffV0d9vJbAYwsaOkiUR1mM3X1MUVtDqtvJfJ0LYcKb4LTYAutzZWbzyyCGXl 5YwgFbUts/5i0KnKS5P+FzX/DAx7Ci6/szZNSH1EF8wdqzHv8bjvtqyQgwzn5hWOZwdY zSSTejqzZK8XH1NJmMdwPv/UYP19E7w/A4M1prv5G+XGrhZKE4Eapet27Pk32RF5N871 qejQ== 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:content-transfer-encoding; bh=h0xkCD8pXmexmiB8DVL8tN3zJgZ4vg1US2nLekosT40=; b=Rp94LFlddtc3mRhhTlor+h0syMBX2Ic4xTPNskJt74OW6dF9uyuz16AkgWCK3zBRpd vxgIfH4DKvSMbC7YObActW2tupfwYu9/uIBM9ayU3U76i5msh/wlsEhSQ/HJsAEY+dI5 sQaQnGtNc15iGN3RAJNJ98IqCu7/bK/Vv67dirv9jfro4Vaz4hppCZFo+2dypGYNlpqk s91tdCsM5ZJXap3o3on4gM5M2852ZJtTK6fvnFadbGE3qd9/KosHUS7z8Jeq6V+s9Lny 1TVnRBVWy9KSiM2itwDOq01qfOYpdNdlLwmCOjAq8XtcJGlCqPYSVBfliHr75oXAgOWI nqTw== X-Gm-Message-State: APt69E3aGbXYaW2sJGmAtbLAGsS4A9ppwYXPceNvPWOg3drFH/pDcZ62 xEVzv0gxLHOQ3hmsL+3nv4bVMSmI X-Google-Smtp-Source: AAOMgpfnYSlkFb0y8lvzlHbE9ShVzHS7zE2yc4evJvaZCtUH6V2nahJLOxhOZchHB/1YaxycxSfUKA== X-Received: by 2002:a5d:4b50:: with SMTP id w16-v6mr4300655wrs.87.1530791356026; Thu, 05 Jul 2018 04:49:16 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:15 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:22 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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/meson.build | 6 +++- drivers/bus/pci/pci_common.c | 3 +- drivers/bus/pci/pci_params.c | 53 ++++++++++++++++++++++++++++++++++++ drivers/bus/pci/private.h | 25 +++++++++++++++++ 5 files changed, 86 insertions(+), 4 deletions(-) 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/meson.build b/drivers/bus/pci/meson.build index 72939e598..23d6a5fec 100644 --- a/drivers/bus/pci/meson.build +++ b/drivers/bus/pci/meson.build @@ -3,7 +3,9 @@ deps += ['pci'] install_headers('rte_bus_pci.h') -sources = files('pci_common.c', 'pci_common_uio.c') +sources = files('pci_common.c', + 'pci_common_uio.c', + 'pci_params.c') if host_machine.system() == 'linux' sources += files('linux/pci.c', 'linux/pci_uio.c', @@ -17,3 +19,5 @@ endif # memseg walk is not part of stable API yet allow_experimental_apis = true + +deps += ['kvargs'] diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 94b0f4143..5b7854490 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -29,8 +29,6 @@ static void rte_pci_remove_device(struct rte_pci_device *pci_device); -extern struct rte_pci_bus rte_pci_bus; - #define SYSFS_PCI_DEVICES "/sys/bus/pci/devices" const char *rte_pci_get_sysfs_path(void) @@ -437,6 +435,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 Thu Jul 5 11:48:23 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: 42351 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 0B8E41BF81; Thu, 5 Jul 2018 13:49:41 +0200 (CEST) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by dpdk.org (Postfix) with ESMTP id 2B6961BF03 for ; Thu, 5 Jul 2018 13:49:18 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id s11-v6so1013028wra.13 for ; Thu, 05 Jul 2018 04:49:18 -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; bh=r4ztlloUtcLCOt/o1+wTBrXUXycouEUdDNJOvdSjiec=; b=I/1ZAKgkd6jpRMcC8BN8bFPo1NO+N/XzKffF3owwJ7zNr+LG48iBH3vRYdB2sOJuXe ilIRVjSRXzq2O+Hf3674W1Bl9beakpCPKG7AxM9volR+9rUxj71YkL49R8B4NzlLvsiB 3AfLV4bto0UE5ZyagkqrzhyFpPJo3o49fMwqOsLSa/67Yj1oTonRS3WY9KBGdLI3LZj6 Gvj2mGYidvfk2A/k7RhNE7/SDdNw4MrfguSgRL0limmrxNFvBBIIJteVvPmgSwPAw0PC fhANMwAjdgRKhcdRGXJXfmomz35rQxZERlcm/NvbXzfzreuJsJ9YW1UMs655pKBQpzuK 2L0g== 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; bh=r4ztlloUtcLCOt/o1+wTBrXUXycouEUdDNJOvdSjiec=; b=D4rYO6YvQ/oMs04jQmrdqSa7BNrkMWwM5XT0S2yJp3AdGQfCw4BJrHylhFOUOJLwTG IU1oaRPCxnQdr0D5Q/ALqkdyGprz1oSsrH7o6TT/hLwfllRw4fdDqjOTYC82drFgry2a QSQcRl6IGZ0qTiKEjhoM4VbsFw7I37EzldQq0bbmsLOvFwjAKs5/SWOYOkqqenEJbmGe Do3Vs2/e1V0++k/A1GVUYD4sPfF4cpoDCdNgT9/T1iOZvJddqWD3JPidNCfNLP6Zc9QK mMlRl+rt+jo9KXR3jjc3q6oWtRuEN7bM/ym/Nd+o5AyZcA1MztHj6E2YxM5O5Y6mjCyT B9Bw== X-Gm-Message-State: APt69E2Sc78XfGeXVKDTiXplAtpTSV+qmZJnkk+03la4c4/lyxjUCIrl RS4MH0w5eIDij3RLb9oARKCo09bM X-Google-Smtp-Source: AAOMgpfRruEA7QSNZH16OgSkASft03SztAJ64/hKeugD9w1ORf46H0TBaIzGdgBH0g9tizZPpGiNPQ== X-Received: by 2002:adf:9ed0:: with SMTP id b16-v6mr4006989wrf.170.1530791357548; Thu, 05 Jul 2018 04:49:17 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:16 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:23 +0200 Message-Id: <90d3bf3311162e3a0a8932a802e721ee7fe6349a.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:24 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: 42352 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 54F3B1BF8D; Thu, 5 Jul 2018 13:49:42 +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 7E2781BED9 for ; Thu, 5 Jul 2018 13:49:19 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id 69-v6so10306347wmf.3 for ; Thu, 05 Jul 2018 04:49:19 -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:content-transfer-encoding; bh=5OM1VqWbunFM8wPdgB3OgPPGvAxoucxEVAX0oAGkDdI=; b=IzWjVpSPp7aldPl+t3dB9m6EZbccXFOorY5fmDmQRB6rLtYvD/7OdWSuCejG+Gt/Z3 CJ/W5ECL5Y+ucK/5pM0shTmmTNPJ26JFr0y668SE1MltZp+dsNrjLLy3/XyPLABqA7HA J7A6uEWuVdOX/OefTh1kIEJO+Ivf48GjWMdqUOlVtNodx46GYTGotVwivUxXRcWMf8bK AMDCAo2ydp4EsKlq/R+TeEqUn/zlV5HM1K0FCSPiUdrtCUtdp4IXSqOWfngHJPHuoHHw cU9DkXW7nhUOnGU1pjoxfFsT8WLYhLMMO0Kgv4DJ3ilyltBEmGbtReLAIiDXaLNbtUoX WW9w== 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:content-transfer-encoding; bh=5OM1VqWbunFM8wPdgB3OgPPGvAxoucxEVAX0oAGkDdI=; b=RT8M2X0kEtGezUsIkFwo5v8lxhJK0QJcgZOsV+xyb0WSopyWiu3JChs6+txPXn9x+E W38+rFtYCxQR2zo+AsivPxsRZxKyq9pMhZ4BrI7WhPtSBFeVS77dgs67S94dQr+wPKEH Zmtnl4ohjexBNOjIt+JeFmHuS+ePury6RmRKmgd7VMRSMNwRt7FTHhq+VyLQJrS95buG e1gcAQB+dwD/W9osr8wODinc6eHB1M1dDo/4Q3TH2SnkJOXdYGm8edosd67M+w2KCMPl Y68vP6W1S2RHfXwrYYuw3AtTq0uwA6pXFgNGi7ha8ePo779GvlEMM3JVWdMm8bBZs9/1 Baog== X-Gm-Message-State: APt69E1L268SJ6m0PbPpLonezWCR/IhS4od6cMW/UzJP9tY1IHpXUDXx ZyWhnHGELpJuWD+GUxCbYlRL4g8d X-Google-Smtp-Source: AAOMgpf+/xTvdaO6/y1nS7uyB/hNnEkIiKcunTs2xCO7lUKoVw4FXQH+BEjzghrsPO744qcTT85bnQ== X-Received: by 2002:a1c:4004:: with SMTP id n4-v6mr3720603wma.83.1530791358808; Thu, 05 Jul 2018 04:49:18 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:17 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:24 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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/meson.build | 5 +++- drivers/bus/vdev/vdev.c | 10 ++++--- drivers/bus/vdev/vdev_params.c | 51 +++++++++++++++++++++++++++++++++ drivers/bus/vdev/vdev_private.h | 26 +++++++++++++++++ 5 files changed, 89 insertions(+), 6 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/meson.build b/drivers/bus/vdev/meson.build index 2ee648b49..12605e5c7 100644 --- a/drivers/bus/vdev/meson.build +++ b/drivers/bus/vdev/meson.build @@ -1,7 +1,10 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017 Intel Corporation -sources = files('vdev.c') +sources = files('vdev.c', + 'vdev_params.c') install_headers('rte_bus_vdev.h') allow_experimental_apis = true + +deps += ['kvargs'] 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 Thu Jul 5 11:48:25 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: 42353 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 B632E1BF91; Thu, 5 Jul 2018 13:49:43 +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 DD41B1BF03 for ; Thu, 5 Jul 2018 13:49:20 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id 69-v6so10306440wmf.3 for ; Thu, 05 Jul 2018 04:49:20 -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; bh=c4pvHB/dkgeBIxWKVss7FpOOVZCeyZrc/FE2WAjRLfo=; b=LGQgT3FUEzp9D33Je9oAZP8TSIn6ljHRaWvHHgpLxwLtTIPf/M14QzzH6SL0Xkladr Jhb7dIFkNmfZ4HNPDrUvpM9dV97T9I0B7zZqT/gniRqqLyL07C4pb/e16GYwfjrogyBc ORJ/Kk5Roy8a4Dzlwp12j8ipY9lyCdAcZTYTLL8udkVUjHowsya85Atv1lHujZjOTNq5 TCPuXUvi2xLOVwiwt4LTeYJCm4F+uJBJSzcXQgKTX8Fiw0UADtct3mntgCaQmoFlxd6L 37tgnMOWCHZNFElE9XTdPL2GlO0bfO9AigouZGZH9HYXAE3BtgKQ5j+nUchgcmVBVBmR KUBQ== 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; bh=c4pvHB/dkgeBIxWKVss7FpOOVZCeyZrc/FE2WAjRLfo=; b=le6/cxukXzcO3X6a+uKJtIeRK4TMgsZmMr0o5iRiVylCJl67Pam1U3I44Uly3P+aE7 K7p9IlBufHr6Giubfx67Pewjocd2uKmdCP/UQRsUfjKdFtSv3SUWPennh2fizfO45BJF umcHqv8WrKRGdN3jswj28zg9RgdARst1op14PpeJEVozzbnBgREekn/NBnTMMH9hUvbG GyKsXa4pK+co30dFSsKXgK6bqEXjsl9gcsSoiDANkVk9JR6wzZ2s0h9kJreqK2xgcOSp wlCLoa4/8/NJegzsslO9l30oGRcBJ9pSssXFHkPZ29aJuf2usvc3yuWgDJ/b992ZCjmZ YGfA== X-Gm-Message-State: APt69E1XlJfF0CvDu7SpX6k8B+tVprNEQFHw59z5DmGA+FE75/n7CXcX CKsEwi3foEpwhUKSy5hnNklsPt3B X-Google-Smtp-Source: AAOMgpd8ytU6QI0AODw2/stgfMyo/SKQRP7xDc3VLyxk2AoG8UK5E9MTkTn8VmVqCJzxlIj2omg1+g== X-Received: by 2002:adf:a792:: with SMTP id j18-v6mr4565421wrc.187.1530791360215; Thu, 05 Jul 2018 04:49:20 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:19 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:25 +0200 Message-Id: <59a151c1e58064d9b857b7c62364d0be11560ef1.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:26 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: 42354 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 127AB1BF97; Thu, 5 Jul 2018 13:49:45 +0200 (CEST) Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by dpdk.org (Postfix) with ESMTP id 1D8B91BEB9 for ; Thu, 5 Jul 2018 13:49:22 +0200 (CEST) Received: by mail-wr1-f46.google.com with SMTP id k7-v6so1015618wrq.0 for ; Thu, 05 Jul 2018 04:49:22 -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:content-transfer-encoding; bh=QULDkel2GQDzMNjd+rImHB2X8ULZyndn6CAHpB0vDoI=; b=sfDP3qaIK8dhP9gJ2JMHb/3QgmWoAjxhC2N0jT3Ez2LSezKhqE0C110OGRUWQU102W W8EwQx+WmYeQ6NQS3Ke9g0mcyZa6viQVGtHh8xQEfrj7mOAayFjbR8x1vx6HPfDlvipq W8oqFit2lPvuyDVm7SvJOQOnuFEYdYhmj/Hco2+kp4HFHoktu8A6+Dz43+xTo6ETq3c5 XFJr6kb9hBmaVOWn2TJustDIs62JocYtyrrtcwUVoEUrRVlhQpOcsQ1RThiSdUNg7/Gj v5gpaBrioQBCKT/wbY+Kgj+VTqun0UdkG8iw/CVNPD+NjFLS9QQwipbOyiiumDdigh9i 682A== 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:content-transfer-encoding; bh=QULDkel2GQDzMNjd+rImHB2X8ULZyndn6CAHpB0vDoI=; b=jvYK/Js/Wz2p41hij8mkcDg3h82snNcB416SvBQiVQ9YW0bmxtJuiClig4gmg55BwD GebIktMg2uk5DwULwz9xNLic4RPCEocrpKRb7LDWbQ2HSS8LVLAaz7mq86knLMv65Vv4 WwVqts32nVDZ37CdnnUe2XBfBi75RQqY/L5yeeJk9CNmpyIulDTbAwz7badAedcHoCp7 DbgUDM4DFtD6WPWo1lvVqPHlD2E6oHsbkp2QgWoKq1enUGF2SV59VtE7BKd7hoKpM4D7 pmYHMVuI5UJwyBKWCKBp9cK1EHZ9nNz8PCfB3YNxlr4eu17o08I13ER50qZcmQPM8W5Y 53ZA== X-Gm-Message-State: APt69E1WG4pI8mJHoTuFOrJWzASd7G7qlpZ/khU9fTVEm3lEgDTQn8XM 5xw4tlM/D5rF+ZRpzHQRGGVkdPLR X-Google-Smtp-Source: AAOMgpc1oY90BoqHJm9KAyG2TUaaLPQjYVY4EattbXqRRsux7SYdg+MPUh67VNaJLBoEpiB1HzKTKw== X-Received: by 2002:adf:b587:: with SMTP id c7-v6mr4224610wre.141.1530791361454; Thu, 05 Jul 2018 04:49:21 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:20 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:26 +0200 Message-Id: <31185c998c699e07d2e97d20a1810dfb55e7fb55.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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 ++++++++++++++++++++++++++ lib/librte_ethdev/meson.build | 3 ++- 4 files changed, 60 insertions(+), 1 deletion(-) 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_ */ diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build index aed5d2265..a0c001847 100644 --- a/lib/librte_ethdev/meson.build +++ b/lib/librte_ethdev/meson.build @@ -4,7 +4,8 @@ name = 'ethdev' version = 9 allow_experimental_apis = true -sources = files('ethdev_profile.c', +sources = files('eth_private.c', + 'ethdev_profile.c', 'rte_ethdev.c', 'rte_flow.c', 'rte_mtr.c', From patchwork Thu Jul 5 11:48:27 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: 42355 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 40C8F1BF9F; Thu, 5 Jul 2018 13:49:46 +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 7C60F1BEB9 for ; Thu, 5 Jul 2018 13:49:23 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id v16-v6so10633759wmv.5 for ; Thu, 05 Jul 2018 04:49:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4GVoPGxPVbEi4xXKoRREOyrMdd30uHc6auy6dlwC1CU=; b=iooUXQgsYVZi/SE3s04JdaooJISUMX5ptGk6Yk4Z5EAKaR1sB4vihg/jAlxRtQEJot mt46T+3Xr0lyo0yywiT246TC7q0Nh40393hjU/qfFbwQ6H1WPWFvUaPxLaa+fWm/cIA+ hHlWcH1vx1/0xKrN4RwxBLpZQKDzyRBgyL5Iz1RQXKDHDhIR9Ym4fRZGSyofh0zftHPU sc48tbAAmFovVWxKwFbUEUsPl9/0AqbBRODrYv5sQTNYfZ00hfLONMhmmQaZUMkZGgMD Dx+hmlCu2AYbT2Ies8ui/KacvZb/flyeepxfDnHaT4F/LOdb5C/MSLtUazhunsz0HAn7 qxTA== 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:content-transfer-encoding; bh=4GVoPGxPVbEi4xXKoRREOyrMdd30uHc6auy6dlwC1CU=; b=sKaoEv4iMTuP+aogj/eGlnV94usPj0r6SxpT3l8c7YoQSmfUc4IfsNHhLsLcKHkWqo PwbdhcYUeYug1f/vl3yxcN37QUS7loQflLc+7mRDiuWc/liVfe2m6imRn+Wp+qmld3y1 40N042EAkwVMPw1+GJ/eAmBRntqZ6ciQQfnKQRLwjHh9f7xTsVN3BejcsHfcfP7ma+h1 jmBJprCx2ooH/Btn17QaFy1ZjtkWpP006Ou+jNsrPtmNLtzIK1yx1twIHOvFxHVw61m5 XeSn0L2dK1MxmyVRLOil7zNjgbLC2XopBqNRqP7AVfaOQC/a5dC/hqoiNsHbCcKdkWdo WukA== X-Gm-Message-State: APt69E3GOQ9omn2FAS/UoiyQkIoGLsabxIlvbnniYKIWiB9ogVGDQgWA rWvoGE+tEM8/XHycZJw0HhWrcXMb X-Google-Smtp-Source: AAOMgpfsCiiMZaq+G8sX4s93Ypzcju2eSplKZwRvrlCBqHLRbIZkO9uZH7CxI3seckIt4R+dRbl/6g== X-Received: by 2002:adf:c5d2:: with SMTP id v18-v6mr4095522wrg.151.1530791362766; Thu, 05 Jul 2018 04:49:22 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:21 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:27 +0200 Message-Id: <083825ccbcede0aadc2f8fd7ca5cfa1c9f12ed5e.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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/meson.build | 1 + lib/librte_ethdev/rte_class_eth.c | 79 +++++++++++++++++++++++++++++++ 3 files changed, 82 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/meson.build b/lib/librte_ethdev/meson.build index a0c001847..f9538770b 100644 --- a/lib/librte_ethdev/meson.build +++ b/lib/librte_ethdev/meson.build @@ -6,6 +6,7 @@ version = 9 allow_experimental_apis = true sources = files('eth_private.c', 'ethdev_profile.c', + 'rte_class_eth.c', 'rte_ethdev.c', 'rte_flow.c', '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 Thu Jul 5 11:48:28 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: 42356 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 7451A1BF88; Thu, 5 Jul 2018 13:49:47 +0200 (CEST) Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) by dpdk.org (Postfix) with ESMTP id 92D681BF0D for ; Thu, 5 Jul 2018 13:49:24 +0200 (CEST) Received: by mail-wr1-f51.google.com with SMTP id t6-v6so1015792wrn.7 for ; Thu, 05 Jul 2018 04:49:24 -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; bh=IHVbPwTSTQaAHXkciYMdEqxygXilHaYNt1PzQ3kYkLo=; b=kCO9liRYv9Fzv2wW+0eTgWfE6uqmT86CbxZI1Xz7P5m7V14wdzHfk5T0DIRtud8apO wvfQbRnp31JPUpmAPWJ+4neFWa1uTPhrqRk2A1Jltdj5Dk3X5ogK4c3At3AZpFE42XNC TIil1360d9o2MPGlJXx7bFB9mYwrWllJWvEfAikvfhj2esNE2FohFpGCOM6HvinIcWxS LMKDaZhunSidHewgldMjHKxe1MEC9jWwqK+jirEGGdw7DfuhvtvnaqQGe8ZQxpvOTwLf xAeJVAR9SlSpiR7RPulLyaEMteiHGp8YFF9Wsf1WSM3IHmpWIKcxEkwdBP+Si5/YrPXL b76A== 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; bh=IHVbPwTSTQaAHXkciYMdEqxygXilHaYNt1PzQ3kYkLo=; b=XwzlUFXZ67ZyReBpCNE8Y3qt/f3iKqpAvl58i1TI3j/PjpY3WhU1TpJ8pOvI/+sf8I TWHB7stHfvHUo/OfyQokZwY94b79sfIugSjnTle1WD4bYAQ5OJAVU+RfWBPt+h0RwF66 gXyP3+cDCT2lR8Kyzh7scdKGicEx3F553U2+Ia7pRTLME506YBvTQFPczmx43u0+6qQZ xSpJOv5R38KRHxuj4EIe/hsLSWxeeIhodCSYLCipfjZPY0sNRR2xroKLwlnFM3z0Sf83 aw574zjZrUwA0sXxtLvAjnfpTiGSOq/TI2fXan2SoQqFUvz/9mY1xYogrMQOn5qrwW40 AP8A== X-Gm-Message-State: APt69E1sC+kes/YJzZ99zbEQZFBxVsqgvuXsnpznKaM+gYn5GndmJ/br SuqOuDo6o1BejupyuYapPPoJTEL0 X-Google-Smtp-Source: AAOMgpfdlam/2Yna2RlHvMhN0YV4u6ZcapB2d8fnZ0cUfLAtJ9PCid4FNahmegJBdpRYNb+WyRKyKg== X-Received: by 2002:adf:ec02:: with SMTP id x2-v6mr4046381wrn.245.1530791363974; Thu, 05 Jul 2018 04:49:23 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id o42-v6sm15809183wrc.50.2018.07.05.04.49.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:23 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:28 +0200 Message-Id: <2922fb25b3aadf0d0427b5529a4a29b1a4ee8c56.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:29 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: 42357 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 DA6B51BFAB; Thu, 5 Jul 2018 13:49:48 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id E1B261BF14 for ; Thu, 5 Jul 2018 13:49:25 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id h10-v6so1013036wrq.8 for ; Thu, 05 Jul 2018 04:49:25 -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; bh=MKCaEwk6ax4O2l48ApzI45MsG9rXLI/D7ra/rp3m5hA=; b=aEKuPMKiNdj546ZMh6oEuYRKTJ5noqLyxgES69qN9yVTEOWfh8wn5tmF3S/1acwEpj A+W6MEGmcPjFTtzFj1X+dGlEb0JJhW/H5xSuc7iDiyZ4AeLfo0yR0HeIIAgBNYh+ZaH8 gd0hdhWwrsS0CZwpUnUNvpGqvqA5FY9/qtUC1f/fHqHSoEoOPbH1b+FdJgjtbisi5xl8 H0T92ugP+m9CgXkkXNN9DCL36akLVPit0Rxulrphu0Q8J2e/jwym/oxp3vD9Jx4/am04 G+RTdaacEAI+01f27Xi+6Oj4JBmXrLwHDYlwCgaAve+MskgS67rjK2OhqU0Fbph0u8/g sBsw== 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; bh=MKCaEwk6ax4O2l48ApzI45MsG9rXLI/D7ra/rp3m5hA=; b=WAU41ceUkWYUR8E9Ib/DFeoUt7W0KdOlmLDsvPQ1gd/CSEWmBBt3bDTqR1L+yY2suZ PNw843rwWo19jCTkRFjmHnzAb7GWmt5Cgk5W6qEF5o92bsc1lcs4A6kizrteBbZYI5ZK gRbU+t9t3M1y94shpOPBuYMMUJdEo5Rp40dLnsFid5cBwOKcPKtuB3i0ZpuhngwpUE2b yVe5yeztWeT7iDY7cu7gMPOFYZTECC5iw+uWB366yEcq1cc9mBHA3K5X64efle+aID5N pxCahZqv1IW8bNVuR1KOGZuyhpMSzXJXKgcgGb7qneZVYV6OP5B/fnXG1vyJxKYQxVkL STig== X-Gm-Message-State: APt69E3Yu3zLg4UhCtLEMaWjplYjjj1o1N3H56lXN3Bjal9oxfx5hKh2 RCWifaRjHt7FKzqvMkEbiY6zohxU X-Google-Smtp-Source: AAOMgpftoWJy89sIrvY+/eEW6nrga09pL8zv7JcsFRzRrmw4XNXVL19E82BUCrjmsUyumNLqzA2/1Q== X-Received: by 2002:adf:a197:: with SMTP id u23-v6mr4671878wru.50.1530791365265; Thu, 05 Jul 2018 04:49:25 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:24 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:29 +0200 Message-Id: <91715e428e019756b945f665cfade4eee6749960.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Acked-by: Bernard Iremonger --- 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 Thu Jul 5 11:48:30 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: 42358 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 D91F54CA6; Thu, 5 Jul 2018 13:49:49 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 261911BF01 for ; Thu, 5 Jul 2018 13:49:27 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id t6-v6so1015857wrn.7 for ; Thu, 05 Jul 2018 04:49:27 -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:content-transfer-encoding; bh=yayVlu6odT1kDogaWf+RhvMWJ8dgHDD8ic8zx8Qvt1c=; b=HuHxJ8muAeuY+yPkEsPoDv6oQKXEoVlQ/XkWi1JeDjZweZMLJ0+sVAflm8P/q16VI8 AeoIZjkD+BDzEJ86iz4ljiCAq3Q5sdg09vDArPLI7pBaS1dc9gTKWX59gYM3pnJZSKyK Xay/4IsvcxH7hUJ5gDd8MZmVC4cfmxG9uP8CwJYbRhXc7mY/TEaYN6iFaDTItr2xljAE EmpaPlw8x1MHD5TS2W7rlAr/8N70xWwsdBsBOhK+zVY7693ohKzV9bIBMBTJEqy4dJB6 dIEO7APuoKuSn1uE5Op8WJvZm8Yq1eBoSf4mRNQh9erLVmSBwPL7TkNsn549ZgfGOUrl inHA== 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:content-transfer-encoding; bh=yayVlu6odT1kDogaWf+RhvMWJ8dgHDD8ic8zx8Qvt1c=; b=RR01+8n1UxQivdIaH+Mhe8YMAumAWpguovC59NlCL1waM11lxHajaZ7/dUVD2mQiO7 bq6V7zoIPiQZ8bDslHzmj5/l1F4PXlkDJmsR07U/ORPghKZ94PMcZsdMKZft+kHwrpUl YZT8VFN4keZF2v6MzPP5Hwtlup4a/xlNSchzjqf1U1ZXbUgNAy49RDgW+u2PQ+obLZKl iirzRu71a7qhGs5S1IvWlmDuIq+mOn/s+JmGU8p1dIBfDi/R+4npqXifOI+VNg/ggr/W Ts/eOfN4yQRjhAkiyVB34DbFFW0U+TldX1oughDyR5JQvdHl2ouv9yknjWhC8A1f3Oe0 iHYA== X-Gm-Message-State: APt69E1y1+8a0H4JwgSKKPXZnpoxmMedNO/vSpZ6ZVTiRmBUgElN+/XF Lz1mCI4gRiHTl68k6fhteBo+II+G X-Google-Smtp-Source: AAOMgpe+OdW5o6ATtYiL9NE58OJtPd81oUnbHMsiUUBMr+aEPz6Gs4o7oIoiezRmjGouSS0H3zFhLA== X-Received: by 2002:adf:81c5:: with SMTP id 63-v6mr4576486wra.88.1530791366465; Thu, 05 Jul 2018 04:49:26 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:25 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:30 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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 | 51 ++++++++++++++++++++++++++++++++++++ drivers/bus/pci/private.h | 16 +++++++++++ 4 files changed, 77 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..56bb653fc 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,51 @@ 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; + } + + ret = rte_kvargs_process(kvargs, "id", + &pci_addr_kv_parse, da); + + 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 Thu Jul 5 11:48:31 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: 42359 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 CCF931B5EA; Thu, 5 Jul 2018 13:49:50 +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 5711C1BF10 for ; Thu, 5 Jul 2018 13:49:28 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id v25-v6so10657552wmc.0 for ; Thu, 05 Jul 2018 04:49:28 -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:content-transfer-encoding; bh=zJGbgVjVaw9EdvCV9Eh/VFk/xXnt32MFrGHHYkSwD0o=; b=LmzgxOPnMs6uBuUYYZ9ijUSZUx9q9RyXZa9V2fqdjuS/hAuDT/IyEPoE5SEWd5mTOy d1/zpraNhqMFTh2i6MdBju2j38tJy2MzMuEpWyfdFpTZ2Ud1SAX9wN3v6PhB3mSlTxUA FFLKjI4KxsmpeaJ6uC4b19ObDdkpPm4lLRYKz7mk+QyPVe1JZI8WLAoN+YkC/koKelYl yiXtnySJ1z5yEWiWXO+ddccOJeL6lAmXfyPiBLf4cP7JJZhBiJSY3K8A7ndZwI1xZLiF d8Gz1lUpvc0nSP62/OZJZRQl57RtlH6Bj7WvGD2u44IRzMKqbqupj1YDYuo1JYu94Job /NCA== 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:content-transfer-encoding; bh=zJGbgVjVaw9EdvCV9Eh/VFk/xXnt32MFrGHHYkSwD0o=; b=Gx84PY5vVx6Jw/XOF4WGPCP4Z37pDWFNRWhsLPbvpQYjhjkEY39mw2Gf/x5XTmhMgj VFwh3utYMbkwymto4GeQ7qsptasQ/LzVJxCQPVkTHl9Yh5ivkZ1H6jiY00j0wR6i39RN Yvo4gDIOB54g9Cy8mZmul8vwX5ULWqE+d/IjjPBgTmlitPToC3eRrwwknMd5h8CW4re1 SdEMLBmZZrggQ2If9EBEb3cuz6AaB2OGVjQnL7EVeP00SnLDxgNq1XrzG0EgzdTmio3q iqoX2hlYuXNg2fcG59yIhaYj4CiXYtPGROp4Yp1GLk8pRhVU4kY7/RcT4IqalUaCp4Xv JTrQ== X-Gm-Message-State: APt69E14liN+KQC/vLNsk/PcpfziHFX8iTtZHJMjbvaKeTnVJoJvfmGj E4w3a0fyFu6wL15WCYiAzRe3GMY2 X-Google-Smtp-Source: AAOMgpcEpNQAMFtRbgB7noqwToOh1/elRODC2z3xBR8LXkIbO30Iyt3rxSc5vbfIFUUz7W7jOifddA== X-Received: by 2002:a1c:894f:: with SMTP id l76-v6mr3818077wmd.103.1530791367743; Thu, 05 Jul 2018 04:49:27 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:26 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:31 +0200 Message-Id: <41669072ea5a9a6a6487f5a814a88446e1f7f2b7.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:32 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: 42360 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 C7BC61BB83; Thu, 5 Jul 2018 13:49:51 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id 9CB7A1BF27 for ; Thu, 5 Jul 2018 13:49:29 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id v25-v6so10657666wmc.0 for ; Thu, 05 Jul 2018 04:49:29 -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; bh=uv7z1Mr347u/ygBQGoLbDnLzDT+LcjW1FMIwY124+Qg=; b=sQGJ3nA3cT7hlI4/beF+z2fvWwvy2RHGI2BB0EWv9nhIaoLKep1rxX4FIfBSgSciGy WSETLk7OzJOYi71sfn5gZ9Pb1AL4SlY7Xul8DwcxxYbwJGaaUerw0mkPvYVQgNf+81An iYwV73K+3x0Yfc+7f/QKGSk9f+lzaHNWG7ov60XepjZjxlSosWkLKEGgI/noutQgq8PM k09bMh/7jTrAek4D5Fbh59Dy5eVpBO1Yr5C7WUz5em+g1B6dQXkPLIniwHpkuw2MfMp8 yU1xzdElFTtgyOT4lvY5XppL+HNCcRQOPgELacY7DVvVdocYqThqEYzZUCxR/Lgqo/0A K6Wg== 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; bh=uv7z1Mr347u/ygBQGoLbDnLzDT+LcjW1FMIwY124+Qg=; b=CTnZPpE5PMI4f9rV+FBu7cv7OL76Cfd7NjlkLT/Inj2TOZHFGYm4rljr15HYUJwhk6 Oz9IBgpYy3MCEv8Hr6lrNKf7JEm85LFxqBDSCz9hQjqRkLUe3NmoH3HUSKkQbXN+oumV OWLgW8izoxzJVX6dQQjzKSXQmGMexOiQ6G3h/aWZCKQtbDfpGJFi2H0lBcXiCN4P1Rpg tJV2yGe1emDd2mt1vRZS/p/WjLAvoOQ3AxuF4TJA1lnWkx1qcgb0ixsWG3FivZzEBAeQ VIAbz9g62kMtQbl3VEJLT1haqr3X+nDAfikImwqB91O5UwKqeeG/5FcSUsvb/baWgEkx 2L+g== X-Gm-Message-State: APt69E01xM0C9jX05K1HCPzbFmHkNQ2iTLM4qsQAaS6X4vTXD+3voc30 X5joAlodBsidRlWT5h/gdgKZ4OqR X-Google-Smtp-Source: AAOMgpfRlrLEyzjyzXNIR+d1tvwH/XSnz5L/Zr7mU/K/Y4LK/ndTqD8gcxOM8jL6z8m1VyLRmdiI/w== X-Received: by 2002:a1c:ad42:: with SMTP id w63-v6mr4193094wme.100.1530791368957; Thu, 05 Jul 2018 04:49:28 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:28 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:32 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 5b7854490..15a3cf3ae 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -249,6 +249,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 56bb653fc..effa73606 100644 --- a/drivers/bus/pci/pci_params.c +++ b/drivers/bus/pci/pci_params.c @@ -127,3 +127,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 Thu Jul 5 11:48:33 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: 42361 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 B299B1BE0C; Thu, 5 Jul 2018 13:49:52 +0200 (CEST) Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by dpdk.org (Postfix) with ESMTP id D0FDA1BF2A for ; Thu, 5 Jul 2018 13:49:30 +0200 (CEST) Received: by mail-wm0-f47.google.com with SMTP id s14-v6so10374829wmc.1 for ; Thu, 05 Jul 2018 04:49:30 -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; bh=EQK0dT0i7rzxsss/dg1hwvBBBCm+0OxnIM+fdFet49Y=; b=y/5wAJjU+y0gSMYsg5vA+BQNDaPYrEliwtjYqaj6VlzaJHBsF+39fhYLAPriKbnOOl IrHkqxwj4BqeYoakt5UtcZEY3Whq/IKMb1pQ8Cxbjdw6lKGw+EFPRS9CosbG9ibfVUp4 9Wz0xhzH/UbLjPhl9KG4E1ywGYaCT/d2wuGxgjdayURLQnAJzW8+iaZ620KJnyD/D8/u PgGQ46X0atUKhtPWGSd2RVNlY6PyQFpSkg7SH5V189h46SUcHNqbQHCRDwk1dJnGCb3b Weakmcna4ucVECsSm6ih8MH9MuMkAWZW7SAmF8/2W32afM1RApgjQhoNTbcn4LWPqrHF V53g== 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; bh=EQK0dT0i7rzxsss/dg1hwvBBBCm+0OxnIM+fdFet49Y=; b=nbGZ6x7/i5xc73cFM/+zDo6DW6pqd7nRxP+aBhOV+mi0XHnsbLfloqRkpzYVqbaoY8 sheeJBnDNxw5vq/pi4x1N9PAAYN2IY5rdKkG50lHZWsAVUIQWFJeEPbMdhppscElr7dN M0el9ABWQ4HDMN87CofOUgGYRayCVNzHKurksOCXET2coDwsp0vs3VHcM8Lo07DdU5xl LUHhdeX6kES1M+jZAzAm56aox10/+4nnmMB8oFSPLa2QiMxDWviUcJz4JaPuZqaBjEP3 t0o3B5vH0uAgbpq226QNnf8okqbE7ZuXi1vfI3TFFCLeKs8uS/YTlpwsT6lw235ez15E JfJQ== X-Gm-Message-State: APt69E0xILsDs7QWF7FdvY/M+DEYFtUmfOhyllnTNm0k+uu96Sox1bzH 1WOm0i8TvUXqixYeSz3Exv2UwnmT X-Google-Smtp-Source: AAOMgpeJSJK6iJynZAWzr0XU/H9oJm8ufMzWALKDjbTkZW/xJxx/pC8Jbp+FOPofsyx5nQdPZfE6Ag== X-Received: by 2002:adf:c5d2:: with SMTP id v18-v6mr4095805wrg.151.1530791370207; Thu, 05 Jul 2018 04:49:30 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:29 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:33 +0200 Message-Id: <1b2f9ef1c7a81fbda26e960017f4ec55c39c7925.1530791217.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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 Thu Jul 5 11:48:34 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: 42362 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 2ACCF1BEA4; Thu, 5 Jul 2018 13:49:54 +0200 (CEST) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by dpdk.org (Postfix) with ESMTP id 62B711BF3D for ; Thu, 5 Jul 2018 13:49:32 +0200 (CEST) Received: by mail-wm0-f67.google.com with SMTP id v16-v6so10634470wmv.5 for ; Thu, 05 Jul 2018 04:49:32 -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; bh=ZgX6WePwtREdWkbM1DbOHTKhNeOJSRqn0CRsGX0nIEE=; b=g5TRm1h0eDg0MPo05bgqdx+WuGvp9b84xNhwQ86RDGh4qqrK141LOutPsJ00wG7Qnk DF6VhwGhmOlIAseKkumKKoJpm9H4jf23TkDepWE1Qo09l0Mt5bpqfsSi5iZSQ6AfkCGc NZdzcIVJNqc5FD8fsQUkgFpZr+e6rGSmvnYdAohEd9CnxBWywumoTo/69S3KCm0dHqat njmBoA3gEy3jDA74aFLR0JzXVbT6088STGrJi06TUqV1vDIW8Wt6xfDsK1l7lgfBfWYN IQvvug6923L7quqBc4s0s1QMwSY2YjgZYdcBoHk391B1dOCL9fJREuP3L2uLIw7jc9MB 9s4Q== 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; bh=ZgX6WePwtREdWkbM1DbOHTKhNeOJSRqn0CRsGX0nIEE=; b=EEBFL/K+I0XA90XLw3HPOdjUKjZmqqeJ7HvLYipY8whdW8yfJD1lcuGq9p9pwVF+yF 0xOqjhzH6/XyGe0hEci/Z/M7izvfavnXqqVSm5fsZlhRV1Gosg8PnAPLlf70qx6mSnn9 LOZffmgVwDvTFcdUVsQphaMECCUjfO5JJqk+6sFRTVYM9MWiyM7j/1Yn8Gxn0Wfna/Tx JpNgEY6R9KLyoC0brydJhKiv/n4vCRTNtEjBz9NSuq8yd5/+EWd+cSwqw9at/zibH04R y7T3p2aZ9JW4+fm0uMQqEZDIyWA7PNpZHDblozIDYVMmEJtwhntgaEtRca83TbpWKsIu Gt3A== X-Gm-Message-State: APt69E35yQPZOWUK8ikNNOrh1eVLapfmga0l1liK+aRfwzvuEDPOt7++ 8Qv7vL70bcYHiU8tg7C1PK04IkOu X-Google-Smtp-Source: AAOMgpeuZNFy100rTEmhE+oVVRGzDI6owbXopihnWmp20ppVmL3oU87scFpdv/elXwVcYRsv8HyZsg== X-Received: by 2002:adf:c383:: with SMTP id p3-v6mr4323742wrf.68.1530791371653; Thu, 05 Jul 2018 04:49:31 -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 o42-v6sm15809183wrc.50.2018.07.05.04.49.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Jul 2018 04:49:30 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Thu, 5 Jul 2018 13:48:34 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v10 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"