From: Intel Date: Wed, 18 Sep 2013 10:00:00 +0000 (+0200) Subject: eal: allow to blacklist address without domain prefix X-Git-Tag: spdx-start~11156 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=5a55b9ac91face71e9d665eecc716201d28745b0;p=dpdk.git eal: allow to blacklist address without domain prefix These 2 formats are now accepted: domain:bus:device.function bus:device.function Signed-off-by: Intel --- diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h index ca94953b35..468be2baec 100644 --- a/lib/librte_eal/common/include/rte_pci.h +++ b/lib/librte_eal/common/include/rte_pci.h @@ -74,7 +74,9 @@ extern "C" { #endif +#include #include +#include #include #include #include @@ -92,6 +94,9 @@ extern struct pci_device_list device_list; /**< Global list of PCI devices. */ /** Formatting string for PCI device identifier: Ex: 0000:00:01.0 */ #define PCI_PRI_FMT "%.4"PRIx16":%.2"PRIx8":%.2"PRIx8".%"PRIx8 +/** Short formatting string, without domain, for PCI device: Ex: 00:01.0 */ +#define PCI_SHORT_PRI_FMT "%.2"PRIx8":%.2"PRIx8".%"PRIx8 + /** Nb. of values in PCI device identifier format string. */ #define PCI_FMT_NVAL 4 @@ -190,6 +195,65 @@ struct rte_pci_driver { /** Device driver must be registered several times until failure */ #define RTE_PCI_DRV_MULTIPLE 0x0002 +/**< Internal use only - Macro used by pci addr parsing functions **/ +#define GET_PCIADDR_FIELD(in, fd, lim, dlm) \ +do { \ + unsigned long val; \ + char *end; \ + errno = 0; \ + val = strtoul((in), &end, 16); \ + if (errno != 0 || end[0] != (dlm) || val > (lim)) \ + return (-EINVAL); \ + (fd) = (typeof (fd))val; \ + (in) = end + 1; \ +} while(0) + +/** + * Utility function to produce a PCI Bus-Device-Function value + * given a string representation. Assumes that the BDF is provided without + * a domain prefix (i.e. domain returned is always 0) + * + * @param input + * The input string to be parsed. Should have the format XX:XX.X + * @param dev_addr + * The PCI Bus-Device-Function address to be returned. Domain will always be + * returned as 0 + * @return + * 0 on success, negative on error. + */ +static inline int +eal_parse_pci_BDF(const char *input, struct rte_pci_addr *dev_addr) +{ + dev_addr->domain = 0; + GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':'); + GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.'); + GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0); + return (0); +} + +/** + * Utility function to produce a PCI Bus-Device-Function value + * given a string representation. Assumes that the BDF is provided including + * a domain prefix. + * + * @param input + * The input string to be parsed. Should have the format XXXX:XX:XX.X + * @param dev_addr + * The PCI Bus-Device-Function address to be returned + * @return + * 0 on success, negative on error. + */ +static inline int +eal_parse_pci_DomBDF(const char *input, struct rte_pci_addr *dev_addr) +{ + GET_PCIADDR_FIELD(input, dev_addr->domain, UINT16_MAX, ':'); + GET_PCIADDR_FIELD(input, dev_addr->bus, UINT8_MAX, ':'); + GET_PCIADDR_FIELD(input, dev_addr->devid, UINT8_MAX, '.'); + GET_PCIADDR_FIELD(input, dev_addr->function, UINT8_MAX, 0); + return (0); +} +#undef GET_PCIADDR_FIELD + /** * Probe the PCI bus for registered drivers. * diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index bb8b8d093c..93a6d82991 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -553,28 +553,15 @@ eal_parse_proc_type(const char *arg) 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); } @@ -590,7 +577,7 @@ eal_parse_args(int argc, char **argv) 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},