DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
@ 2015-10-02 15:00 Chas Williams
  2015-10-02 15:18 ` Bruce Richardson
  2015-10-05 15:26 ` [dpdk-dev] [PATCH v2] " Chas Williams
  0 siblings, 2 replies; 15+ messages in thread
From: Chas Williams @ 2015-10-02 15:00 UTC (permalink / raw)
  To: dev

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

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
  2015-10-02 15:00 [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name Chas Williams
@ 2015-10-02 15:18 ` Bruce Richardson
  2015-10-02 16:38   ` Charles (Chas) Williams
  2015-10-05 15:26 ` [dpdk-dev] [PATCH v2] " Chas Williams
  1 sibling, 1 reply; 15+ messages in thread
From: Bruce Richardson @ 2015-10-02 15:18 UTC (permalink / raw)
  To: Chas Williams; +Cc: dev

On Fri, Oct 02, 2015 at 11:00:07AM -0400, Chas Williams wrote:
> If a system is using deterministic interface names, it may be easier in
> some cases to use the interface name to blacklist an interface.
>

Is it possible to do this using the existing arguments, i.e. have the -b flag
detect if it's a pci address or name automatically, rather than having to use
a separate command-line arg for it?

/Bruce

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
  2015-10-02 15:18 ` Bruce Richardson
@ 2015-10-02 16:38   ` Charles (Chas) Williams
  2015-10-02 16:44     ` Richardson, Bruce
  0 siblings, 1 reply; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-10-02 16:38 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Fri, 2015-10-02 at 16:18 +0100, Bruce Richardson wrote:
> On Fri, Oct 02, 2015 at 11:00:07AM -0400, Chas Williams wrote:
> > If a system is using deterministic interface names, it may be easier in
> > some cases to use the interface name to blacklist an interface.
> >
> 
> Is it possible to do this using the existing arguments, i.e. have the -b flag
> detect if it's a pci address or name automatically, rather than having to use
> a separate command-line arg for it?

You might be able to distinguish names by context.  I doubt interface
names ever look like PCI addresses.  But that's going to be a bigger
change since -b will need to be updated to 'blacklist' intead of
'pci-blacklist' to prevent confusion.  Or do you just want to overload
'-b' and keep both long options?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
  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
  0 siblings, 2 replies; 15+ messages in thread
From: Richardson, Bruce @ 2015-10-02 16:44 UTC (permalink / raw)
  To: Charles (Chas) Williams; +Cc: dev

> -----Original Message-----
> From: Charles (Chas) Williams [mailto:3chas3@gmail.com]
> 
> On Fri, 2015-10-02 at 16:18 +0100, Bruce Richardson wrote:
> > On Fri, Oct 02, 2015 at 11:00:07AM -0400, Chas Williams wrote:
> > > If a system is using deterministic interface names, it may be easier
> > > in some cases to use the interface name to blacklist an interface.
> > >
> >
> > Is it possible to do this using the existing arguments, i.e. have the
> > -b flag detect if it's a pci address or name automatically, rather
> > than having to use a separate command-line arg for it?
> 
> You might be able to distinguish names by context.  I doubt interface
> names ever look like PCI addresses.  But that's going to be a bigger
> change since -b will need to be updated to 'blacklist' intead of 'pci-
> blacklist' to prevent confusion.  Or do you just want to overload '-b' and
> keep both long options?
>
I'm not sure about that, to be honest. However, I'd rather not have
too many cmd line options to be maintained in the code. 

Does you proposed blacklisting patch work with non-pci devices as well
as with PCI ones as now?

/Bruce

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
  2015-10-02 16:44     ` Richardson, Bruce
@ 2015-10-02 18:29       ` Charles (Chas) Williams
  2015-10-05 15:59       ` Charles (Chas) Williams
  1 sibling, 0 replies; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-10-02 18:29 UTC (permalink / raw)
  To: Richardson, Bruce; +Cc: dev

On Fri, 2015-10-02 at 16:44 +0000, Richardson, Bruce wrote:
> > -----Original Message-----
> > From: Charles (Chas) Williams [mailto:3chas3@gmail.com]
> > 
> > On Fri, 2015-10-02 at 16:18 +0100, Bruce Richardson wrote:
> > > On Fri, Oct 02, 2015 at 11:00:07AM -0400, Chas Williams wrote:
> > > > If a system is using deterministic interface names, it may be easier
> > > > in some cases to use the interface name to blacklist an interface.
> > > >
> > >
> > > Is it possible to do this using the existing arguments, i.e. have the
> > > -b flag detect if it's a pci address or name automatically, rather
> > > than having to use a separate command-line arg for it?
> > 
> > You might be able to distinguish names by context.  I doubt interface
> > names ever look like PCI addresses.  But that's going to be a bigger
> > change since -b will need to be updated to 'blacklist' intead of 'pci-
> > blacklist' to prevent confusion.  Or do you just want to overload '-b' and
> > keep both long options?
> >
> I'm not sure about that, to be honest. However, I'd rather not have
> too many cmd line options to be maintained in the code. 
> 
> Does you proposed blacklisting patch work with non-pci devices as well
> as with PCI ones as now?

Unfortunately, the devargs API is rather PCI specific -- it takes a PCI
device.  Nothing prevents you from writing a device specific version of
the devargs API though for your device class since the devargs list isn't
static but checking for certain devargs wouldn't make sense in some cases.
Checking to see if a USB device matched a blacklisted PCI device would
be pointless.

Other devices (like Xen or hyperv) have a net/ directory/link in their /sys
entry that lets you determine an interface name.  I think it's the same
for USB ethernet devices -- I don't happen to have one to check.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-10-02 15:00 [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name Chas Williams
  2015-10-02 15:18 ` Bruce Richardson
@ 2015-10-05 15:26 ` Chas Williams
  2015-10-06  7:35   ` Stephen Hemminger
  2015-10-13 12:49   ` Olivier MATZ
  1 sibling, 2 replies; 15+ messages in thread
From: Chas Williams @ 2015-10-05 15:26 UTC (permalink / raw)
  To: dev

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  |  9 +++++++--
 lib/librte_eal/common/eal_common_options.c  |  2 +-
 lib/librte_eal/common/eal_common_pci.c      | 10 ++++++++--
 lib/librte_eal/common/include/rte_devargs.h |  2 ++
 lib/librte_eal/common/include/rte_pci.h     |  1 +
 lib/librte_eal/linuxapp/eal/eal_pci.c       | 15 +++++++++++++++
 7 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/app/test/test_devargs.c b/app/test/test_devargs.c
index f7fc59c..27855ff 100644
--- a/app/test/test_devargs.c
+++ b/app/test/test_devargs.c
@@ -73,6 +73,8 @@ test_devargs(void)
 		goto fail;
 	if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI, "0000:01:00.1") < 0)
 		goto fail;
+	if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI, "eth0") < 0)
+		goto fail;
 	if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) != 2)
 		goto fail;
 	if (rte_eal_devargs_type_count(RTE_DEVTYPE_BLACKLISTED_PCI) != 2)
diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c
index ec56165..1fb8bad 100644
--- a/lib/librte_eal/common/eal_common_devargs.c
+++ b/lib/librte_eal/common/eal_common_devargs.c
@@ -101,8 +101,13 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
 	case RTE_DEVTYPE_BLACKLISTED_PCI:
 		/* try to parse pci identifier */
 		if (eal_parse_pci_BDF(buf, &devargs->pci.addr) != 0 &&
-		    eal_parse_pci_DomBDF(buf, &devargs->pci.addr) != 0)
-			goto fail;
+		    eal_parse_pci_DomBDF(buf, &devargs->pci.addr) != 0) {
+			/* save as interface name instead */
+			ret = snprintf(devargs->pci.name,
+				       sizeof(devargs->pci.name), "%s", buf);
+			if (ret < 0 || ret >= (int)sizeof(devargs->pci.name))
+				goto fail;
+		}
 
 		break;
 	case RTE_DEVTYPE_VIRTUAL:
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 1f459ac..6920088 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -889,7 +889,7 @@ eal_common_usage(void)
 	       "  -r RANKS            Force number of memory ranks (don't detect)\n"
 	       "  -b, --"OPT_PCI_BLACKLIST" Add a PCI device in black list.\n"
 	       "                      Prevent EAL from using this PCI device. The argument\n"
-	       "                      format is <domain:bus:devid.func>.\n"
+	       "                      format is <domain:bus:devid.func> or <name>.\n"
 	       "  -w, --"OPT_PCI_WHITELIST" Add a PCI device in white list.\n"
 	       "                      Only use the specified PCI devices. The argument format\n"
 	       "                      is <[domain:]bus:devid.func>. This option can be present\n"
diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c
index dcfe947..288c8bd 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -93,8 +93,14 @@ static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev)
 		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->pci.name[0] == '\0') {
+			if (!rte_eal_compare_pci_addr(&dev->addr, &devargs->pci.addr))
+				return devargs;
+		} else {
+			if (strcmp(dev->name, devargs->pci.name) == 0)
+				return devargs;
+		}
 	}
 	return NULL;
 }
diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h
index 7084ae2..bc436ec 100644
--- a/lib/librte_eal/common/include/rte_devargs.h
+++ b/lib/librte_eal/common/include/rte_devargs.h
@@ -81,6 +81,8 @@ struct rte_devargs {
 		struct {
 			/** PCI location. */
 			struct rte_pci_addr addr;
+			/** Interface name. */
+			char name[32];
 		} pci;
 		/** Used if type is RTE_DEVTYPE_VIRTUAL. */
 		struct {
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..befb71f 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;
+
+			strncpy(dev->name, e->d_name, sizeof(dev->name));
+		}
+		closedir(dir);
+	}
+
 	if (!ret) {
 		if (!strcmp(driver, "vfio-pci"))
 			dev->kdrv = RTE_KDRV_VFIO;
-- 
2.1.0

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name
  2015-10-02 16:44     ` Richardson, Bruce
  2015-10-02 18:29       ` Charles (Chas) Williams
@ 2015-10-05 15:59       ` Charles (Chas) Williams
  1 sibling, 0 replies; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-10-05 15:59 UTC (permalink / raw)
  To: Richardson, Bruce; +Cc: dev

On Fri, 2015-10-02 at 16:44 +0000, Richardson, Bruce wrote:
> I'm not sure about that, to be honest. However, I'd rather not have
> too many cmd line options to be maintained in the code. 
> 
> Does you proposed blacklisting patch work with non-pci devices as well
> as with PCI ones as now?

I refactored this a bit to fit it into the existing pci blacklisting.
Better?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  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
  1 sibling, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2015-10-06  7:35 UTC (permalink / raw)
  To: Chas Williams; +Cc: dev

On Mon,  5 Oct 2015 11:26:08 -0400
Chas Williams <3chas3@gmail.com> wrote:

> 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];

Why not use IFNAMSIZ rather than magic constant here?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-10-06  7:35   ` Stephen Hemminger
@ 2015-10-06 14:41     ` Charles (Chas) Williams
  0 siblings, 0 replies; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-10-06 14:41 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Tue, 2015-10-06 at 08:35 +0100, Stephen Hemminger wrote:
> On Mon,  5 Oct 2015 11:26:08 -0400
> Chas Williams <3chas3@gmail.com> wrote:
> 
> > 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];
> 
> Why not use IFNAMSIZ rather than magic constant here?

No particular reason.  It just matches the virtual device name size.
I will change it.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-10-05 15:26 ` [dpdk-dev] [PATCH v2] " Chas Williams
  2015-10-06  7:35   ` Stephen Hemminger
@ 2015-10-13 12:49   ` Olivier MATZ
  2015-10-14 13:41     ` Charles (Chas) Williams
  1 sibling, 1 reply; 15+ messages in thread
From: Olivier MATZ @ 2015-10-13 12:49 UTC (permalink / raw)
  To: Chas Williams, dev

Hi Chas,

On 10/05/2015 05:26 PM, Chas Williams wrote:
> 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  |  9 +++++++--
>  lib/librte_eal/common/eal_common_options.c  |  2 +-
>  lib/librte_eal/common/eal_common_pci.c      | 10 ++++++++--
>  lib/librte_eal/common/include/rte_devargs.h |  2 ++
>  lib/librte_eal/common/include/rte_pci.h     |  1 +
>  lib/librte_eal/linuxapp/eal/eal_pci.c       | 15 +++++++++++++++
>  7 files changed, 36 insertions(+), 5 deletions(-)
> 
> diff --git a/app/test/test_devargs.c b/app/test/test_devargs.c
> index f7fc59c..27855ff 100644

> 
> [...]
> 

> @@ -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;
> +
> +			strncpy(dev->name, e->d_name, sizeof(dev->name));
> +		}
> +		closedir(dir);
> +	}
> +
>  	if (!ret) {
>  		if (!strcmp(driver, "vfio-pci"))
>  			dev->kdrv = RTE_KDRV_VFIO;
> 

For PCI devices that have several interfaces (I think it's the case for
some Mellanox boards), maybe we should not store the interface name?

Another small comment about the strncpy(): it's maybe safer to ensure
that dev->name is properly nul-terminated.

Regards,
Olivier

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-10-13 12:49   ` Olivier MATZ
@ 2015-10-14 13:41     ` Charles (Chas) Williams
  2015-11-04 22:40       ` Thomas Monjalon
  0 siblings, 1 reply; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-10-14 13:41 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev

On Tue, 2015-10-13 at 14:49 +0200, Olivier MATZ wrote:
> Hi Chas,
> 
> > @@ -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;
> > +
> > +			strncpy(dev->name, e->d_name, sizeof(dev->name));
> > +		}
> > +		closedir(dir);
> > +	}
> > +
> >  	if (!ret) {
> >  		if (!strcmp(driver, "vfio-pci"))
> >  			dev->kdrv = RTE_KDRV_VFIO;
> > 
> 
> For PCI devices that have several interfaces (I think it's the case for
> some Mellanox boards), maybe we should not store the interface name?

I am not sure what you mean here.  If a device has multiple ethernet
interfaces, then it should a have seperate PCI device address space for
each interface (I dont know of any DPDK drivers that don't make this
assumption as well).  If the device is multiprotocol, say Infiniband,
the device might have a net/ subdirectory, but it will be called something
like ib0 which you might want to blacklist for some reason.

> Another small comment about the strncpy(): it's maybe safer to ensure
> that dev->name is properly nul-terminated.

A good idea but it shouldn't happen in practice since dev.name will
be IFNAMSIZ.  I will fix it in the next version.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-10-14 13:41     ` Charles (Chas) Williams
@ 2015-11-04 22:40       ` Thomas Monjalon
  2015-11-05 16:39         ` Charles (Chas) Williams
  0 siblings, 1 reply; 15+ messages in thread
From: Thomas Monjalon @ 2015-11-04 22:40 UTC (permalink / raw)
  To: Charles (Chas) Williams; +Cc: dev

2015-10-14 09:41, Charles  Williams:
> On Tue, 2015-10-13 at 14:49 +0200, Olivier MATZ wrote:
> > For PCI devices that have several interfaces (I think it's the case for
> > some Mellanox boards), maybe we should not store the interface name?
> 
> I am not sure what you mean here.  If a device has multiple ethernet
> interfaces, then it should a have seperate PCI device address space for
> each interface (I dont know of any DPDK drivers that don't make this
> assumption as well).

mlx4 and cxgbe?

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-11-04 22:40       ` Thomas Monjalon
@ 2015-11-05 16:39         ` Charles (Chas) Williams
  2015-11-05 19:23           ` Stephen Hemminger
  0 siblings, 1 reply; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-11-05 16:39 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, 2015-11-04 at 23:40 +0100, Thomas Monjalon wrote:
> 2015-10-14 09:41, Charles  Williams:
> > On Tue, 2015-10-13 at 14:49 +0200, Olivier MATZ wrote:
> > > For PCI devices that have several interfaces (I think it's the case for
> > > some Mellanox boards), maybe we should not store the interface name?
> > 
> > I am not sure what you mean here.  If a device has multiple ethernet
> > interfaces, then it should a have seperate PCI device address space for
> > each interface (I dont know of any DPDK drivers that don't make this
> > assumption as well).
> 
> mlx4 and cxgbe?

OK, I see now.  I don't know of a way to tell if a device has multiple
ports just from the pci vendor/device id without maintaining some
sort of table.

Do these devices have multiple interfaces listed in their
/sys/devices/.../net diretory?  If so, matching one of the listed
interfaces can just blacklist the whole device similar to blacklisting
by the device id.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-11-05 16:39         ` Charles (Chas) Williams
@ 2015-11-05 19:23           ` Stephen Hemminger
  2015-11-10 18:51             ` Charles (Chas) Williams
  0 siblings, 1 reply; 15+ messages in thread
From: Stephen Hemminger @ 2015-11-05 19:23 UTC (permalink / raw)
  To: Charles (Chas) Williams; +Cc: dev

On Thu, 05 Nov 2015 11:39:04 -0500
"Charles (Chas) Williams" <3chas3@gmail.com> wrote:

> On Wed, 2015-11-04 at 23:40 +0100, Thomas Monjalon wrote:
> > 2015-10-14 09:41, Charles  Williams:  
> > > On Tue, 2015-10-13 at 14:49 +0200, Olivier MATZ wrote:  
> > > > For PCI devices that have several interfaces (I think it's the case for
> > > > some Mellanox boards), maybe we should not store the interface name?  
> > > 
> > > I am not sure what you mean here.  If a device has multiple ethernet
> > > interfaces, then it should a have seperate PCI device address space for
> > > each interface (I dont know of any DPDK drivers that don't make this
> > > assumption as well).  
> > 
> > mlx4 and cxgbe?  
> 
> OK, I see now.  I don't know of a way to tell if a device has multiple
> ports just from the pci vendor/device id without maintaining some
> sort of table.
> 
> Do these devices have multiple interfaces listed in their
> /sys/devices/.../net diretory?  If so, matching one of the listed
> interfaces can just blacklist the whole device similar to blacklisting
> by the device id.

Devices with multiple ports are supposed to report the port via /sys/class/net/xxx/portid

But you aren't going to be able to blacklist only one port of these devices.
The two drivers would be fighting over registers and IRQ management.
Plus kernel bind/unbind is by PCI id.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2] devargs: add blacklisting by linux interface name
  2015-11-05 19:23           ` Stephen Hemminger
@ 2015-11-10 18:51             ` Charles (Chas) Williams
  0 siblings, 0 replies; 15+ messages in thread
From: Charles (Chas) Williams @ 2015-11-10 18:51 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Thu, 2015-11-05 at 11:23 -0800, Stephen Hemminger wrote:
> On Thu, 05 Nov 2015 11:39:04 -0500
> "Charles (Chas) Williams" <3chas3@gmail.com> wrote:
> 
> > On Wed, 2015-11-04 at 23:40 +0100, Thomas Monjalon wrote:
> > > 2015-10-14 09:41, Charles  Williams:  
> > > > On Tue, 2015-10-13 at 14:49 +0200, Olivier MATZ wrote:  
> > > > > For PCI devices that have several interfaces (I think it's the case for
> > > > > some Mellanox boards), maybe we should not store the interface name?  
> > > > 
> > > > I am not sure what you mean here.  If a device has multiple ethernet
> > > > interfaces, then it should a have seperate PCI device address space for
> > > > each interface (I dont know of any DPDK drivers that don't make this
> > > > assumption as well).  
> > > 
> > > mlx4 and cxgbe?  
> > 
> > OK, I see now.  I don't know of a way to tell if a device has multiple
> > ports just from the pci vendor/device id without maintaining some
> > sort of table.
> > 
> > Do these devices have multiple interfaces listed in their
> > /sys/devices/.../net diretory?  If so, matching one of the listed
> > interfaces can just blacklist the whole device similar to blacklisting
> > by the device id.
> 
> Devices with multiple ports are supposed to report the port via /sys/class/net/xxx/portid

But I want to find the ports associated by the PCI devices.


> But you aren't going to be able to blacklist only one port of these devices.
> The two drivers would be fighting over registers and IRQ management.
> Plus kernel bind/unbind is by PCI id.

I understand that.  Blacklisting an interface on a multiple port device
would be essentially the same as blacklist by the PCI device id.  You
can't split the PCI device.  I just need to find the list of ports
associated with a single PCI device.

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-11-10 18:51 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-02 15:00 [dpdk-dev] [PATCH] devargs: add blacklisting by linux interface name Chas Williams
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

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).