From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f173.google.com (mail-wr0-f173.google.com [209.85.128.173]) by dpdk.org (Postfix) with ESMTP id 46DE3A102 for ; Tue, 1 Aug 2017 20:13:59 +0200 (CEST) Received: by mail-wr0-f173.google.com with SMTP id 12so10027330wrb.1 for ; Tue, 01 Aug 2017 11:13: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; bh=SXTCXGZEVLZ+JZ2tVkJtlUR7jFCiMLl1m9EJ4nQ715k=; b=v2iXUiQWjNqJiObwfPngjTbdt4Pc/V/HrvtWsjZSIOBc6NvzT4CFEjRXH6IuOOfASj q0cICTqQuJHV7vHucA39Ifu0APFqR+K4vBdM0J5I6qgc69m+/McIPXxe2vHelRK6zZ3j WMdYCdEVaELNLyYxDExkN7Vyr7YYyZuHwR/fCw15PIeW9xsIXfR2+A9zD75tyjw2JKCm Vjd/gTa6W2v/xwcbqzXvWr/vHrpaRbWlQZTke/nFOOBmAOpeNy2xFniS8V+ZUrOu/ADG 3fyy2AcTxoKlcL7zzTE8M8ixLCfG0BI/PSu4WafcXP3Ns1/29P2n8aEFVZZhfyBlSA1J wTeA== 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; bh=SXTCXGZEVLZ+JZ2tVkJtlUR7jFCiMLl1m9EJ4nQ715k=; b=ThY9x6iY0CW8y7zIWEcPRk9cA9ABxfe158K6+SujQ1Rw8WrOkd9FDtI2QrhoJsQ9ow BjGykNQXy+7PTHqJkvmzjOpkH4m79Z2NoNGEsBwGWMoFBG74m8xIQCbtTURSZMoacVA4 +IArF1BTSQ7ctoxlIeGlYuDUVVFCoHADDgAeOw50ntaEeOFU4XW7aVNE0S3gGQvuFY7O 3HWm6zGB7/c5LAkkkiRQYkAJC5M3H3Mf2xxRF8Ts6sKscIR94TKZfKJVAGM+HtCa7VUl 5Ws3XyPPNyZ7JeOyVVij+eR5nUqMkn9pD0VHQCxSDNH9ZrnY+NllMqeVoF/24ZB1HIFH zDDA== X-Gm-Message-State: AIVw112CxPJydv6G0dU+5/bPZYd7+bY+0gS1VEr9jOgxmm+KLIA2CgNP qLU7JmXUyscevsi6XKE= X-Received: by 10.223.166.18 with SMTP id k18mr16312067wrc.284.1501611238179; Tue, 01 Aug 2017 11:13:58 -0700 (PDT) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id z37sm11756782wrc.56.2017.08.01.11.13.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 01 Aug 2017 11:13:57 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet , Dirk-Holger Lenz Date: Tue, 1 Aug 2017 20:13:37 +0200 Message-Id: <12b23f229a5a3b953c1c6063e5a381800f4ccdb9.1501611129.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [PATCH] 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: Tue, 01 Aug 2017 18:13:59 -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 --- lib/librte_eal/bsdapp/eal/eal.c | 5 +++ lib/librte_eal/common/eal_common_options.c | 63 ++++++++++++++++++++++++++++-- lib/librte_eal/common/eal_options.h | 1 + lib/librte_eal/linuxapp/eal/eal.c | 5 +++ 4 files changed, 71 insertions(+), 3 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..ead089e 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,67 @@ 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; +} + +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 +1001,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 +1118,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; } 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