#include <rte_version.h>
#include <rte_atomic.h>
#include <malloc_heap.h>
+#include <rte_eth_ring.h>
#include "eal_private.h"
#include "eal_thread.h"
#define OPT_NO_HUGE "no-huge"
#define OPT_FILE_PREFIX "file-prefix"
#define OPT_SOCKET_MEM "socket-mem"
+#define OPT_USE_DEVICE "use-device"
#define OPT_SYSLOG "syslog"
#define RTE_EAL_BLACKLIST_SIZE 0x100
" --"OPT_HUGE_DIR" : directory where hugetlbfs is mounted\n"
" --"OPT_PROC_TYPE" : type of this process\n"
" --"OPT_FILE_PREFIX": prefix for hugepage filenames\n"
+ " --"OPT_USE_DEVICE": use the specified ethernet device(s) only."
+ "Use comma-separate <[domain:]bus:devid.func> values.\n"
+ " [NOTE: Cannot be used with -b option]\n"
" --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of "
"native RDTSC\n"
"\nEAL options for DEBUG use only:\n"
return RTE_PROC_INVALID;
}
-static int
-eal_parse_blacklist(const char *input, struct rte_pci_addr *dev2bl)
-{
- GET_BLACKLIST_FIELD(input, dev2bl->domain, UINT16_MAX, ':');
- GET_BLACKLIST_FIELD(input, dev2bl->bus, UINT8_MAX, ':');
- GET_BLACKLIST_FIELD(input, dev2bl->devid, UINT8_MAX, '.');
- GET_BLACKLIST_FIELD(input, dev2bl->function, UINT8_MAX, 0);
- return (0);
-}
-
static ssize_t
eal_parse_blacklist_opt(const char *optarg, size_t idx)
{
if (idx >= sizeof (eal_dev_blacklist) / sizeof (eal_dev_blacklist[0])) {
- RTE_LOG(ERR, EAL,
- "%s - too many devices to blacklist...\n",
- optarg);
+ RTE_LOG(ERR, EAL, "%s - too many devices to blacklist...\n", optarg);
return (-EINVAL);
- } else if (eal_parse_blacklist(optarg, eal_dev_blacklist + idx) != 0) {
- RTE_LOG(ERR, EAL,
- "%s - invalid device to blacklist...\n",
- optarg);
+ } else if (eal_parse_pci_DomBDF(optarg, eal_dev_blacklist + idx) < 0 &&
+ eal_parse_pci_BDF(optarg, eal_dev_blacklist + idx) < 0) {
+ RTE_LOG(ERR, EAL, "%s - invalid device to blacklist...\n", optarg);
return (-EINVAL);
}
char **argvopt;
int option_index;
int coremask_ok = 0;
- ssize_t blacklist_index = 0;;
+ ssize_t blacklist_index = 0;
char *prgname = argv[0];
static struct option lgopts[] = {
{OPT_NO_HUGE, 0, 0, 0},
{OPT_PROC_TYPE, 1, 0, 0},
{OPT_FILE_PREFIX, 1, 0, 0},
{OPT_SOCKET_MEM, 1, 0, 0},
+ {OPT_USE_DEVICE, 1, 0, 0},
{OPT_SYSLOG, 1, NULL, 0},
{0, 0, 0, 0}
};
return -1;
}
}
+ else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
+ eal_dev_whitelist_add_entry(optarg);
+ }
else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
if (eal_parse_syslog(optarg) < 0) {
RTE_LOG(ERR, EAL, "invalid parameters for --"
return -1;
}
- if (blacklist_index > 0)
+ /* if no blacklist, parse a whitelist */
+ if (blacklist_index > 0) {
+ if (eal_dev_whitelist_exists()) {
+ RTE_LOG(ERR, EAL, "Error: blacklist [-b] and whitelist "
+ "[--use-device] options cannot be used at the same time\n");
+ eal_usage(prgname);
+ return -1;
+ }
rte_eal_pci_set_blacklist(eal_dev_blacklist, blacklist_index);
+ } else {
+ if (eal_dev_whitelist_exists() && eal_dev_whitelist_parse() < 0) {
+ RTE_LOG(ERR,EAL, "Error parsing whitelist[--use-device] options\n");
+ return -1;
+ }
+ }
if (optind >= 0)
argv[optind-1] = prgname;
rte_eal_mcfg_complete();
+ if (rte_eal_non_pci_ethdev_init() < 0)
+ rte_panic("Cannot init non-PCI eth_devs\n");
+
RTE_LCORE_FOREACH_SLAVE(i) {
/*