From patchwork Wed Jul 11 21:44:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42894 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 4E96A1B4EB; Wed, 11 Jul 2018 23:45:41 +0200 (CEST) Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by dpdk.org (Postfix) with ESMTP id 523C91B449 for ; Wed, 11 Jul 2018 23:45:39 +0200 (CEST) Received: by mail-wr1-f47.google.com with SMTP id q10-v6so19598502wrd.4 for ; Wed, 11 Jul 2018 14:45:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=f9Tx+0UBVVYcjuKzsP9/IY1BZDwZjaAiADmqd7Cyj28=; b=mSp3v2/5shBi081Kh/mAi38AYNKDjtQWo9KWxuBb1ie8IYpzTIY/D+lzXMwtNImqud 5qBo6sge6nYO3LcjZEdfqKQpYU5hl9Wz64MkY2hhQI/UMcT9HLx0TdfXvSXNt39xluff lvBUMKulcEh9wTC0HMT5NT6eH52m8WxX8n3mCVkoFXzoB43/Koe55ic+o6qZNhxFtFBw +y0pnfxuQreo25vqDeklLDdtoXzclyfA1MqpC2iuiKX9vVk/dQQ/NcKhrngJg15fFcIR c1Lj+wGWr7bC4fHZwIowNiuixMtbQP9EMssC7dAHAD8kGhr8FMWQdQcxLmopSQbT5fsZ X/zA== 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=f9Tx+0UBVVYcjuKzsP9/IY1BZDwZjaAiADmqd7Cyj28=; b=avpNfVAs6CH3yhj+i6WuyLysaAIEVOpIMZ67Kb5rXnYE0+IMb/6EkCvmPFHaYMNSSQ FLSdX0poY5DMZ9IgAoGA0t+Px1T526jFoSNlqLyUONGAJ/sk8/hlTxUfVUz+w9oJs2Qi gOT/wnxBb4E3REKueJM0XcPR3i8EvxMlo0CQeC2jqXGKPOGUh0lsH/8aRTBETRH3z2Tb fW9yG68XXqwskWOpAWYaHadHKlvpLajD+ACu+8Lzoy8UrkSEMx6TSQJau8924hciY1q7 QddMkEadE65qDOOLZ9NIVI0BVw4h0fcQUypLjqi1eyFj8kaYOiafUWpRt6obY305xhFT 3qOA== X-Gm-Message-State: AOUpUlF9KoJPCjxkzZqigEKcgEmMIOJ2IC/z46vLDjmdqYV4Ucc6DcgA v3raiJ7wQrKdicRfqslUCWXVe24A X-Google-Smtp-Source: AAOMgpcq6VoODyirERD9hmCDKDJSYgirZxBSDpITOKloZ+mJWOPriQW41CzZXUsJ6iUOW3pmykc15w== X-Received: by 2002:adf:db41:: with SMTP id f1-v6mr244370wrj.212.1531345538645; Wed, 11 Jul 2018 14:45:38 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:37 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:51 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 01/25] devargs: use rte-log functions 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 standard EAL logging functions in rte_devargs. Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/eal_common_devargs.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index b0434158b..894749e40 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include "eal_private.h" @@ -96,7 +97,7 @@ rte_devargs_parse(struct rte_devargs *da, const char *format, ...) da->name[i] = devname[i]; i++; if (i == maxlen) { - fprintf(stderr, "WARNING: Parsing \"%s\": device name should be shorter than %zu\n", + RTE_LOG(WARNING, EAL, "Parsing \"%s\": device name should be shorter than %zu\n", dev, maxlen); da->name[i - 1] = '\0'; return -EINVAL; @@ -106,7 +107,7 @@ rte_devargs_parse(struct rte_devargs *da, const char *format, ...) if (bus == NULL) { bus = rte_bus_find_by_device_name(da->name); if (bus == NULL) { - fprintf(stderr, "ERROR: failed to parse device \"%s\"\n", + RTE_LOG(ERR, EAL, "failed to parse device \"%s\"\n", da->name); return -EFAULT; } @@ -118,7 +119,7 @@ rte_devargs_parse(struct rte_devargs *da, const char *format, ...) else da->args = strdup(""); if (da->args == NULL) { - fprintf(stderr, "ERROR: not enough memory to parse arguments\n"); + RTE_LOG(ERR, EAL, "not enough memory to parse arguments\n"); return -ENOMEM; } return 0; From patchwork Wed Jul 11 21:44:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42895 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 1FBF51B518; Wed, 11 Jul 2018 23:45:43 +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 B165A1B50C for ; Wed, 11 Jul 2018 23:45:40 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id q10-v6so19598559wrd.4 for ; Wed, 11 Jul 2018 14:45:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=m7N1f6VpY+J/10HmMQ1x1n6PTG2NJKjdBCtNmpGPz2Q=; b=hh0qaVgeNbFzpbdoqPxeiYbZ5qEpcHM3PQyANp46XlYDWCqEOhWU3PlVYoEJtflLcF SIM9FS6P1EIfjPpkwoGmjne1y+GCssWjVlbc48rovIE95PeFkxJRV5RaGTQLhI7lLYOn 7LVHQiwG3RzVETtLSVBo/OdnzE+A8u9ozyS1KNgEcyXW/zmc6nEwsC6gUyp8VF0lIP/v i8vflWbCPrkfzTMnw3IiSmeOG8xSMP2DXvSU0azzqamAKPPub7z2sPcLjFK8B6d90bfE paZHXzgLjSORScu5xKECQTcChStZGuyCGh/R8GYcCTTrpYWHADt4YH8KUj7Qs0GQ0sbI uHdA== 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=m7N1f6VpY+J/10HmMQ1x1n6PTG2NJKjdBCtNmpGPz2Q=; b=uHDWFaHz6dHUl/qWtmAo8x/CaP7tBBx4rW7JccfoErlUUjCkUXR2rL8pwJgo+rLv9c RDWG/0Iy4DCE8ltHjW/aV/CvdoXusaZHvpq3PD7+pK6c8RdkgfF24crn6SpPzqhmpmr3 NcB3I9QwIK5uzmKP5FnBS+nVvpyFTn7gUxfTaWbn3fc+a0taLq3Xhtq/3IkxBWpd8118 KIxbW+zWf+J8hFbWl2RUfnKE2osIy4cB18wPHXq+Ur1fjL0jTBwnDDgkwIN2du6LtwiI qR85uWIXiWieIhtIIPNmg4C6NQqzBTNaTBcEEI7IcrQDS7pgt+n03uKnwXtNx9insbs0 4rXg== X-Gm-Message-State: AOUpUlH6yyUVea8eoQP6i2Y0Uv9RVd0rei3Jj/l6te0KchPWEpfPEQiW jc5OQBSOmyxWrogWHdWPwrkkxWER X-Google-Smtp-Source: AAOMgpcdq1lA22YFvN6rDTD3LTqVJoSUaiWWo2b3JSdueY7yFMZ43ZI0flmoIq/60n4VazmNG3Rxzg== X-Received: by 2002:adf:c891:: with SMTP id k17-v6mr248153wrh.6.1531345539996; Wed, 11 Jul 2018 14:45:39 -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 h5-v6sm10550936wrr.19.2018.07.11.14.45.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:38 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:52 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 02/25] 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: Shreyansh Jain Acked-by: Thomas Monjalon --- 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 894749e40..f84f3d2cf 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -63,24 +63,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; @@ -125,6 +119,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) { + RTE_LOG(ERR, EAL, "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) { @@ -151,7 +173,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 16b8258a7..98e089e58 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -658,7 +658,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 Wed Jul 11 21:44:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42896 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 E58301B532; Wed, 11 Jul 2018 23:45:44 +0200 (CEST) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id B42FB1B50D for ; Wed, 11 Jul 2018 23:45:41 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id c13-v6so19557879wrt.1 for ; Wed, 11 Jul 2018 14:45:41 -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=0PfDbteb90dJZdNR95tgR1W4/MwSAauYE1N7bIOuOqQ=; b=z4Iq7irNhZeqpBVR4u5y/aa1+ucRCAfMPUoAvyf1hKz5E1CzeENZ/Q10hRPh4QnKIP RJY8j21j6eZzuMwXE8olAWPB5bf0AFQKPYbdV5Nkc+bXM7JT2Wvxinksks3iwBHen8CK QEwtNhCx1/VnPqnuAbudyMquXIyJsr64u3va3T5nZ3mH1iF1ExrGJ2fuBEwPVnkccI8N Ga+iMoP/U/Ignfm5ACFvjASakr6TmlwKuHJzDcvK+yStK1YC+uv87CQ3YBG8ymWri/6w ULL/anKbiMMgsygumG2qfxEBcHPUwPIYoO7vLfRryCcqWiGBtm64wGQYVMYbx+GhZJzc yymg== 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=0PfDbteb90dJZdNR95tgR1W4/MwSAauYE1N7bIOuOqQ=; b=fyKNBy1yUj0yGTH3Lf9t/aV9G0xQ/AC1XU6fs/kITFYFfdKXtzK5Nh0wdGwxJbGJOX cDPVmtq/XIy1B5Ubwtrxeb+HHBdaujrb4Kuokqxp9RO9wSSEAJGV/08OAY7d2KVEmR6r TPEaj/YBPv9eJ4v1Wn/zN6HK3uiOU/kSvAXMVi1/AaKIfYXwehTuLFGdjv7QFa9jz5FP WIp0JV8E7wgiqFEqNBorO2xIy2DqKhx6y9DM7vDfTrIgPHaHGSARqUZtRvnPsrDc7xsM WKw2k8ye7NwNj66WV1VAEnimbOp3h13krv25RIf+Y4SYJn5FU39PUhxWl6w2jioX8pC3 rJPA== X-Gm-Message-State: AOUpUlFYFJjW1E8Tx9E2mbWnmUJ3+aGMmL5NW8TQOCtH3liF3zQ+qrmR ELqkg1riDanb7y6ypWnm2twqvLvs X-Google-Smtp-Source: AAOMgpfCwNUeKveug50iGBlw7ZFcJF5XgrJpvlxQch7ZDw4CJfaYkmK111NihmunbUswXrM97uSIwg== X-Received: by 2002:adf:8e10:: with SMTP id n16-v6mr229983wrb.100.1531345541060; Wed, 11 Jul 2018 14:45:41 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:40 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:53 +0200 Message-Id: <2b839e17ebd871c2832b68608988fb00f760892c.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 03/25] 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 Wed Jul 11 21:44:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42897 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 1CC681B564; Wed, 11 Jul 2018 23:45:47 +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 5262A1B520 for ; Wed, 11 Jul 2018 23:45:43 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id j5-v6so13071418wrr.8 for ; Wed, 11 Jul 2018 14:45:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ncWdkWkBUDhfwJFPkOYFPhZNw9r3yQ9LG7nL5SJwlm4=; b=ctW3VE60/w8jFW81G1QxjLBVQEVjSKNyAYCicFmCc4HzmHhpWiJ3gbM4C04RbA7DcR REe68HnueJK8Esk9MtSJl0RfrKhgX52jKg3+Q1XrZPe1GaI4ctTX8fLhUWVMhtU2t2LG WNkttvmih01QSC9jSkmUAowVmav26t5ShEzAoGtlQX7t7Lf9GGtZorNWEzVJ/nV8yzW5 DIUCyF4atOmraiDCoZAaCL5SX0aT+YLx6HVlFUKzmPd8psdeRwcPw+kOWonlFWS0b9nh 53t6mjXSDYoorpc6pj3k0SQvsLQnjMTRBewZ/1vzPQ0X5yhMBAsSY7iCF+2gq+xmd3wV zNAA== 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=ncWdkWkBUDhfwJFPkOYFPhZNw9r3yQ9LG7nL5SJwlm4=; b=ZDENUNGJDPx+dUeQqL61a+Ri6ur9AfVaDaRgRiVIOujmyaQqU2tnNhSenOdrv4xYUv PBKPgOcYmZfvgURip5eJl7mz48JlS5vFU0ZpNWgs0dMMsotcl37oRewiFfuGJ0b+ILEc AAHgo7+wzsl3XUrbZES606VCNFskZFG6rybU0s/KfWvfhT5m0GtsixGnOxaqdxDhx/x1 V6HHYYBZopRfYYb887q2R644jKlJF6Cou9MuGZhReBusewOku1gP6aESNAb2akyeTq+D +IWfy1RrZyggXOAdKmH8zKOh3du/bXBHMiS9vp78LhFuYaDE1UzanIMF2EfrBpR9kizX ZQ6w== X-Gm-Message-State: AOUpUlHnDAz0vCdLhChKM46ebpAo1XAtY/RtH3Potqnovk7ZBe6zvRHy LUiKsncymtJFM9jBKuwZUQPDDXO0 X-Google-Smtp-Source: AAOMgpeuaCY63MR5v6+KwEoIHUHH2iZCaw+H85TiEoSPWiSP0x6iALWDb+U84VXpaqW7fKYRc83d0g== X-Received: by 2002:adf:8597:: with SMTP id 23-v6mr228787wrt.31.1531345542410; Wed, 11 Jul 2018 14:45:42 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:41 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:54 +0200 Message-Id: <7cba3260cfb939032744960d13b1c348952733a4.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 04/25] 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" This library will be used by the EAL to parse parameters. 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 Wed Jul 11 21:44:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42898 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 9C80B1B576; Wed, 11 Jul 2018 23:45:49 +0200 (CEST) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 4CAD51B449 for ; Wed, 11 Jul 2018 23:45:44 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id c13-v6so19557957wrt.1 for ; Wed, 11 Jul 2018 14:45:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ri/JnyweicfVQyHpzve2mJ+UMofLqZON5aR82jts/ao=; b=KxAf/Hc1s6+VRYoBpVqM6UVa11rWiBSQrOaovYvfGEpvJFLmx0nny/3CJOB9LYAjCF 3XL+wpt5xztveFdL5SnzntuRTaPNJFER0eRTGLUdEuQje0G0gbErRYxHTf0s12/JrkZq h009ycUayjocP0pSgTy+KS4LxTaf2ldYhyNa30DdXZj7Mmziv+egz2FyTIrW/rp7tNOK IhAUVNES2JFHD1h24+GN1cxwnwVwf5Aqa39i9YGgRTJkLi3wyKo9RQb2w92eZ9HCqnPU bdJIaa6e/rlen/Tgyv/7MThODWdGsyIpss8VrEEpXk3DTo6OrT0PXdRRuZmi+YSzL64X ZYzQ== 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=ri/JnyweicfVQyHpzve2mJ+UMofLqZON5aR82jts/ao=; b=Dkkg72nf6UsRypLdTPS17VYGcexWOXbIL1H4YhWFc+aQ2HYofIznbIQBFrVgcdzjPU fPfeIimdh8rO3jA9FmXcLuhunlMcz45uuWgQsJFETbuX0PvAGcK9LHbKQG4eziSQauY3 DLNp4nT7hjWV7gcOHstGzjiT/Z2MX+MYXIZX8+azwE3H4p0pT1MjcOYJ2FWagDRYpA98 L9QzxcYQ+97eN1xhFLV20K+dOoIELhCwlSrDO5a+VdIPMrKgkp0NSxzpcOL/6Raitz56 xY0hs9zYsd+qUZxBDG7vvtld13Up/bdEl0iOaj4C/Srg+UZQFrkf8Xo4xkCQE1eH0R56 bKow== X-Gm-Message-State: AOUpUlHVMRBEu1aEVoS/prK2vfXcwKdc/yDQT2vndCIGokVXBm3+t1ZE f5KPWM8K+nBpqEidJLb13qbfUw/F X-Google-Smtp-Source: AAOMgpeDS5UiqnnxNDirJ+0Gf9jbtWqBKdQxHicDhdCMrB+9Lh+fVU2dK2avh9QqOQJ2NLqOyEFieg== X-Received: by 2002:a5d:4c4c:: with SMTP id n12-v6mr200751wrt.71.1531345543655; Wed, 11 Jul 2018 14:45:43 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:42 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:55 +0200 Message-Id: <27f0f6106f22f2d1943f0d838d326670e9a37a65.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 05/25] 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 | 32 ++++++++++++++++++++++++ lib/librte_kvargs/rte_kvargs_version.map | 7 ++++++ 5 files changed, 67 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..52262fe54 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_parse_delim(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..7f32fd1f6 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 @@ -71,6 +73,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_parse_delim(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..afce125a9 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_parse_delim; + +} DPDK_2.0; From patchwork Wed Jul 11 21:44:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42899 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 CCEFE1B572; Wed, 11 Jul 2018 23:45:51 +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 C155C1B539 for ; Wed, 11 Jul 2018 23:45:45 +0200 (CEST) Received: by mail-wr1-f51.google.com with SMTP id c4-v6so6928684wrs.12 for ; Wed, 11 Jul 2018 14:45:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3VDu06LFQ4J/b75N3K8Nn5QtaSeL/9dR5LnuAlbsMmA=; b=0WDhuBMDbhgjnoFi8Qoi2S+DaDvDhA9gveVqZ7YuNme7usaQ/NABwS0D2vqocftiwb wut8Cu8lepPzpU6VJhQcV3l1/cf8FuDlpXATB6UqHqByhMxuvim75e2jbA5BE2duZ6fW KszqVqMvStsLmPI4WeU2VOLgJhslmjBMXqe0EbTqrsRu3KDSe8naOPDVl8yLnXTkr+/X 39niUb8TylBuBsn0zZRrXq172qQVaqHYcfIg12+uHbB7ZI5qsa3fdPHB3q3Jtj1sTrbW MCpr7iPMAcQB1tAHtTh5kxR/wlDintzEsT63Bwob6Qs4XE+GUCx+x4yHOL90fChpAgZL 6wuQ== 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=3VDu06LFQ4J/b75N3K8Nn5QtaSeL/9dR5LnuAlbsMmA=; b=bR0ZkcYe/X5+3WkcukBj/trUz0lg2jXkpZXPp9CuDWh1/8RqoQAGWspi0JFeD9N7VQ JmKTbuQuI2qcQ8OyZviANvNIls+c9zenUCesCAxnpXO3XyLvuT7kkftj7B5hDR3IgU9C Hz8WZL3kX2s3oUUaZTMuNzGiJ/6t8DrnD3au+gmS9+UgMxPBII92w9r0bF7/pQ2/+riq H9nkBgikklOX8v39PZUiuGRqtoLO2A/BWCVgGGjSBTYoCMm56kDKcGQIPYg8tyvmf3xC WNEVY+ua7f2sJujt7nXneIzWa0c4wgax/hdck3Le29+TWFBu3U3d0jNlCqVVFkmv23Hp BA8A== X-Gm-Message-State: AOUpUlHVqCYOLliHfQAs0prZBjGHSzX2sEQd3uyoB8Ppx2E4+4/2Ztz1 4EYrivokNT8FyGQD3dXM+T9WtpTs X-Google-Smtp-Source: AAOMgpeL9qnrSvLmUh42rb5iJ5lXeOTQ/HVbLtQlF7UeciqeMy4ItbuVRxluu5OYocRzyU7E3cc3ow== X-Received: by 2002:adf:e78d:: with SMTP id n13-v6mr219281wrm.136.1531345545021; Wed, 11 Jul 2018 14:45:45 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:43 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:56 +0200 Message-Id: <0d2e618f68d5d7f5028a26681ca67cdcdcf3b0e6.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 06/25] 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" This macro adds symbols to the .fini section using the global RTE priorities, to ensure consistency. Signed-off-by: Gaetan Rivet Acked-by: Shreyansh Jain --- 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 Wed Jul 11 21:44:57 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: 42900 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 8AF361B596; Wed, 11 Jul 2018 23:45:53 +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 0AF821B554 for ; Wed, 11 Jul 2018 23:45:46 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id h9-v6so19609291wro.3 for ; Wed, 11 Jul 2018 14:45:46 -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=nYGUkpfqZz02rRRwz7XbBsj1kdntb/c/2SlGKIneyFs=; b=Y0Oo3V2ydmrsG27jA2PULUFvZ8W/EaD4+FgnNuTbD0E5gRqEjKHdeGvSlL5h/C7PaD JH4gyRdaItK2o/XgSJUrjgT/7oDZ6+GFriA7QnKsaHeFOqMSXxEMdOkZYhUNnmMKwNx+ 7WOmoiG8nqarFh3mkp34ETiJhRE6qNoRxjmaNdUaH0L3RimI6iNL13Jb/PNecfOUaPJk pzD/uIGO9vtPX/6+GlRSKkjsAGhH/UvZj4dFNCbBzycXDi1JyRMMZb1DjL3+F0qkMbba y7njARusaXfX6aQR9PhQWJuGIWG8zNmMKUfwC6wiGF3gIAS8+jg7a8ySTGLnswGkdKTp FPyA== 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=nYGUkpfqZz02rRRwz7XbBsj1kdntb/c/2SlGKIneyFs=; b=a4inFRCr0UC5RgWhwb/FY6VfZBXcVTzSG9D30FGSZgFqwpFQLuwwnWGGHcZI4qB7Y9 ROuULGchAIqA7JlxhJ6ZJ3nlZWXWJ4rEh/dxT9KZRRf99LbUFoytyhE1Hsag7NVZ+YU/ QKVu8nki7SHovTbXW3o1oduOp0W+JT1FAx+z74f3KDN/pqzYCtt8ciCyTnGG0JxW2Ah2 szVPvn6DcuocSt3dx5QQ4anpkyorjRrizRfNNT3hfGpI/wSsJ9AqdtC+Tx5MLk3U4UHC 8tTQa6Qw8w/xqEBTKWfrGFcBz8MKdjS/zFXgp8AEWKtruXcZ1yWVHv5NgBM4ih5waw6x uBXw== X-Gm-Message-State: AOUpUlFtqDoEM+ij+tn0o5uuiCyeoPzO1XxoSOvfgkXAsoMduvfbA8jP 3+Yns7Vohjks6So2tN2eD98C90E1 X-Google-Smtp-Source: AAOMgpdYjypDTDJBp4+CXEbJ3NPTP/muw15sAl4z77YkXZ+mM0EzkTQVY2OhkrC/K76oQS3W694KaQ== X-Received: by 2002:adf:99ea:: with SMTP id y97-v6mr195615wrb.215.1531345546298; Wed, 11 Jul 2018 14:45:46 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:45 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:57 +0200 Message-Id: <2ebad882d26ce9964b313428d5c07fe83acc880a.1531345404.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 v11 07/25] 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" This abstraction exists since the infancy of DPDK. It needs to be fleshed out however, to allow a generic description of devices properties and capabilities. A device class is the northbound interface of the device, intended for applications to know what it can be used for. It is conceptually just above buses. 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 | 131 +++++++++++++++++++++ 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, 201 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..a79f3152e --- /dev/null +++ b/lib/librte_eal/common/include/rte_class.h @@ -0,0 +1,131 @@ +/* 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 describes the interface of the device class + * abstraction layer. + * + * A device class defines the type of function a device + * will be used for e.g.: Ethernet adapter (eth), + * cryptographic coprocessor (crypto), etc. + */ + +#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) \ +{\ + (cls).name = RTE_STR(nm); \ + rte_class_register(&cls); \ +} + +#define RTE_UNREGISTER_CLASS(nm, cls) \ +RTE_FINI_PRIO(classfinifn_ ##nm, CLASS) \ +{ \ + rte_class_unregister(&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 Wed Jul 11 21:44:58 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: 42901 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 3D2591B5A5; Wed, 11 Jul 2018 23:45:56 +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 86FAA1B56A for ; Wed, 11 Jul 2018 23:45:48 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id g6-v6so10691606wrp.0 for ; Wed, 11 Jul 2018 14:45:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5lquyKyb4fQAQodLIsSlzwJeEaVORDxXaCUXdXbGS6g=; b=GFkctAr+aDgtIdEtp7VMjxK5cQUQX+wG7wd4QrwY+cynDpVwgR3I0E8ZhMOs9aUKdU Eme/GhmJKLhaSYeyGfId6r+joEP5MtjsN0rWC72cLk1UrNU3ZpJ3F4rPclBbJHCu6GSM W229RieEfm0hl+H62fTUW+OoJq1L/CB1xG3FjdNt668VYV1ML9vu+JA9V1Jm09MzlTjA 82pIBirBuXh0U5tcrVd69oZIjKygLLbUUL0uuaJ9xve+9i5FfuF2anaZ/mMW2H7GF/3l wXDCOx3A9W7507zXdGMk2voCF/sgmuixtwyRlfC13GP0ogD1tuUqPSgahFHycZzY+jU2 y8GA== 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=5lquyKyb4fQAQodLIsSlzwJeEaVORDxXaCUXdXbGS6g=; b=OwutrqGH1L2K+ZUGLhyPU7nqN0UUxRR72vmevPzQL08qV3ofIm5m9g+/5lEr1NlmIJ 1uzltWZlppzK9mAt2P0JRYBP7fmVCFsddLAcQUn7Vp0rs60KE+9j2mUhhKJkr3RS7nOr AtNC+MWwMtyaRCFd4uv6TdeVBtBG29Pb0r3yGF5hVXOPaRjb1PrtXxvZSw8x7znlIakf a294jBcqoTH84v25HVrVTZd3S51IR4kjoySfqItZcwk8SQNMykIN5ei5iwIraAIkqYku GnNYfgye4KpWG1lx75zK82je6YVbebpcUlpuOs/gSBQoh31b/gpkzsXfjZfW5dZxNbNb xqnQ== X-Gm-Message-State: AOUpUlFPoBOeoq9GSErvJcxF+94WGyhfWHhiYzShB5m5uyG9Id+IRUIy XtgA2NCQZE4YvD7n7iknRtjEAlWU X-Google-Smtp-Source: AAOMgpcV8d7F0QCIxocolnoNKT4XHyX5buNUBYLy2ZdykbSvQp0IhwRr8IrptGyXz+f+Eu5lRIQMYQ== X-Received: by 2002:adf:f850:: with SMTP id d16-v6mr209105wrq.172.1531345547668; Wed, 11 Jul 2018 14:45:47 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:46 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:58 +0200 Message-Id: <31ece7bda6ce4809dd5a6941a4f47176996b7321.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 08/25] 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 Acked-by: Shreyansh Jain --- lib/librte_eal/common/eal_common_devargs.c | 144 ++++++++++++++++++++ lib/librte_eal/common/eal_private.h | 34 +++++ lib/librte_eal/common/include/rte_devargs.h | 13 +- 3 files changed, 188 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index f84f3d2cf..a22a2002e 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 #include "eal_private.h" @@ -57,6 +61,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 *devargs, + 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 (devargs->data != devstr) { + devargs->data = strdup(devstr); + if (devargs->data == NULL) { + RTE_LOG(ERR, EAL, "OOM\n"); + ret = -ENOMEM; + goto get_out; + } + s = devargs->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_parse_delim(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. */ + devargs->bus_str = layers[0].str; + devargs->cls_str = layers[1].str; + devargs->drv_str = layers[2].str; + devargs->bus = bus; + devargs->cls = cls; + + /* If we own the data, clean up a bit + * the several layers string, to ease + * their parsing afterward. + */ + if (devargs->data != devstr) { + char *s = (void *)(intptr_t)(devargs->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..722957428 100644 --- a/lib/librte_eal/common/eal_private.h +++ b/lib/librte_eal/common/eal_private.h @@ -258,4 +258,38 @@ 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. + * + * A device description is split by layers of abstraction of the device: + * bus, class and driver. Each layer will offer a set of properties that + * can be applied either to configure or recognize a device. + * + * This function will parse those properties and prepare the rte_devargs + * to be given to each layers for processing. + * + * Note: if the "data" field of the devargs 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 *devargs, + 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..097a4ce7b 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 *drv_str; + }; + struct rte_bus *bus; /**< bus handle. */ + struct rte_class *cls; /**< class handle. */ + const char *bus_str; /**< bus-related part of device string. */ + const char *cls_str; /**< class-related part of device string. */ + const char *data; /**< Device string storage. */ }; /** From patchwork Wed Jul 11 21:44:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42902 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 460761B5B4; Wed, 11 Jul 2018 23:45:58 +0200 (CEST) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id ACDCA1B539 for ; Wed, 11 Jul 2018 23:45:49 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id g6-v6so10691651wrp.0 for ; Wed, 11 Jul 2018 14:45:49 -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=C4kfmhhDec3yERy3OYFtMnirjd6NayeqAesuv3kzo7U=; b=gy6CO9u0q4m6939Fos37SmigNznPBtuHIFP3Rwa5Q63hsczapkuWISb6RlT6kg7tFG QlYaDYnokJhsw7474uwpuh1hPv9YM8cC2Jp5Doh6t/WppFCckWmWmSvdt7LaEUEZpP04 k0lqpqNnwsrkseHvKH9hBRXnYtxRXpVtbTF8l/LjXtFJ3RfFSrcipb1k4066j8Z3aKor GPjvGLETNVTUvqEUBLRa6+n/nS1wYIUkGVP14mcCDfZA38Dp+qEQiDGnLtb/BHcOV5Lj l4blZ2374IGpv1Pie6qqED1nH0a9I4wS5Yp2S9WZ8N368BztQeKgD9R10uEoxh/zbEiO tP6Q== 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=C4kfmhhDec3yERy3OYFtMnirjd6NayeqAesuv3kzo7U=; b=QgEE9Unnhij4eEF1jpuDb4nKAnh/NIc8mMQdMDvKlZY0V/OCDtC6d2uZ7hONlDQo+U M9NT/Dwv6Z/LCqtC4pak2sB1qnJNyGA7YzLi947sXQ32V2hvHnmYUVQ97eIg926giGdu 6a69SMCbboJ3rfP+7xJb1wNYTK/+GYh17Tim0t3xrBJoOyIxeZA9U8UBw5sGv2EAjv1F cvG8eWhFn4Vk3cqiqy8DNfyKUUhRyaNLJKmEz9iclYNsRjs8mnqaMYdFJZmeHl9HfBNP Gp1fv97qMZDBZBzKtCiyB6mE/GKD8jZ2P7x4xt/MK4ftUlUIVJZaJ8Fs0HScdmsWlJX/ tAhg== X-Gm-Message-State: AOUpUlErzl8fDrJIyHUsGmDcQ1fwE6mVgxwKdHqbjR3/R09W03+nhP4D M3k9CGSZAeRaVT7W35sSiCmxxvzq X-Google-Smtp-Source: AAOMgpcKdUXT000vQvkpenPvkqzt5xw6u7LaqF8frDufcnf8uPcssp4N73Mp0fRWlQvmEp6Mqm6Eng== X-Received: by 2002:adf:92a5:: with SMTP id 34-v6mr224764wrn.83.1531345549017; Wed, 11 Jul 2018 14:45:49 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:47 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:44:59 +0200 Message-Id: <55bada19d99b0d3edd5ca31c9a9d897162a3dec6.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 09/25] 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_bus.h | 1 + lib/librte_eal/common/include/rte_class.h | 1 + lib/librte_eal/common/include/rte_dev.h | 47 +++++++++++++++++++++++ 3 files changed, 49 insertions(+) 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. */ }; /** diff --git a/lib/librte_eal/common/include/rte_class.h b/lib/librte_eal/common/include/rte_class.h index a79f3152e..85dad5a11 100644 --- a/lib/librte_eal/common/include/rte_class.h +++ b/lib/librte_eal/common/include/rte_class.h @@ -35,6 +35,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. */ }; /** diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index ba6e445fc..49000abac 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -284,6 +284,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 *dev_str; /**< device string. */ + const char *bus_str; /**< bus-related part of device string. */ + const char *cls_str; /**< 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 Wed Jul 11 21:45:00 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: 42903 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 F13411B5BC; Wed, 11 Jul 2018 23:46:00 +0200 (CEST) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 135521B54B for ; Wed, 11 Jul 2018 23:45:51 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id c13-v6so19558163wrt.1 for ; Wed, 11 Jul 2018 14:45:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=yXVPuQbXIM7PPzxvuLOIBdECBu+SGT4tTjEn838vlUA=; b=1M0bgxYD+Cbeg925PnWHEp5AAJDxNQAAF+yJEa/AgRWdE8Dx/b3IWVc2zO52dzZvj7 bW26OUactP33kc9V5dK1kD1AhjqC3hCI7dK6d6j6O2xCF+PoCvpAqnzsX9QVtU8LxGNb ITwgu9v/u54kcDeS+MXPSaF9X1/KIrX3B02QZRdmEPYMcWsHeuJ+GtgYLux/Vz/FJnw7 FoQYJGgomwtB911ZYiXqQQtcASo2sKnAa1HUEqS78/2o11nERuklPkPJJPNs/yxA2e5B +MWMvTTVRFoQP1TRj5WioM/tJD3PnS3ZH7Dc4JsVfKVhbautFNBtBuUlH9UMsEpwHu2P kU3w== 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=yXVPuQbXIM7PPzxvuLOIBdECBu+SGT4tTjEn838vlUA=; b=PfiQsRmetGXAupR/PP9UvBPa57IKeTE4X/vlPJKObY6wCwJmjJElSK55JCc2Vc2O2u MrgwOd5leS2WyWUEA08m0Rfzqht/Ubp6yv7BewwjSy5pd90QVWZT8w9OsmRVtM8JH0rX 1XJFWAkLw+fmIsSJdSTT9kgzc5s4NKfgj4lcqEiE00k19Ro4/FLhvM9upc91bafP+QFf iEd5ZJySa8s7Q7XCqXElMOinM3KLY2vvxn4yjISLm99oe9KDAIavkXWe1eQinTXAAYDf GVXykb0CCkN3piSxsLwdiZI8VZWNQCQQ6VUjT5oRUqUPHbANoB+P1BwOdj5x3KuEhneG ImTQ== X-Gm-Message-State: AOUpUlG+U8ealGxh0xzF6T+v+DQcmX/T58vaUddo8bpdU5b2YW1y0kOP lxxl6vFkXD/7acl6Dssl/vL30zy6 X-Google-Smtp-Source: AAOMgpf0uztanZjZXugGNHw9csFqLeeDyrAsOVRq+1W0DfQRl4g7s9Nn+s5HStu4jqH6IIzqJaxH1Q== X-Received: by 2002:adf:fc86:: with SMTP id g6-v6mr213370wrr.216.1531345550260; Wed, 11 Jul 2018 14:45:50 -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 h5-v6sm10550936wrr.19.2018.07.11.14.45.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:49 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:00 +0200 Message-Id: <806fcb35c84d6e8c0f8479c7714a1d8505b5d440.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 10/25] 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..63e329bd8 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 *dev_str) +{ + struct rte_devargs devargs; + struct rte_class *cls = NULL; + struct rte_bus *bus = NULL; + + /* Having both bus_str and cls_str NULL is illegal, + * marking this iterator as invalid unless + * everything goes well. + */ + it->bus_str = NULL; + it->cls_str = NULL; + + devargs.data = dev_str; + if (rte_devargs_layers_parse(&devargs, dev_str)) + goto get_out; + + bus = devargs.bus; + cls = devargs.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->bus_str = devargs.bus_str; + it->cls_str = devargs.cls_str; + it->dev_str = dev_str; + 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 49000abac..fdc812ff8 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -331,6 +331,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 Wed Jul 11 21:45:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42904 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 156681B5C3; Wed, 11 Jul 2018 23:46:03 +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 3E50D1B46A for ; Wed, 11 Jul 2018 23:45:52 +0200 (CEST) Received: by mail-wm0-f54.google.com with SMTP id h20-v6so3931320wmb.4 for ; Wed, 11 Jul 2018 14:45:52 -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=pHdH5CMwam+4k9OqYdwo+Y6hZ7ItDWf7ml+tkO03Vgo=; b=rIZUoDme8DEElU6ha/ELmrytteJC5S8lQbRpvGWr9Sn5N4gwp3pjzyd790fi6BDA3a RDfgMXucLWJLNtGq+RVv9gFev3kV8snIoZRWMQkSXBAml1fZbZPoOC4/6dOVYTXY2Q0S as0mErgzP1lQtLEKIVdltRn+g+c0O9XObwMp8YClT8nyyfgRuVjSU9ZHE6mRhqMJQ8iP vY5xW2NBQNNeyA6JdCtu23hzXJGLWyLoFmDoxgJKF7L0jzOu8p0uC54fAH9zN2as1akZ 2sIMuF8JGTWdBYPm0sbJYIK/EKUYalmwQ5WAhh/0FYMQipMf8/7Eih2klxxuY4lfNvfg iCkw== 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=pHdH5CMwam+4k9OqYdwo+Y6hZ7ItDWf7ml+tkO03Vgo=; b=Rhb+2AWyP/y/bWWZFySHe51y7CShasE5N/ccVxr/UVc6ISJ7c3DOww+/i0orrIDrmT o9/B8Wx9xj72XXqLqGg3Wp4Pudbsi1a4XaBixutApSNiOstLnHv7SxXQPX2aAYRSIl0v A4W7F2Pkzk0mRpSrm9i2KT8HJuWAWpK0FLoLMqEClggW7Q4+Xeo90JxOkDEK3qBxLF+N DGEBgSK93tj9tZDVpR89qZohN6DV1ojv+x2jZkZ+Cl4kpzxyHPW7kbJHAIAD+ymCtRmY kzgTPGxst+j2ZuX/ldIvAgciurC1RczKFEV7tBAuq44LrXFElcbeydnQghuxqXa62byr tQKA== X-Gm-Message-State: AOUpUlHtKnDL6L5m6lEmt1zF4ntoPllCJa0SlKDfj9Mt/RgAyIuqS7ro qJRcFYZxDCfegLePSfnDvnw6rXab X-Google-Smtp-Source: AAOMgpfflB3F2fAH7QwVrIcJrspPuHqNbSRXitLkaUrQfDYP4KNVX6RNDfrhE6WQwL4BP6GwB8J/GQ== X-Received: by 2002:a1c:e304:: with SMTP id a4-v6mr147466wmh.0.1531345551490; Wed, 11 Jul 2018 14:45:51 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:50 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:01 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 11/25] 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 63e329bd8..b78845f02 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 *bus_str; + const char *cls_str; +}; + +#define CTX(it, bus_str, cls_str) \ + (&(const struct dev_next_ctx){ \ + .it = it, \ + .bus_str = bus_str, \ + .cls_str = cls_str, \ + }) + +#define ITCTX(ptr) \ + (((struct dev_next_ctx *)(intptr_t)ptr)->it) + +#define BUSCTX(ptr) \ + (((struct dev_next_ctx *)(intptr_t)ptr)->bus_str) + +#define CLSCTX(ptr) \ + (((struct dev_next_ctx *)(intptr_t)ptr)->cls_str) + 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 *cls_str = NULL; + void *dev; + + if (cls->dev_iterate == NULL) + return 1; + it = ITCTX(ctx); + cls_str = CLSCTX(ctx); + dev = it->class_device; + /* it->cls_str != NULL means a class + * was specified in the devstr. + */ + if (it->cls_str != 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, cls_str, 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 *bus_str = NULL; + + if (bus->dev_iterate == NULL) + return 1; + it = ITCTX(ctx); + bus_str = BUSCTX(ctx); + dev = it->device; + /* it->bus_str != NULL means a bus + * was specified in the devstr. + */ + if (it->bus_str != NULL && bus != it->bus) + return 1; + /* If an error occurred previously, + * no need to test further. + */ + if (rte_errno != 0) + return -1; + if (it->cls_str == NULL) { + dev = bus->dev_iterate(dev, bus_str, it); + goto end; + } + /* cls_str != NULL */ + if (dev == NULL) { +next_dev_on_bus: + dev = bus->dev_iterate(dev, bus_str, 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 *bus_str = NULL; + char *cls_str = NULL; + + rte_errno = 0; + if (it->bus_str == NULL && it->cls_str == NULL) { + /* Invalid iterator. */ + rte_errno = EINVAL; + return NULL; + } + if (it->bus != NULL) + bus = TAILQ_PREV(it->bus, rte_bus_list, next); + if (it->bus_str != NULL) { + bus_str = dev_str_sane_copy(it->bus_str); + if (bus_str == NULL) + goto out; + } + if (it->cls_str != NULL) { + cls_str = dev_str_sane_copy(it->cls_str); + if (cls_str == NULL) + goto out; + } + while ((bus = rte_bus_find(bus, bus_next_dev_cmp, + CTX(it, bus_str, cls_str)))) { + if (it->device != NULL) { + it->bus = bus; + goto out; + } + if (it->bus_str != NULL || + rte_errno != 0) + break; + } + if (rte_errno == 0) + rte_errno = old_errno; +out: + free(bus_str); + free(cls_str); + return it->device; +} diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index fdc812ff8..8638a2bbd 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -355,6 +355,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 Wed Jul 11 21:45:02 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: 42905 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 6D1861B5E0; Wed, 11 Jul 2018 23:46:05 +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 80DB21B590 for ; Wed, 11 Jul 2018 23:45:53 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id b188-v6so3719873wme.3 for ; Wed, 11 Jul 2018 14:45:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FCiWZCW6CR4FN7hgRxpm6MaGb4vrkQDcX+s25dOVhXA=; b=NO1j9T646oF7j7Z/+2KTasUqzCVhScyhNid18OzP+r37/GJwhKZCJJ7Aiqz5gYPPQV LVEslGvPI5v45Oe6I+9FI1xLle3zecLbsJEHFlYEPNzorEqn8sFJohE8QdlKL0vEjGab cSze+wIv0Gjww/DC0eMY0bk6aSY7WHAPms9f+dBokjAtr1UW18/doUa0K87RbRvQngO7 9m+vGc/JDNS/aw1SXuuCeb/6bBmzaYRIPs9qdnL+ZE15aJRUASovWoy8TMY0u1B5bGjv QNxEBflw6yDtRC/kM0ojrj5thdC4ORV+AWlLlUSLb/UDwNh3xL8ipHE8tY7j8ZIk4hhM GFUQ== 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=FCiWZCW6CR4FN7hgRxpm6MaGb4vrkQDcX+s25dOVhXA=; b=YHsewUSxmSG4J8p3z2CTm3oLAAOv/xwYBzs8OTGF2TjgMrYRsapsUA9kSudl2DCQWN pCYU76FEInL6GLo+VR1Guwkr4qkwbVsGGfx/aGYx6atB7YVbNB29zVJ/15dfduLvQok8 pRZEZv0ONhzhWhBOjjhL/FKzXQVtQOZlVWPYnGsaTIRPoJyOdH4qGqo2b8ztCeljZX9b e1uJ6DYIIvUI2FYAFlqB4zi6Ixfxv5RkJfUOd6+0SrRXrs3MgY1/Ss2VlEQehw/ozScX 2YJkvKilxRU9fzUoL2RFwqaYSWUMjH8Oc04kxr8hFFDlSrX1t0gQecnqLDKOBA0JrJif 9MMA== X-Gm-Message-State: AOUpUlFbOM4gnZBsJn8YStE1OYbQduqW6Ut8sokZDy+LF7vbnFyMHGAm gLmgIuijVD+tQqvFll+K7i6oxWEi X-Google-Smtp-Source: AAOMgpdFq9ujjFytjV9w+y90/+nCcdDKhfTFBqs12SNKHvigKWAOCeO7dD5e6tXICrDTzwR8VZsLIA== X-Received: by 2002:a1c:2208:: with SMTP id i8-v6mr121062wmi.105.1531345552740; Wed, 11 Jul 2018 14:45:52 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:51 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:02 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 12/25] 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 | 26 ++++++++++++++++++++++++ lib/librte_kvargs/rte_kvargs_version.map | 1 + 3 files changed, 37 insertions(+) diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index 52262fe54..a28f76945 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -193,3 +193,13 @@ rte_kvargs_parse_delim(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 7f32fd1f6..fc041956e 100644 --- a/lib/librte_kvargs/rte_kvargs.h +++ b/lib/librte_kvargs/rte_kvargs.h @@ -153,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 afce125a9..8f4b4e3f8 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_parse_delim; + rte_kvargs_strcmp; } DPDK_2.0; From patchwork Wed Jul 11 21:45:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42906 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 E2C591B5E5; Wed, 11 Jul 2018 23:46:07 +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 BB7221B590 for ; Wed, 11 Jul 2018 23:45:54 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id v128-v6so3681717wme.5 for ; Wed, 11 Jul 2018 14:45:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=h0xkCD8pXmexmiB8DVL8tN3zJgZ4vg1US2nLekosT40=; b=RWokiLZwLxhOlTEc6IVE7CGAtoB5iewUpurHEUV/yAyjj8OJTw1hWRFCRhyYzRvgp3 IajGmuDmeLpM+1/VW5BISada1t4pobst0ENJQWsQ6IMMk8rK5fYHwFXGgYU/4pac8HcW vNFIakQY/HZSL6z2JLkva/1qUWyXKkL6Elx9346aoQPLG+k7/Qg6wUPXBv3iLuweaZVg uLj2G/GaA5TWZ+auvBSjI9ZK8HUu96QYc/At2EA/mq3Zs/60f8ZHo5HoMNY63JfjYUvj 1Kf+HKSe+BueSoJSiovJ4cLSwJ8ZA0tkgzIIluCPtd4pQFs9qJU4Gs1wTX9bfFKe9DQg jckQ== 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=dNHSIsdCfY2AB3rGZdHz3iOyAw75phyWpzA1wXgJ2p4Lr42hifisJFkXU7NLsfx7E3 5UZZDmyw5eNJzZOBT432Dqv224r54te52c44b6UoZLk6NGgmsoiF95pg1YCY3OHlMUxA tjQIZSvabcCZzEfw0plgCIxM4CIlTb4acnGsJTl7CkVJ+jW884KJJcVIO2tXS3TFNCMj HHNZ5e3DvmFszZrzYIxbpng3c35X1Tm0eT1m5ehKs61VElbl2z32egs82eClFvtQhnhA 3sjlEUODAZDuM9StZ4+hPaqdQYnCXXJFjrRF/yEmhXIWHt3H6LdzFN2eBiD1GUGJj1Yn TnmA== X-Gm-Message-State: AOUpUlGT+ykyRCPwDZMCdjVtNS1WOLxo3uaRKkeioP1W1g7DYXVZUc4c 3hVmdRa083tFwxWi4JccmbR+0qzp X-Google-Smtp-Source: AAOMgpd9Y+V3+UqlUUUC8SMZ9JvVPGZUIiYCUmTCI606R5ac2J6jVgE/NSO2M3rdtk26Fz74R9aRYQ== X-Received: by 2002:a1c:149:: with SMTP id 70-v6mr161540wmb.2.1531345554029; Wed, 11 Jul 2018 14:45:54 -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 h5-v6sm10550936wrr.19.2018.07.11.14.45.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:52 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:03 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v11 13/25] 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 Wed Jul 11 21:45:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42907 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 7285E1B5E7; Wed, 11 Jul 2018 23:46:10 +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 0F88D1B590 for ; Wed, 11 Jul 2018 23:45:56 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id v128-v6so3681767wme.5 for ; Wed, 11 Jul 2018 14:45:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=r4ztlloUtcLCOt/o1+wTBrXUXycouEUdDNJOvdSjiec=; b=LVskmLOkKzfvRWoYmiGOcs3Kqk6t7ITOF5Nap0TUZD125cqBoaSn6NZCJaxG3rE0lw w/Jxm8iLQtE/RBuxQna5fqI1H6DPp9HlAR3vCtJzURjPRDMgCoECJFIqrqWh9RYQ069/ WQXgPcWjnE3O0rXqrIBuPcvly4e8EwtEoD4x4WxXs3cu3rVHaABeEFSrdOOOE+AOVfnu 4b+uszkEFQIsie0fOqQ5kZVGkGaRPQvTnkQS186kduoOLpOpabptMLWP4eg0Orjqn6BN HKEAI9d0K7Y0fvL8IrboKLqrPCmb9hd/dXRLW/V5nTmXFBvfslMCB3H6FmhOSOvsFBpW 0E0A== 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=cqBMEARwtSjtSchiqjLJoDzHPaEIV/Gkc/0ytq7sK2UcpYxhKE+mlMA5o9qcFEqDzT T/ANCDYZdFvHlQ3cRZ+q5wqt1ISZhBC2fHOr5UWfrCUbiFqyQhNihGKMifvzJFvCFmMG X5+VxyjeXldxrzU65iWibtSuXNvzTsMC1nCzht2EZsAeMiRIROveE75/3a5uXnXSO0Jp SY6lbSoIS8JCIiIAtaIsLNFlX//4qkR55b+yopiSlgrw0fTsEYOY378KxmClxzHg7LoB MFFPvMkvV2uBozXOkieNn5MvF5ohp5oTrBwIFB2OgE44Xh2tTZwFMVuJXmRchrfTihEj iCUA== X-Gm-Message-State: AOUpUlH3jP0lj1spBJGPq7n51RP92ZZoR/8GPuUXABXUhBM8G92aBS5u b7Xom3D3R/x5he7Fjc7/qv3tyFC4 X-Google-Smtp-Source: AAOMgpfVAv9iNQG0NMclByyBIpnwxwWHGvAFkWqE+5Gr+raQNTDXNsc8pkGODy9jm7tsplyZQb1ipQ== X-Received: by 2002:a1c:497:: with SMTP id 145-v6mr131590wme.157.1531345555392; Wed, 11 Jul 2018 14:45:55 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:54 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:04 +0200 Message-Id: <27d2d89061a08c12c8ef4a0cb95527df914b3976.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 14/25] 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 Wed Jul 11 21:45:05 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: 42908 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 240601B5F3; Wed, 11 Jul 2018 23:46:12 +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 3B7851B5AB for ; Wed, 11 Jul 2018 23:45:57 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id t6-v6so19592044wrn.7 for ; Wed, 11 Jul 2018 14:45:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5OM1VqWbunFM8wPdgB3OgPPGvAxoucxEVAX0oAGkDdI=; b=fDb1wR8JJ0hWYayDypOnJbzrlLMEcga4NCHrsH6d1Pn2afCrjnr13ff1BS2V/3rqBz RNT/0s2whE0NTs0eAu1k9VrEdjEib2JQYZggj+5sh5aYiFLmKANZVYgpZTJf/36RuoHn 97kobXHhE9V/O0IRPet2+Rty0spbI0Y3KCRGxWMRTPUgz6qrG1wm5loILoB0/mqeWSmz r+HzHxisQ+d2bXIBsOpxkvzvG3WDKHvMr+PQf+4O4DfzV2B3tk70J0fo5NSvulSg08Ab DFue68GfEiHPn4W4By4UWTWhi0yLE9ALRGssqGM42+KPL099bE7pF5M7fTnaIvThanX3 LzmQ== 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=a7+dyMo6rYQ2bQflp1CEhj5chv+Vu2L8X/DJC0MTrhAUmMr2M2WPx0bAsorv+rQ+uR c4U3s5DewPZyzI6hMD4Ykzc6So95yWPIhIjs5qwNDdVuasw3dhPvHEaZEDUMKmHYTjyq asvQn9LV03/dnfL6aLfv3dBJ+7ffucMnzx/VzW5N6sqGcv6JrvXd+cvknGq+KWrxoBMe cYzVNWQF4sWpL9u/FoXT1LwTW2+bS49FtN0JYylsPhrofv/b0LK5vfIKLjtllgFhWps4 2vMBJ/Pxs4X5Gd2tUlXHfrcVj3b6mv4yDyr37XjntHQEuInG4ODo9L488mI6+V/4tPAG 99bA== X-Gm-Message-State: AOUpUlFPxwzlfHxDkO6U4wo3sTNt/zYuPbGhMQ0Kc5nt8S2oEe6pLgR8 m6EQCdg+6f/2qKOuAu0elWp7vUHJ X-Google-Smtp-Source: AAOMgpdPEidUFp4JLD6lIhQFXateAIDeUUvAHYH4+qPzCcJl6DJ7sL0Xw66MIVVPJr3Y1Vz34HglJQ== X-Received: by 2002:a5d:45c1:: with SMTP id b1-v6mr225541wrs.106.1531345556566; Wed, 11 Jul 2018 14:45:56 -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 h5-v6sm10550936wrr.19.2018.07.11.14.45.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:55 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:05 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v11 15/25] 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 Wed Jul 11 21:45:06 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: 42909 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 885041B5FA; Wed, 11 Jul 2018 23:46:15 +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 94CD21B5B8 for ; Wed, 11 Jul 2018 23:45:58 +0200 (CEST) Received: by mail-wr1-f68.google.com with SMTP id t6-v6so19592093wrn.7 for ; Wed, 11 Jul 2018 14:45:58 -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=tLhv0Ctq9iwXhxp5xHgQj8ojkmoN1RNUOQasHIae38oh7uhcYGJuP63Nms4WdVx47s 3zkV2cdMsgqTcaVyA2DJh6LCccobD/OO0brEcZpO6m9fUYZegyTcaZEZnf9ISVXAbC7j 1ZDG+d4h/zIQV0NF2s7VRYvlgMi7ccB3RE6d6/A+wJfn/dAL4PLY6JgVh48HAOhCopVs ek4HProsqewZW/C0sMZBuMN5mXacfI7mvKd5c6FqBlGY0hfeRjoxxrjlISKzArQa4Ori py9B5vptuEaq3vywSBTxqSWmbe22DHhhfY0TT3NocCF+7YJjDPBl1JSJWbRhVsvzyFkz 0Rqw== 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=umQFvgHS/eUP0Tpw7CwWw8BTBmx+jIjBSiXpvRFC2w2ukQUyEMxsJWd7cld84PLgMK nb/HxZd8CcLq2CmfI2Tnxlt+u2otABZdtbsW7rcKYoMRtAWTZ8/vLC9xLb83YMkzYgBr IEeNHWkcnywpCQTdZRbSZxuw/uGvgwQXruPOaEpNAO4Wq7jxn9DlUK2FmAihAHArdJ2f KXIGvC0PgjMyx/z8WbSSYgzGu1+3azBbZkvgSx8w5g0NSY9Tw05i/DHluCy7BCPoVQW5 +GL0no2MmA9FPX70fGvZ1DpzM3nNs2G5ZVC69zbzGsacLrbUHAbBWjqIgbj5syjJh26h wPaA== X-Gm-Message-State: AOUpUlFnW/Xzzl/9aHa1KdrPYCvzZtxL9YIxRpKe5TgJnl/eRD5fb8TY olODgdWgJCHBuB4C1XFL5wZrsaEF X-Google-Smtp-Source: AAOMgpd73knzCZ2QuR/xBq1JCFmHs/NOA/LPV3DBbttKjWkEkUsYXHHK9XYyB4isvYg7niwEwkhcmA== X-Received: by 2002:adf:cc0a:: with SMTP id x10-v6mr202051wrh.242.1531345557906; Wed, 11 Jul 2018 14:45:57 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.45.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:56 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:06 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 16/25] 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 Wed Jul 11 21:45:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 42910 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 3BD771B5FE; Wed, 11 Jul 2018 23:46:19 +0200 (CEST) Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) by dpdk.org (Postfix) with ESMTP id B8AB71B5AE for ; Wed, 11 Jul 2018 23:45:59 +0200 (CEST) Received: by mail-wr1-f41.google.com with SMTP id g6-v6so10691982wrp.0 for ; Wed, 11 Jul 2018 14:45: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 :mime-version:content-transfer-encoding; bh=QULDkel2GQDzMNjd+rImHB2X8ULZyndn6CAHpB0vDoI=; b=W4vTWBdOEjmSM1P+5T1o2bycD/9ulIXJnezPrIdZbMzwcrqBD9g8DuSAU8txf2VITo ai7GX5fWPVhANtIU55XYvn9ZclXQDdl59kZa9D+ETrfpQuXJSDzHkjt8iRJHTUr6z4As I+x0eLYNGNUtxpIgXCgBcUz/t16sNPk900q5AxhJV52LyImfve5/YDjqhvXIrsUL74PW 9CQ4BbgowWtKoq+2+jKarfyTlLbDJ9U6uSJGu976Iazs5s2yPUfb5UkplQakWBX8nn8J mfRzmgy9BVYx6buUx728fyujeYRT85NWa3xt5DKt3ybNFHz3XX8ahLrOx0x0/JLY0t2M yJBg== 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=kzA795lWY9YBC9Thb1R5CLZgG8gcroHmibjef9xvxwLLwCLPsiCPE5CVY3dmH4PS3N +ZUaqPY36LswjNOmggk5y7zmgaWln+IM1zpu+2yEf1r91rCZa/0zAhP+3GbHYwdq/QT7 FdM6Smjd4d9YyG6IzuwyKRy9BAqh5LnykIZfLgMRK52AySvWRZ65PTBVbYc3tI+B6axM AkDULtf881WisMR2VBif8z/HG+WAxmti935zue44Io6GNO4XR9zqMW/a+B9QL2DXhhBg ZzUL+FB6zX+6NR+jbHG1zAP+tfg7wbF8B+SMo1cV1aCawWAPOKYd5S77DPU1pljfTaEr egOw== X-Gm-Message-State: AOUpUlHEJMuHk2Shz3TxcnsVY78lGbBb4swUGo1kHfBnJe+vmr13Eq1J xSHrNjCKXBlcRJDn9Ohc4l8LI3kW X-Google-Smtp-Source: AAOMgpflKLnuyD2q5ebBXIKRYWl5bbJGnI66i9ETiEYeyrJaxadDAmUuiUhYO+sssT+Bq2/sbvqvfA== X-Received: by 2002:adf:8296:: with SMTP id 22-v6mr209118wrc.252.1531345559118; Wed, 11 Jul 2018 14:45: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 h5-v6sm10550936wrr.19.2018.07.11.14.45.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:58 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:07 +0200 Message-Id: <8093a1aae22915c388350be63f5e8e4da0e17f65.1531345404.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 v11 17/25] 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 Wed Jul 11 21:45:08 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: 42911 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 DB2D51B5DB; Wed, 11 Jul 2018 23:46:23 +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 100D21B5BD for ; Wed, 11 Jul 2018 23:46:01 +0200 (CEST) Received: by mail-wr1-f51.google.com with SMTP id a3-v6so10374096wrt.2 for ; Wed, 11 Jul 2018 14:46: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 :mime-version:content-transfer-encoding; bh=4GVoPGxPVbEi4xXKoRREOyrMdd30uHc6auy6dlwC1CU=; b=s7VvSwj+HDLO+PtOIhgYKlavgAFPC1k3m0xyarRU56M7o/IR6quCEt3w3SF9YAhbjx SDaB3cKXIxNlY8BFf3e9xlH96ukFeIGN3/kY8qsiYi0Kpm794qXGgGSfmEZ/oIMA/8/W agWyhdXGOODVxBY/6FrVjZlcKOooZlD94YaDjOAALN7d7nn9aZgyebYhqnq4DjLsn7NS GZq2fQ1nH/rpX6Ky56uoHWOyXIiypZkfWep5hZRIr3tV/OxeCSXpXzYop3tRlaYai0E7 kMT6XK1Eqyv6oa0mmO2X+pupIX9iEnjIdiP0josCfK/8w5pUffJtQpUYv6d4mDtRVAWV TtcQ== 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=WyApgEp0O2yxULNbvHij6Kudu/rD+ZHtAjb39taSJt+tBWt4PM9+M1394gV5Nk5iOz 4nm/C7diqmUJVBkTr+DuQsP/oNlQGvoxB9UKRJXfxc5M5HMMTSn6QqeKJP4Q+0AiFzgK yepfAUrZs7A5A8HXfReJmO3ji9wG9zn9g0Ia5cEatPonClvpGTppmmTpbThPmu/tpS1c hbXe3O65gldURdf1Tp4nEqbexyrpu7ZPqHY5hW07SxzYoMPDJigsko3Viv5543Aa6Nop xaPtTRG0DPQllldlLQ1Xu5o3jnS8QlKufAnqV4Wmxe2ocQGqcuifgroPVEP889RaXIrk fwTg== X-Gm-Message-State: AOUpUlHS2dzuCi+PLonk5/MoXs1OwoZRVQtn3vPGRR4ncfqwTUNQZIFk MrGEMrguBLjyMRjtaS8PCNSNGnQd X-Google-Smtp-Source: AAOMgpc8vAPoSQkZNgTcSNhCec5yAFLuE8Tx+mmUGVO0VRi0WxoG25Q6uI8l2P3otZNNeLrgRbAErA== X-Received: by 2002:adf:8806:: with SMTP id d6-v6mr202835wrd.41.1531345560372; Wed, 11 Jul 2018 14:46: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 h5-v6sm10550936wrr.19.2018.07.11.14.45.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:45:59 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:08 +0200 Message-Id: <469ae14d6183850a5105a36726121af2f2743e59.1531345404.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 v11 18/25] 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 Wed Jul 11 21:45: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: 42912 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 440701B60A; Wed, 11 Jul 2018 23:46:27 +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 49DE11B5C1 for ; Wed, 11 Jul 2018 23:46:02 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id h9-v6so19609835wro.3 for ; Wed, 11 Jul 2018 14:46: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=IHVbPwTSTQaAHXkciYMdEqxygXilHaYNt1PzQ3kYkLo=; b=wTdPwUZ76fAydDz6ZhWuZeGAsnEtTlak4+UTgMq5IcyPukdWGRufzh8DudjiPL0/zd 7RazJ97XUYmbHIPeq/sbSp+bK74p1hMbGdRe8WJ9tjv0r7uT+CwaqJIxhy6CQDIhmLuQ los8FhqvQAtY+yyiCe8txAtZ4rllQIcWPbBnWsuS/2cxxJUlXb6/ioHhMerkrA5FK1XD e/u+Py32h3aaJkj6+9oFIMqQXo82PyHkjz3RUvZZx37c0RPMSKnnSUpjzqP+EhE6FZKC a3W5bQcL6a2wPjUCkmHncqWwLnaiWDufQxrfseb8knESlLWxpecQS7aH+PXRNbeB7en1 c2cA== 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=ZnmaSqWGjjOYTIc0wJa7ZVenBraMVOgUjWE7PE91TNVJO6ayZyPWeueJXhpXM6/gDn MXJgWTKDVXwbNZB2MI4II3ydcflzoNONxHgXYr61AegusL5hLwazko8WEePYlkGRJMZk qJa3d7mGAvjtzGk1UzmEA+uS5LPJWu99EjMfQ74lyyRjDnNwf77mQSfgT2WOMW5EmLB6 D4fAJqhcImhVBoDsDIay0ukDtOuSYEMkVxAJEbpWzeiUF2txeG35Jp8ZcsTTUA2AdNST KJojvzV/c1I753TO12kX2z/Lnqpp6VjpyAaggrSBKLr1jTQ6WMJVCe3mNcSpjH4Tz+DN pxPw== X-Gm-Message-State: AOUpUlHbvfwNeuii5lvksdELj+91ntD+KgytI5hzmH+H8cTXNN9kvxuV p1DFqqn7xaDM/SMzf7tpshwXrFkP X-Google-Smtp-Source: AAOMgpclmNr4GOMA6Xv5IqvHCa4h1eiFNG7olSsJHT62ARGVdlEWnz477vXXI0HadQ0WtcpQd778pg== X-Received: by 2002:adf:8e10:: with SMTP id n16-v6mr230553wrb.100.1531345561614; Wed, 11 Jul 2018 14:46: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 h5-v6sm10550936wrr.19.2018.07.11.14.46.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:00 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:09 +0200 Message-Id: <21bab8412f529dd2e1dec14073cf10346d468dd1.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 19/25] 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 Wed Jul 11 21:45: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: 42913 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 1A7D41B613; Wed, 11 Jul 2018 23:46:32 +0200 (CEST) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 786C21B5D3 for ; Wed, 11 Jul 2018 23:46:04 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id b15-v6so19623145wrv.10 for ; Wed, 11 Jul 2018 14:46: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=sfROBCkcKSu7MugYwnSCnG2pjnchuWrpPxXKAiJhTgg=; b=c3ZerGzrSuilRLaL1l02dEkPzNLnWcis5CH+iztbRDsZwXukQwRFBUn10IiXM8/95x bBLtLfUmscPmHyI54Z3UzQoi4qOybPycaY6bbYUsnhmqTA5xTv7o1Czw4uUh+UUSwo1o 2lWFFHLDuqLQLFmhrEctjcPwURnOm6bhY9mO5EIc3wNSEainrAgndXIPkHWZXKqCeUn4 5FstpYHMG2GixAjHcHRRNJGs3D1GeJOmTVPe9yQBgFQvGhVKLypxhzJ2Zb9B3QY8Uj40 ubKOXPtd5WX9X3jnxSpuH32hIBv1U1ZEwfmRO5oC6Fnv7fHO/rSjdzb6MIWpQ6UZ7b+7 EhOQ== 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=sfROBCkcKSu7MugYwnSCnG2pjnchuWrpPxXKAiJhTgg=; b=FbjUMSdzZAjd9Zaxs0ntlayNppmLNtAWAHr5XeGjR3OvX45MrinwCmNOozFLsu4A8f NGbO8361yGaAs26L30LILzxUYVy2gseg1+wwsERd4Co4yQmdEKPccy17Z9Q0K8auGeod Sj/jWaWzW7aT5vcItXX8mu1FVbljVzOUzkbzTofl7gcCpGRYSIflAoWmNNPYfrr4ZeiQ zPOT4K7gcoT4wMsNkp7ITF7uRFsLzzN05/b2jsrPRJbaSFwErj0CeIrKZ+JGORK5zBBp wgrIVXdUtllJv877fkvMlmmr036p7pkSdbfyNEnPY7za/kAVn84Yd9W87fbfyQQI7k9x cSzA== X-Gm-Message-State: AOUpUlHnct1XJ+uDWwHM/y54ADMGVHOTLq2QKmIjPSSAio7pBySnVvJh SX6m1FsGtd3JAp7Wn2HYvbcTfg5L X-Google-Smtp-Source: AAOMgpdbEIjceH8M2QsbcxuoJzk0YxS9uHsMqMlRUg87da8D1AD4ITK3rjXihZ+lm4Z6U1fQVE2Pfg== X-Received: by 2002:a5d:5088:: with SMTP id a8-v6mr221976wrt.37.1531345562804; Wed, 11 Jul 2018 14:46:02 -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 h5-v6sm10550936wrr.19.2018.07.11.14.46.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:01 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:10 +0200 Message-Id: <9f7a7087b34d5db728a9929f068dbd11ea496384.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 20/25] 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 74a8cd99e..238ecfc56 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" + ); } @@ -7093,6 +7096,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; @@ -17272,6 +17325,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 Wed Jul 11 21:45:11 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: 42914 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 DAD5F1B616; Wed, 11 Jul 2018 23:46:35 +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 9F36A1B5D4 for ; Wed, 11 Jul 2018 23:46:04 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id h10-v6so19589450wre.6 for ; Wed, 11 Jul 2018 14:46: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 :mime-version:content-transfer-encoding; bh=RXOCxUKtwRPFv4AOr2JFDmMWBZvjI+o9G+VEOr3SEB4=; b=bj8nZky3a9Dy6Ld/49/8Jajx/USSiP1/c6Husi5k0oefQfzNqhHnBqgOqetrKj6mXH nPT8OQP+nfQthymNeT9h2t+bW2stf8vBkkXi5F5IN05MHfpGelwfiXtr4egdZpdV5lFf GG7NaL0c92dvX5NRzwy4nrtQF3SOz6ydodUCQOSKGF2Q+74WgdbqlYnvNAlKCDBiOvYf psz+1JTJpeP/P+ItSDwvfRsYATJtzXZN8XbIdsTq4GhNyI2IUB617Fp6GQSNjJyWQu6b 9WsdG4RUU3oDlccs0teEk0MAFCWLgj5jRHTniPpt71LQQe7ry9eb7myY4c1oqOSzOg7c KRIg== 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=RXOCxUKtwRPFv4AOr2JFDmMWBZvjI+o9G+VEOr3SEB4=; b=MFt2aJl56pnad3DkC0WsAuhUclqICtcYk/s3/zIg7BUmRj/sFMZ/bo0HtjFn0u05+Y P009LsWQFtdvZUQLLZZCwqLCXg+89KayxrfGRfx1d/BZR9fDB9rhwz4qC1O0tiW51jOf H+PY/uSmtXIFdJwlClZC78E6PqU8w8SULDl5MIZO9QNk2+Ejp17x1Tvsssjayfeed1MU itG0hRlxF+W+DD8OTONVq+STArrej8tUn4Bi5BKgs7dQ9+z+thKtO/0QCJlZTALaSb2U Lkz4JLyhdaNl1BOJnP5fw7URBSLzHkeRwNuePglQt9hIYNBHSFr5IUzuDFkrTd+Z0Qoc j3PA== X-Gm-Message-State: AOUpUlFIJKWu2T3yuKFNWe7pWShnNh1UnpUSupblc2cVe3LGYzxwqWDN W7g5Jq6Wv2Ncim/tASHcn17wlWGs X-Google-Smtp-Source: AAOMgpcSa0OFsupgs8x98j4y5qgMHdg0iw4AEKCi20fYlLYPz4FujwM591gfOU/adkv880Z2d3la4g== X-Received: by 2002:adf:e78d:: with SMTP id n13-v6mr219762wrm.136.1531345563853; Wed, 11 Jul 2018 14:46: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 h5-v6sm10550936wrr.19.2018.07.11.14.46.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:03 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:11 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v11 21/25] 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..a09af3b1c 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 *_devargs) +{ + struct rte_devargs *devargs = _devargs; + 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, devargs->name, sizeof(devargs->name)); + return 0; +} + +int +rte_pci_devargs_prepare(struct rte_devargs *devargs) +{ + struct rte_kvargs *kvargs = NULL; + char *args; + int ret; + + if (devargs->bus_str == NULL) + return 0; + + args = strchr(devargs->bus_str, ','); + 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", + devargs->bus_str); + rte_errno = EINVAL; + return -1; + } + + ret = rte_kvargs_process(kvargs, "id", + &pci_addr_kv_parse, devargs); + + 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 Wed Jul 11 21:45:12 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: 42915 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 ED7351B5C4; Wed, 11 Jul 2018 23:46:39 +0200 (CEST) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 26B4C1B523 for ; Wed, 11 Jul 2018 23:46:06 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id r16-v6so19601557wrt.11 for ; Wed, 11 Jul 2018 14:46:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UCDR0M0DtcuI3oK7gjdz+Az6MHSirgQY9BaN5ez27SQ=; b=E4QmPdHUtHAlzrd53hAHA+JmEz/0/fsWGvEoujKSQBd1D62MW2WNXFIaBly6GBsQdR bGbIAKZCkNgBPa376G0+sOYUDIwpGN/tUwnH+uc6syJ1YE8vg8kbSbv6qQ/WX8fOqhdo 5j+2hIOYTxd4vRV5B9/pugMgGhf6q2B5uygRwbnXm/tDbKDhUWHgPU6CaTS8BkzFMhIW /Qu5EG18hvKLoP/nxlHiPuAP/cHw/upDKGrPn1AF94dGq8vBoihKXho5jBkaYsr0S+Ab yySEpIGYWC5+SOhe2D7iJ11UaUu7T7sm7x5FZ+Ax873wbJ+0Olequzwx8/WiihOkQuQ/ c2iw== 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=UCDR0M0DtcuI3oK7gjdz+Az6MHSirgQY9BaN5ez27SQ=; b=TNkdJTsGIeB5hNDHJdTwjJ1FhecmEeWt/aI/EtpaTC/PcESNs/JxZV/FwVGNYbLqro 9H6OB4+jWDFIbMad5qcxt1Nb8QvlG8GKVtXFa6G5X+LMl7grbqoVgngdXvPd971O6+/j ytfIp/2nvvjKkLwOyS+pMAgKViO55mked+zSemESOL32JAkZH6qaonJhUnb5j5FcwfWi 9XggJtjQcd2y0MKwZfPHp+TWvLFFd3OJRvgp7l2XodBPqCS/jZIDWTNSn6wMErCi2iRR NwCliEUdJtovsOziXIRFtFwMGwPkV7Pd9Qq0T5C+wu+cO4CluPHNAT3ETd9WvnUINiPQ GZYQ== X-Gm-Message-State: AOUpUlEXHothVinMhrzugD4MSbN+YwXzOLhszapCvrKJn4EWJkY3Y7dy wlFKUV8/23P55k7SyCkeIRcyYDo1 X-Google-Smtp-Source: AAOMgpdHEZpmuolHbU8Bd8HNIcn+pWkByxEYXSEmsA+HXbxt9RkVbWY+b0wvCa0mz8kGTnZi4ztgLA== X-Received: by 2002:a5d:4d8d:: with SMTP id b13-v6mr214956wru.80.1531345565220; Wed, 11 Jul 2018 14:46: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 h5-v6sm10550936wrr.19.2018.07.11.14.46.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:04 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:12 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v11 22/25] 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..aafaf3330 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 *_devargs) +{ + struct rte_devargs *devargs = _devargs; + 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(devargs->name, sizeof(devargs->name), "%s", value); + return 0; +} + +int +rte_vdev_devargs_prepare(struct rte_devargs *devargs) +{ + struct rte_kvargs *kvargs = NULL; + char *args; + int ret; + + if (devargs->bus_str == NULL) + return 0; + + args = strchr(devargs->bus_str, ','); + 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", + devargs->bus_str); + rte_errno = EINVAL; + return -1; + } + + ret = rte_kvargs_process(kvargs, "driver", + vdev_driver_kv_parse, devargs); + + 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 Wed Jul 11 21:45:13 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: 42916 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 43BDC1B645; Wed, 11 Jul 2018 23:46:42 +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 EDA961B577 for ; Wed, 11 Jul 2018 23:46:06 +0200 (CEST) Received: by mail-wr1-f68.google.com with SMTP id c4-v6so6929280wrs.12 for ; Wed, 11 Jul 2018 14:46: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=kpfBSKje8c/FYe7ayV3bSEGwOsUxRBndJ+eoNQTWAXU=; b=s32XxxEkvnVuJWU4spxLjwouBrrTvxrEEkfSERrBH/zyaBkVPIw+Ypw7eb9es+YMsC eywQYSsoLDQqhGusoTt04VFOJEvUBkOX7EqR8EqZZ+PhWfgx71vHHnHPlFQDeamz0NqA YLDPRpTEakZ+nZi9sXQU8aQ6R9qyWNkBaKJ9efi5ZPkrGLo/Hat5hrmiHIdPYj4XeUOK a/O2Qjg8sb1sQk+QfVi6bfuH1rGGl4GLofriVdC8Sw84ADb4nwqbg8IUp12rQQJsBeE4 eSU8D1HsP1+XaN3Adj066/knBYw7qP0hwT5vcN6uIrI4K0Py5x7gg1qTyMSKRjocL6cx uomA== 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=kpfBSKje8c/FYe7ayV3bSEGwOsUxRBndJ+eoNQTWAXU=; b=pr4LyXmeC/m4bqs/f7/Olek6Nn+kVhPh1qgN8sfQtrBGY3NOH4XxqRlgstWnXYqaZY +r7vE/YB2TvnXaOg3hwiykxZwzNItRF7OAV2MZmBkvhtz08M8jJGR7Gp5XZJix7cb2Rt hw03RMnRyPFKdCVgXsNyKQ+Km5M3s8/fQWyLioTjrQKu/JE/99LHb0vgz872f7aEaOX6 /eqnQMQ1LrYG6YxQR4I7diGdSQxzV68FLPTVb+MGLPzsQ8JiXpFfhLdJ9151R7Dhum0q /Q8E2etUTFOv0IaPQD7ygQG7XmyTY8zEZbGLZdkvZ6a7guI6NGAgByALFZgoCC7Nl3Gf LAPQ== X-Gm-Message-State: AOUpUlEXXKXT8lHaWT/WN9zqXl8W7qYHW4m1bjldHYQDy/nUE8k1VeuP H8XgzGNzAHuSQ05P3dy7lr/D/eJy X-Google-Smtp-Source: AAOMgpfsYdFHBiNk4iY9Rc8ilMeCR2g6+q1Il6rHQL2T7qpJoY/r81dv8nid8LOGL0kiRID048iQ/Q== X-Received: by 2002:adf:9bc9:: with SMTP id e9-v6mr235358wrc.240.1531345566291; Wed, 11 Jul 2018 14:46:06 -0700 (PDT) Received: from bidouze.dev.6wind.com. (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h5-v6sm10550936wrr.19.2018.07.11.14.46.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:05 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:13 +0200 Message-Id: <7ccaf59d98f0b34ace54dac17a68a3a62ad2e6b7.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 23/25] 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 a09af3b1c..f34bf3da9 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 *devargs) 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 Wed Jul 11 21:45: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: 42917 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 708C11B73C; Wed, 11 Jul 2018 23:46:43 +0200 (CEST) Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) by dpdk.org (Postfix) with ESMTP id 1A63C1B5E7 for ; Wed, 11 Jul 2018 23:46:08 +0200 (CEST) Received: by mail-wr1-f42.google.com with SMTP id m1-v6so6882746wrg.5 for ; Wed, 11 Jul 2018 14:46:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AH2FVVkX2u7mtYa50M6VFZU+7mr+o4oKgHe0E7heEC8=; b=RoTFGEfmsvYYfnwqbf3InFltObwdIjpbe2a8m7wDCSTl2FHmEg8tvh2Az0BtoAEV/y wSTK4YgrTyCrfOjB/xAYcXWAWipXXOTxsAr+Ro7d2L+mo4ilPrUiOpvwDXARizRR2kWU QsNxqeuuRUSYvLRMoO5QddhxMTHfhd0pJ0qRX/jaiLHxWduQusNHdMO0wI7NkQtAMnK1 qsTD7Kb5KobeLQshD9G2wYMFby6pIFZykWFTiSUW/1zHPjkC7wN6vGqL7H3YHwP2zKHH pein/3I3YwDzw2GzI1LNaP7z6UQizrLdSBNatOXL6jnTP7FVdDpMCLbRPfthw8CX+ypN 4v2A== 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=AH2FVVkX2u7mtYa50M6VFZU+7mr+o4oKgHe0E7heEC8=; b=Ib5DebAgVLpZK3nl98cOpQChtIgZY8GLlwEzfR/Q9pjOLMzEVbFogXhQYTj8sZb3cX h+MY+D9L8c/RizcvMkC5fs+g4SFpUlMz9HpI6Dox6MEmo7c+p/Ong8/xjFmAjHU574ea QMHD9H/FQwG5OglYZ1sNx7+HIdKBp+l2uxJeE7RpIoEprce7M4Jq0WpNTgVI4ZBjXftv jSimB8WorCQxdaqJBb3YhfzjRKuLF7UZT2EFC68WvlbDZ6TYuMGSY8gkI8AtAOsByC3Z PewRrN32uUKiMRovdqcm2sN3UnHOZmEgYNODhRZW9U2BTXjXotSmzeXXTa6AYKuK88QM m8/A== X-Gm-Message-State: AOUpUlGpEhJSUWvtC5KVF+yul15sySZEZGeXuizBX0OXJiqTzWAxfU5o CzGcpoMzNleF03WPx5c53wbrirgP X-Google-Smtp-Source: AAOMgpcFg5JiUpKI4yUQfjShA7BR2GabwPwJiy2zpCEayDBvYWNWbw0LkOPWg5tomtVAvjyF2FUS6g== X-Received: by 2002:adf:99ea:: with SMTP id y97-v6mr196193wrb.215.1531345567457; Wed, 11 Jul 2018 14:46: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 h5-v6sm10550936wrr.19.2018.07.11.14.46.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:06 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:14 +0200 Message-Id: <408a2d49131bfc2cf0af8d4d723af070a40005d0.1531345404.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 24/25] 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 | 62 +++++++++++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev.c | 7 ++++ 3 files changed, 74 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..18fdef605 100644 --- a/lib/librte_ethdev/rte_class_eth.c +++ b/lib/librte_ethdev/rte_class_eth.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -35,6 +36,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 +93,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 *devargs) +{ + struct rte_kvargs *kvargs = NULL; + + if (devargs == NULL || devargs->cls_str == NULL) + return 0; + + kvargs = rte_kvargs_parse_delim(devargs->cls_str, 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 98e089e58..cee4f5bee 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" int rte_eth_dev_logtype; @@ -3486,6 +3487,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 Wed Jul 11 21:45: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: 42918 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 2FE0D1B7F2; Wed, 11 Jul 2018 23:46:45 +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 483E91B54B for ; Wed, 11 Jul 2018 23:46:09 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id c4-v6so6929349wrs.12 for ; Wed, 11 Jul 2018 14:46: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=nCa7nVY2FNW5vFx1jeE7Leb1PIhUCyVTjw98wAhjztc=; b=Bs3i1v6YKkayiQaHAZsq23bLsnxowluLMEd6oD0IYgytGnH0Ufwk0O6VKz6DCX06uy llgh6d7n69lUAK1nkVASSPgrD2V5nbJbyM7PopznDsJk84ayGwGxKWefrHfXSbpfayc/ vqY1gtnaJLBTbGsN9NPe/QnRLp3H28v1v4zW8yf/rM60ns3Ia7l9LR2vTA9n3TXlGhXu SdcZUWtafIe5F4FGvLXnAZ/lVn6osr5wGszhKWYYPczSLXqTUpl/boBlLMNnzIhYOTiT NlQ8sT/8QcjVGXB7LbHHPrugnKvz2CctY/IvJFDkV9bdmlhuOejBsLko2q+M9gbNpeQn FAYg== 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=nCa7nVY2FNW5vFx1jeE7Leb1PIhUCyVTjw98wAhjztc=; b=WEALIAbrp5Fu8ztjD73DBMwxMzSgOnfyz9xhqfYAcvfqEYCjRNRPyKMa2+IN1tMia2 5B/Uqy6KE8JQuepwpyL4YDPHVJX2Z70ssIjcY9pVoMW5332BkYY3v37uwLDuS71Mcm8g kc7GrQl7ZNK93G923kW/yzL3ThdFHeVkxVdqZ5SvTm8xfrM7pr/NuD/ehcDbVtGTNRx+ KyFRr91e4lMyYnRp4Kxirc2UFZS0AkdIh9bTqy0bl/b1DU7ATUpt8X5kodahLjJJks43 9vsfFJDf1HAqKVWe6vvdB2PLpDuZ9yXH2o4sed/daxzXSoNsGZOSR6nrLk6qMjpBvLxb 6/dg== X-Gm-Message-State: AOUpUlEag7eEcifWtOYWITeEh4diVTLwZ4ZFujGrDC3h4SLP2zpzyWsO kgVXKry7ly1lyf3u+gbeoKcQO2/j X-Google-Smtp-Source: AAOMgpea4mhMoRVcpvcV/gqXYUNwEJfbKBxvGG2XxPoKEk4OlCrJTHiEhq2I07DJpaye8smoacHSwA== X-Received: by 2002:adf:f850:: with SMTP id d16-v6mr209657wrq.172.1531345568677; Wed, 11 Jul 2018 14:46: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 h5-v6sm10550936wrr.19.2018.07.11.14.46.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Jul 2018 14:46:07 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 11 Jul 2018 23:45:15 +0200 Message-Id: X-Mailer: git-send-email 2.18.0 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v11 25/25] 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 a22a2002e..22913b408 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -219,6 +219,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"