DPDK patches and discussions
 help / color / mirror / Atom feed
From: Chas Williams <3chas3@gmail.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
Date: Fri,  2 Oct 2015 11:00:07 -0400	[thread overview]
Message-ID: <1443798007-20122-1-git-send-email-3chas3@gmail.com> (raw)

If a system is using deterministic interface names, it may be easier in
some cases to use the interface name to blacklist an interface.

Signed-off-by: Chas Williams <3chas3@gmail.com>
---
 app/test/test_devargs.c                     |  2 ++
 lib/librte_eal/common/eal_common_devargs.c  |  8 ++++++++
 lib/librte_eal/common/eal_common_options.c  | 10 ++++++++++
 lib/librte_eal/common/eal_common_pci.c      | 17 +++++++++++------
 lib/librte_eal/common/eal_options.h         |  2 ++
 lib/librte_eal/common/include/rte_devargs.h |  5 +++++
 lib/librte_eal/common/include/rte_pci.h     |  1 +
 lib/librte_eal/linuxapp/eal/eal_pci.c       | 15 +++++++++++++++
 8 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/app/test/test_devargs.c b/app/test/test_devargs.c
index f7fc59c..c204c49 100644
--- a/app/test/test_devargs.c
+++ b/app/test/test_devargs.c
@@ -85,6 +85,8 @@ test_devargs(void)
 		goto fail;
 	if (rte_eal_devargs_type_count(RTE_DEVTYPE_VIRTUAL) != 2)
 		goto fail;
+	if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_NAME, "eth0") < 0)
+		goto fail;
 	free_devargs_list();
 
 	/* check virtual device with argument parsing */
diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c
index ec56165..cac651b 100644
--- a/lib/librte_eal/common/eal_common_devargs.c
+++ b/lib/librte_eal/common/eal_common_devargs.c
@@ -113,6 +113,14 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
 			goto fail;
 
 		break;
+	case RTE_DEVTYPE_BLACKLISTED_NAME:
+		/* save interface name */
+		ret = snprintf(devargs->name.name,
+			       sizeof(devargs->name.name), "%s", buf);
+		if (ret < 0 || ret >= (int)sizeof(devargs->name.name))
+			goto fail;
+
+		break;
 	}
 
 	free(buf);
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 1f459ac..c08126d 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -90,6 +90,7 @@ eal_long_options[] = {
 	{OPT_VFIO_INTR,         1, NULL, OPT_VFIO_INTR_NUM        },
 	{OPT_VMWARE_TSC_MAP,    0, NULL, OPT_VMWARE_TSC_MAP_NUM   },
 	{OPT_XEN_DOM0,          0, NULL, OPT_XEN_DOM0_NUM         },
+	{OPT_BLACKLISTED_NAME,  1, NULL, OPT_BLACKLISTED_NAME_NUM },
 	{0,                     0, NULL, 0                        }
 };
 
@@ -785,6 +786,13 @@ eal_parse_common_option(int opt, const char *optarg,
 		}
 		break;
 
+	case OPT_BLACKLISTED_NAME_NUM:
+		if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_NAME,
+				optarg) < 0) {
+			return -1;
+		}
+		break;
+
 	/* don't know what to do, leave this to caller */
 	default:
 		return 1;
@@ -898,6 +906,8 @@ eal_common_usage(void)
 	       "  --"OPT_VDEV"              Add a virtual device.\n"
 	       "                      The argument format is <driver><id>[,key=val,...]\n"
 	       "                      (ex: --vdev=eth_pcap0,iface=eth2).\n"
+	       "  --"OPT_BLACKLISTED_NAME" Add a device name to the black list.\n"
+	       "                      Prevent EAL from using this named interface.\n"
 	       "  --"OPT_VMWARE_TSC_MAP"    Use VMware TSC map instead of native RDTSC\n"
 	       "  --"OPT_PROC_TYPE"         Type of this process (primary|secondary|auto)\n"
 	       "  --"OPT_SYSLOG"            Set syslog facility\n"
diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c
index dcfe947..41a7690 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -90,11 +90,15 @@ static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev)
 	struct rte_devargs *devargs;
 
 	TAILQ_FOREACH(devargs, &devargs_list, next) {
-		if (devargs->type != RTE_DEVTYPE_BLACKLISTED_PCI &&
-			devargs->type != RTE_DEVTYPE_WHITELISTED_PCI)
-			continue;
-		if (!rte_eal_compare_pci_addr(&dev->addr, &devargs->pci.addr))
-			return devargs;
+		if (devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI ||
+			devargs->type == RTE_DEVTYPE_WHITELISTED_PCI) {
+			if (!rte_eal_compare_pci_addr(&dev->addr, &devargs->pci.addr))
+				return devargs;
+		}
+		if (devargs->type == RTE_DEVTYPE_BLACKLISTED_NAME) {
+			if (strcmp(dev->name, devargs->name.name) == 0)
+				return devargs;
+		}
 	}
 	return NULL;
 }
@@ -174,7 +178,8 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
 
 		/* no initialization when blacklisted, return without error */
 		if (dev->devargs != NULL &&
-			dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI) {
+			(dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI ||
+			 dev->devargs->type == RTE_DEVTYPE_BLACKLISTED_NAME)) {
 			RTE_LOG(DEBUG, EAL, "  Device is blacklisted, not initializing\n");
 			return 1;
 		}
diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h
index f6714d9..2aea553 100644
--- a/lib/librte_eal/common/eal_options.h
+++ b/lib/librte_eal/common/eal_options.h
@@ -45,6 +45,8 @@ enum {
 	/* first long only option value must be >= 256, so that we won't
 	 * conflict with short options */
 	OPT_LONG_MIN_NUM = 256,
+#define OPT_BLACKLISTED_NAME  "blacklisted-name"
+	OPT_BLACKLISTED_NAME_NUM,
 #define OPT_BASE_VIRTADDR     "base-virtaddr"
 	OPT_BASE_VIRTADDR_NUM,
 #define OPT_CREATE_UIO_DEV    "create-uio-dev"
diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h
index 7084ae2..8531405 100644
--- a/lib/librte_eal/common/include/rte_devargs.h
+++ b/lib/librte_eal/common/include/rte_devargs.h
@@ -59,6 +59,7 @@ enum rte_devtype {
 	RTE_DEVTYPE_WHITELISTED_PCI,
 	RTE_DEVTYPE_BLACKLISTED_PCI,
 	RTE_DEVTYPE_VIRTUAL,
+	RTE_DEVTYPE_BLACKLISTED_NAME,
 };
 
 /**
@@ -87,6 +88,10 @@ struct rte_devargs {
 			/** Driver name. */
 			char drv_name[32];
 		} virtual;
+		struct {
+			/** Interface name. */
+			char name[32];
+		} name;
 	};
 	/** Arguments string as given by user or "" for no argument. */
 	char *args;
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 83e3c28..852c149 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -161,6 +161,7 @@ struct rte_pci_device {
 	struct rte_pci_resource mem_resource[PCI_MAX_RESOURCE];   /**< PCI Memory Resource */
 	struct rte_intr_handle intr_handle;     /**< Interrupt handle */
 	struct rte_pci_driver *driver;          /**< Associated driver */
+	char name[32];				/**< Interface name (if any) */
 	uint16_t max_vfs;                       /**< sriov enable if not zero */
 	int numa_node;                          /**< NUMA node connection */
 	struct rte_devargs *devargs;            /**< Device user arguments */
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
index bc5b5be..c417d01 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -260,6 +260,8 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus,
 	unsigned long tmp;
 	struct rte_pci_device *dev;
 	char driver[PATH_MAX];
+	struct dirent *e;
+	DIR *dir;
 	int ret;
 
 	dev = malloc(sizeof(*dev));
@@ -352,6 +354,19 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus,
 		return -1;
 	}
 
+	/* get network interface name */
+	snprintf(filename, sizeof(filename), "%s/net", dirname);
+	dir = opendir(filename);
+	if (dir) {
+		while ((e = readdir(dir)) != NULL) {
+			if (e->d_name[0] == '.')
+				continue;
+
+			strcpy(dev->name, e->d_name);
+		}
+		closedir(dir);
+	}
+
 	if (!ret) {
 		if (!strcmp(driver, "vfio-pci"))
 			dev->kdrv = RTE_KDRV_VFIO;
-- 
2.1.0

             reply	other threads:[~2015-10-02 15:00 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-02 15:00 Chas Williams [this message]
2015-10-02 15:18 ` Bruce Richardson
2015-10-02 16:38   ` Charles (Chas) Williams
2015-10-02 16:44     ` Richardson, Bruce
2015-10-02 18:29       ` Charles (Chas) Williams
2015-10-05 15:59       ` Charles (Chas) Williams
2015-10-05 15:26 ` [dpdk-dev] [PATCH v2] " Chas Williams
2015-10-06  7:35   ` Stephen Hemminger
2015-10-06 14:41     ` Charles (Chas) Williams
2015-10-13 12:49   ` Olivier MATZ
2015-10-14 13:41     ` Charles (Chas) Williams
2015-11-04 22:40       ` Thomas Monjalon
2015-11-05 16:39         ` Charles (Chas) Williams
2015-11-05 19:23           ` Stephen Hemminger
2015-11-10 18:51             ` Charles (Chas) Williams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1443798007-20122-1-git-send-email-3chas3@gmail.com \
    --to=3chas3@gmail.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).