[dpdk-dev,v6,15/17] eal: add hotplug operations for pci and vdev

Message ID 1468303282-2806-16-git-send-email-shreyansh.jain@nxp.com (mailing list archive)
State Superseded, archived
Headers

Commit Message

Shreyansh Jain July 12, 2016, 6:01 a.m. UTC
  Hotplug which deals with resources should come from the layer that already
handles them, i.e. EAL.

For both attach and detach operations, 'name' is used to select the bus
that will handle the request.

Signed-off-by: David Marchand <david.marchand@6wind.com>
Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
---
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  2 ++
 lib/librte_eal/common/eal_common_dev.c          | 47 +++++++++++++++++++++++++
 lib/librte_eal/common/include/rte_dev.h         | 25 +++++++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |  2 ++
 4 files changed, 76 insertions(+)
  

Comments

Jan Viktorin July 14, 2016, 4:50 p.m. UTC | #1
On Tue, 12 Jul 2016 11:31:20 +0530
Shreyansh Jain <shreyansh.jain@nxp.com> wrote:

> Hotplug which deals with resources should come from the layer that already
> handles them, i.e. EAL.
> 
> For both attach and detach operations, 'name' is used to select the bus
> that will handle the request.
> 
> Signed-off-by: David Marchand <david.marchand@6wind.com>
> Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
> ---
>  lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  2 ++
>  lib/librte_eal/common/eal_common_dev.c          | 47 +++++++++++++++++++++++++
>  lib/librte_eal/common/include/rte_dev.h         | 25 +++++++++++++
>  lib/librte_eal/linuxapp/eal/rte_eal_version.map |  2 ++
>  4 files changed, 76 insertions(+)
> 
> diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
> index 1852c4a..6f9324f 100644
> --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
> +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
> @@ -159,5 +159,7 @@ DPDK_16.07 {
>  	rte_keepalive_mark_sleep;
>  	rte_keepalive_register_relay_callback;
>  	rte_thread_setname;
> +	rte_eal_dev_attach;
> +	rte_eal_dev_detach;
>  
>  } DPDK_16.04;
> diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
> index a8a4146..14c6cf1 100644
> --- a/lib/librte_eal/common/eal_common_dev.c
> +++ b/lib/librte_eal/common/eal_common_dev.c
> @@ -150,3 +150,50 @@ rte_eal_vdev_uninit(const char *name)
>  	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
>  	return -EINVAL;
>  }
> +
> +int rte_eal_dev_attach(const char *name, const char *devargs)
> +{
> +	struct rte_pci_addr addr;
> +	int ret = -1;
> +
> +	if (name == NULL || devargs == NULL) {
> +		RTE_LOG(ERR, EAL, "Invalid device arguments provided\n");
> +		return ret;
> +	}
> +
> +	if (eal_parse_pci_DomBDF(name, &addr) == 0) {
> +		if (rte_eal_pci_probe_one(&addr) < 0)
> +			goto err;
> +
> +	} else {
> +		if (rte_eal_vdev_init(name, devargs))
> +			goto err;
> +	}
> +
> +	return 0;
> +
> +err:
> +	RTE_LOG(ERR, EAL, "Driver cannot attach the device\n");

I think this log can be more specific. We have the name of the device.
It might be confusing to the user when the attach fails and there is
no simple way how to determine which one.

> +	return ret;
> +}
> +
> +int rte_eal_dev_detach(const char *name)
> +{
> +	struct rte_pci_addr addr;
> +
> +	if (name == NULL)
> +		goto err;
> +
> +	if (eal_parse_pci_DomBDF(name, &addr) == 0) {
> +		if (rte_eal_pci_detach(&addr) < 0)
> +			goto err;
> +	} else {
> +		if (rte_eal_vdev_uninit(name))
> +			goto err;
> +	}
> +	return 0;
> +
> +err:
> +	RTE_LOG(ERR, EAL, "Driver cannot detach the device\n");

Same as for attach.

> +	return -1;
> +}
> diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
> index 994650b..2f0579c 100644
> --- a/lib/librte_eal/common/include/rte_dev.h
> +++ b/lib/librte_eal/common/include/rte_dev.h
> @@ -178,6 +178,31 @@ int rte_eal_vdev_init(const char *name, const char *args);
>   */
>  int rte_eal_vdev_uninit(const char *name);
>  
> +/**
> + * Attach a resource to a registered driver.

From my POV, the term "resource" is not good here. We have
rte_pci_resource but we refer to a device here. The function is called
rte_eal_DEV_attach. No idea why to call it a resource.

> + *
> + * @param name
> + *   The resource name, that refers to a pci resource or some private
> + *   way of designating a resource for vdev drivers. Based on this
> + *   resource name, eal will identify a driver capable of handling
> + *   this resource and pass this resource to the driver probing
> + *   function.
> + * @param devargs
> + *   Device arguments to be passed to the driver.
> + * @return
> + *   0 on success, negative on error.
> + */
> +int rte_eal_dev_attach(const char *name, const char *devargs);
> +
> +/**
> + * Detach a resource from its driver.

Same here for resource.

Jan

> + *
> + * @param name
> + *   Same description as for rte_eal_dev_attach().
> + *   Here, eal will call the driver detaching function.
> + */
> +int rte_eal_dev_detach(const char *name);
> +
>  #define DRIVER_EXPORT_NAME_ARRAY(n, idx) n##idx[]
>  
>  #define DRIVER_EXPORT_NAME(name, idx) \
> diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> index a617b9e..db866b8 100644
> --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> @@ -163,5 +163,7 @@ DPDK_16.07 {
>  	rte_keepalive_mark_sleep;
>  	rte_keepalive_register_relay_callback;
>  	rte_thread_setname;
> +	rte_eal_dev_attach;
> +	rte_eal_dev_detach;
>  
>  } DPDK_16.04;
  
Shreyansh Jain July 15, 2016, 9:52 a.m. UTC | #2
On Thursday 14 July 2016 10:20 PM, Jan Viktorin wrote:
> On Tue, 12 Jul 2016 11:31:20 +0530
> Shreyansh Jain <shreyansh.jain@nxp.com> wrote:
> 
>> Hotplug which deals with resources should come from the layer that already
>> handles them, i.e. EAL.
>>
>> For both attach and detach operations, 'name' is used to select the bus
>> that will handle the request.
>>
>> Signed-off-by: David Marchand <david.marchand@6wind.com>
>> Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
>> ---
>>  lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  2 ++
>>  lib/librte_eal/common/eal_common_dev.c          | 47 +++++++++++++++++++++++++
>>  lib/librte_eal/common/include/rte_dev.h         | 25 +++++++++++++
>>  lib/librte_eal/linuxapp/eal/rte_eal_version.map |  2 ++
>>  4 files changed, 76 insertions(+)
>>
>> diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
>> index 1852c4a..6f9324f 100644
>> --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
>> +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
>> @@ -159,5 +159,7 @@ DPDK_16.07 {
>>  	rte_keepalive_mark_sleep;
>>  	rte_keepalive_register_relay_callback;
>>  	rte_thread_setname;
>> +	rte_eal_dev_attach;
>> +	rte_eal_dev_detach;
>>  
>>  } DPDK_16.04;
>> diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
>> index a8a4146..14c6cf1 100644
>> --- a/lib/librte_eal/common/eal_common_dev.c
>> +++ b/lib/librte_eal/common/eal_common_dev.c
>> @@ -150,3 +150,50 @@ rte_eal_vdev_uninit(const char *name)
>>  	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
>>  	return -EINVAL;
>>  }
>> +
>> +int rte_eal_dev_attach(const char *name, const char *devargs)
>> +{
>> +	struct rte_pci_addr addr;
>> +	int ret = -1;
>> +
>> +	if (name == NULL || devargs == NULL) {
>> +		RTE_LOG(ERR, EAL, "Invalid device arguments provided\n");
>> +		return ret;
>> +	}
>> +
>> +	if (eal_parse_pci_DomBDF(name, &addr) == 0) {
>> +		if (rte_eal_pci_probe_one(&addr) < 0)
>> +			goto err;
>> +
>> +	} else {
>> +		if (rte_eal_vdev_init(name, devargs))
>> +			goto err;
>> +	}
>> +
>> +	return 0;
>> +
>> +err:
>> +	RTE_LOG(ERR, EAL, "Driver cannot attach the device\n");
> 
> I think this log can be more specific. We have the name of the device.
> It might be confusing to the user when the attach fails and there is
> no simple way how to determine which one.

Agree. I will update with 'name'.

> 
>> +	return ret;
>> +}
>> +
>> +int rte_eal_dev_detach(const char *name)
>> +{
>> +	struct rte_pci_addr addr;
>> +
>> +	if (name == NULL)
>> +		goto err;
>> +
>> +	if (eal_parse_pci_DomBDF(name, &addr) == 0) {
>> +		if (rte_eal_pci_detach(&addr) < 0)
>> +			goto err;
>> +	} else {
>> +		if (rte_eal_vdev_uninit(name))
>> +			goto err;
>> +	}
>> +	return 0;
>> +
>> +err:
>> +	RTE_LOG(ERR, EAL, "Driver cannot detach the device\n");
> 
> Same as for attach.

OK.

> 
>> +	return -1;
>> +}
>> diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
>> index 994650b..2f0579c 100644
>> --- a/lib/librte_eal/common/include/rte_dev.h
>> +++ b/lib/librte_eal/common/include/rte_dev.h
>> @@ -178,6 +178,31 @@ int rte_eal_vdev_init(const char *name, const char *args);
>>   */
>>  int rte_eal_vdev_uninit(const char *name);
>>  
>> +/**
>> + * Attach a resource to a registered driver.
> 
> From my POV, the term "resource" is not good here. We have
> rte_pci_resource but we refer to a device here. The function is called
> rte_eal_DEV_attach. No idea why to call it a resource.

Your point of 'resource' for 'rte_eal_*dev*_attach' makes sense.
Ideally I wouldn't have given much heed to this - for me 'resource' is just a device representation within EAL.
But, now that you have highlighted, name<=>comment is certainly mismatch.

I will change.

> 
>> + *
>> + * @param name
>> + *   The resource name, that refers to a pci resource or some private
>> + *   way of designating a resource for vdev drivers. Based on this
>> + *   resource name, eal will identify a driver capable of handling
>> + *   this resource and pass this resource to the driver probing
>> + *   function.
>> + * @param devargs
>> + *   Device arguments to be passed to the driver.
>> + * @return
>> + *   0 on success, negative on error.
>> + */
>> +int rte_eal_dev_attach(const char *name, const char *devargs);
>> +
>> +/**
>> + * Detach a resource from its driver.
> 
> Same here for resource.

I will change to "Detach a device from its driver".

> 
> Jan
> 
>> + *
>> + * @param name
>> + *   Same description as for rte_eal_dev_attach().
>> + *   Here, eal will call the driver detaching function.
>> + */
>> +int rte_eal_dev_detach(const char *name);
>> +
>>  #define DRIVER_EXPORT_NAME_ARRAY(n, idx) n##idx[]
>>  
>>  #define DRIVER_EXPORT_NAME(name, idx) \
>> diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
>> index a617b9e..db866b8 100644
>> --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
>> +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
>> @@ -163,5 +163,7 @@ DPDK_16.07 {
>>  	rte_keepalive_mark_sleep;
>>  	rte_keepalive_register_relay_callback;
>>  	rte_thread_setname;
>> +	rte_eal_dev_attach;
>> +	rte_eal_dev_detach;
>>  
>>  } DPDK_16.04;
>
  

Patch

diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index 1852c4a..6f9324f 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -159,5 +159,7 @@  DPDK_16.07 {
 	rte_keepalive_mark_sleep;
 	rte_keepalive_register_relay_callback;
 	rte_thread_setname;
+	rte_eal_dev_attach;
+	rte_eal_dev_detach;
 
 } DPDK_16.04;
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
index a8a4146..14c6cf1 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -150,3 +150,50 @@  rte_eal_vdev_uninit(const char *name)
 	RTE_LOG(ERR, EAL, "no driver found for %s\n", name);
 	return -EINVAL;
 }
+
+int rte_eal_dev_attach(const char *name, const char *devargs)
+{
+	struct rte_pci_addr addr;
+	int ret = -1;
+
+	if (name == NULL || devargs == NULL) {
+		RTE_LOG(ERR, EAL, "Invalid device arguments provided\n");
+		return ret;
+	}
+
+	if (eal_parse_pci_DomBDF(name, &addr) == 0) {
+		if (rte_eal_pci_probe_one(&addr) < 0)
+			goto err;
+
+	} else {
+		if (rte_eal_vdev_init(name, devargs))
+			goto err;
+	}
+
+	return 0;
+
+err:
+	RTE_LOG(ERR, EAL, "Driver cannot attach the device\n");
+	return ret;
+}
+
+int rte_eal_dev_detach(const char *name)
+{
+	struct rte_pci_addr addr;
+
+	if (name == NULL)
+		goto err;
+
+	if (eal_parse_pci_DomBDF(name, &addr) == 0) {
+		if (rte_eal_pci_detach(&addr) < 0)
+			goto err;
+	} else {
+		if (rte_eal_vdev_uninit(name))
+			goto err;
+	}
+	return 0;
+
+err:
+	RTE_LOG(ERR, EAL, "Driver cannot detach the device\n");
+	return -1;
+}
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index 994650b..2f0579c 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -178,6 +178,31 @@  int rte_eal_vdev_init(const char *name, const char *args);
  */
 int rte_eal_vdev_uninit(const char *name);
 
+/**
+ * Attach a resource to a registered driver.
+ *
+ * @param name
+ *   The resource name, that refers to a pci resource or some private
+ *   way of designating a resource for vdev drivers. Based on this
+ *   resource name, eal will identify a driver capable of handling
+ *   this resource and pass this resource to the driver probing
+ *   function.
+ * @param devargs
+ *   Device arguments to be passed to the driver.
+ * @return
+ *   0 on success, negative on error.
+ */
+int rte_eal_dev_attach(const char *name, const char *devargs);
+
+/**
+ * Detach a resource from its driver.
+ *
+ * @param name
+ *   Same description as for rte_eal_dev_attach().
+ *   Here, eal will call the driver detaching function.
+ */
+int rte_eal_dev_detach(const char *name);
+
 #define DRIVER_EXPORT_NAME_ARRAY(n, idx) n##idx[]
 
 #define DRIVER_EXPORT_NAME(name, idx) \
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index a617b9e..db866b8 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -163,5 +163,7 @@  DPDK_16.07 {
 	rte_keepalive_mark_sleep;
 	rte_keepalive_register_relay_callback;
 	rte_thread_setname;
+	rte_eal_dev_attach;
+	rte_eal_dev_detach;
 
 } DPDK_16.04;