From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by dpdk.org (Postfix) with ESMTP id 48B7FA0C6 for ; Wed, 2 Aug 2017 10:57:02 +0200 (CEST) Received: by mail-wm0-f48.google.com with SMTP id m85so35543163wma.0 for ; Wed, 02 Aug 2017 01:57: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=WksdZPlM7NBtLUn60qfMQvN1bbMxeFAPdKCpOMzpUQo=; b=URJMNglCN+JMXMYSmT7wk0UPKFMdUvr35bIqIuBLZQeuz0DhkXASBfTamBnah1jKaZ 8ro6urTWwdy9MsaCitUyMot6A9B/ivc2XIuBu9VETD0/O9743NjiRO+MWYK5DndkJ3i/ cHvbCDcROclk5QNdBkU8TDHfcguopUei7/UR18hGuoSr88Mb6blDlvIe5LXFvE82ywgu zxQw3T4vbCrWyMdrvQOqOHXZCvl8oVFPrCm6re8KyUJ7MmBgC1tMe9YeNCEq1Sx/8NoJ Me8zkvD8v+aX2R8yRfZyZrHPTvB7w+WoPDcBYDXJs4sxOiZ53LEdCdmOCU8a1Sadqsvl uIyw== 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=WksdZPlM7NBtLUn60qfMQvN1bbMxeFAPdKCpOMzpUQo=; b=d5vZem5Ps81+TJBxGygVxZ0+7A0TOq6456IgMunOsR+PD5V4wYDkmduEweSm0YbAze O22AdCTxqAtjCDebQyY46EYPmlJ2plG6dZTcrMPJ+uUccqBBjenOaAL5K5KnrC7DFu8K Ynj9RDsByJHjA+n309Ts4ubL3gy7w/CtVAtqGaowwhq0Uj+3xSGMwtyBOaca9RDP9KDD uENpY19Y1QZzIBPi/ktGlN9+cPx6ZFh1ojpqQLDKg0G2f4eL1k3NtGb4FeE68r3Qusfe uRYlYWPCSu7pNMFRk8nUNWM2l51HmE+5q+Z+Ke4c6cFnYTA0SmqwaioLoU1PRKMKVRh1 YldA== X-Gm-Message-State: AIVw113P0++s+mZZINs+0b85bBJ4Vy/RlqesoyHYBWiPUIJGuPaKDmcR RaBEH2xjxmzRfhyZrws= X-Received: by 10.28.113.9 with SMTP id m9mr2975761wmc.2.1501664221564; Wed, 02 Aug 2017 01:57: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 i5sm3471428wmd.47.2017.08.02.01.57.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Aug 2017 01:57:00 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet , Dirk-Holger Lenz Date: Wed, 2 Aug 2017 10:56:46 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: <12b23f229a5a3b953c1c6063e5a381800f4ccdb9.1501611129.git.gaetan.rivet@6wind.com> References: <12b23f229a5a3b953c1c6063e5a381800f4ccdb9.1501611129.git.gaetan.rivet@6wind.com> Subject: [dpdk-dev] [PATCH v2] eal: read and parse device option separately X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Aug 2017 08:57:02 -0000 When the EAL parses the common options given to the application, not all subsystems are available. Some device drivers are registered afterward upon dynamic plugin loading. Devices using those drivers are thus unable to be parsed by any drivers and are rejected. Store the device options first and keep them for later processing. Parse these right before initializing the buses, the drivers must have been stabilized at this point. Signed-off-by: Gaetan Rivet --- v2: - Fix the -w / -b incompatibility check. It was checking that no two incompatible rte_devargs were inserted. As rte_devargs are now generated right before buses scan, this check was always correct, even when it should have failed. lib/librte_eal/bsdapp/eal/eal.c | 5 ++ lib/librte_eal/common/eal_common_options.c | 79 ++++++++++++++++++++++++++++-- lib/librte_eal/common/eal_options.h | 1 + lib/librte_eal/linuxapp/eal/eal.c | 5 ++ 4 files changed, 85 insertions(+), 5 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c index 80fe21d..5fa5988 100644 --- a/lib/librte_eal/bsdapp/eal/eal.c +++ b/lib/librte_eal/bsdapp/eal/eal.c @@ -614,6 +614,11 @@ rte_eal_init(int argc, char **argv) rte_config.master_lcore, thread_id, cpuset, ret == 0 ? "" : "..."); + if (eal_option_device_parse()) { + rte_errno = ENODEV; + return -1; + } + if (rte_bus_scan()) { rte_eal_init_alert("Cannot scan the buses for devices\n"); rte_errno = ENODEV; diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index 56c368c..01fcc18 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -125,11 +126,79 @@ static const char *default_solib_dir = RTE_EAL_PMD_PATH; static const char dpdk_solib_path[] __attribute__((used)) = "DPDK_PLUGIN_PATH=" RTE_EAL_PMD_PATH; +TAILQ_HEAD(device_option_list, device_option); + +struct device_option { + TAILQ_ENTRY(device_option) next; + + enum rte_devtype type; + char optarg[]; +}; + +static struct device_option_list devopt_list = +TAILQ_HEAD_INITIALIZER(devopt_list); static int master_lcore_parsed; static int mem_parsed; static int core_parsed; +static int +eal_option_device_add(enum rte_devtype type, const char *optarg) +{ + struct device_option *deo; + size_t optlen; + int ret; + + optlen = strlen(optarg) + 1; + deo = calloc(1, sizeof(*deo) + optlen); + if (deo == NULL) { + RTE_LOG(ERR, EAL, "Unable to allocate device option\n"); + return -ENOMEM; + } + + deo->type = type; + ret = snprintf(deo->optarg, optlen, "%s", optarg); + if (ret < 0) { + RTE_LOG(ERR, EAL, "Unable to copy device option\n"); + free(deo); + return -EINVAL; + } + TAILQ_INSERT_TAIL(&devopt_list, deo, next); + return 0; +} + +static unsigned int +eal_option_device_type_count(enum rte_devtype type) +{ + struct device_option *deo; + unsigned int count = 0; + + TAILQ_FOREACH(deo, &devopt_list, next) + if (deo->type == type) + count++; + return count; +} + +int +eal_option_device_parse(void) +{ + struct device_option *deo; + void *tmp; + int ret = 0; + + TAILQ_FOREACH_SAFE(deo, &devopt_list, next, tmp) { + if (ret == 0) { + ret = rte_eal_devargs_add(deo->type, deo->optarg); + if (ret) + RTE_LOG(ERR, EAL, "Unable to parse device '%s'\n", + deo->optarg); + } + TAILQ_REMOVE(&devopt_list, deo, next); + free(deo); + } + return ret; +} + void eal_reset_internal_config(struct internal_config *internal_cfg) { @@ -944,14 +1013,14 @@ eal_parse_common_option(int opt, const char *optarg, switch (opt) { /* blacklist */ case 'b': - if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI, + if (eal_option_device_add(RTE_DEVTYPE_BLACKLISTED_PCI, optarg) < 0) { return -1; } break; /* whitelist */ case 'w': - if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI, + if (eal_option_device_add(RTE_DEVTYPE_WHITELISTED_PCI, optarg) < 0) { return -1; } @@ -1061,7 +1130,7 @@ eal_parse_common_option(int opt, const char *optarg, break; case OPT_VDEV_NUM: - if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL, + if (eal_option_device_add(RTE_DEVTYPE_VIRTUAL, optarg) < 0) { return -1; } @@ -1187,8 +1256,8 @@ eal_check_common_options(struct internal_config *internal_cfg) return -1; } - if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) != 0 && - rte_eal_devargs_type_count(RTE_DEVTYPE_BLACKLISTED_PCI) != 0) { + if (eal_option_device_type_count(RTE_DEVTYPE_WHITELISTED_PCI) != 0 && + eal_option_device_type_count(RTE_DEVTYPE_BLACKLISTED_PCI) != 0) { RTE_LOG(ERR, EAL, "Options blacklist (-b) and whitelist (-w) " "cannot be used at the same time\n"); return -1; diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index a881c62..439a261 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -91,6 +91,7 @@ extern const struct option eal_long_options[]; int eal_parse_common_option(int opt, const char *argv, struct internal_config *conf); +int eal_option_device_parse(void); int eal_adjust_config(struct internal_config *internal_cfg); int eal_check_common_options(struct internal_config *internal_cfg); void eal_common_usage(void); diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index b28bbab..48f12f4 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -889,6 +889,11 @@ rte_eal_init(int argc, char **argv) return -1; } + if (eal_option_device_parse()) { + rte_errno = ENODEV; + return -1; + } + if (rte_bus_scan()) { rte_eal_init_alert("Cannot scan the buses for devices\n"); rte_errno = ENODEV; -- 2.1.4