All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chas Williams <3chas3@gmail.com>
To: dev@dpdk.org
Subject: [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 ` [PATCH] devargs: add blacklisting by linux interface name 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 ` [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.