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

Shreyansh jain shreyansh.jain at nxp.com
Fri Jul 15 11:52:34 CEST 2016


On Thursday 14 July 2016 10:20 PM, Jan Viktorin wrote:
> On Tue, 12 Jul 2016 11:31:20 +0530
> Shreyansh Jain <shreyansh.jain at 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 at 6wind.com>
>> Signed-off-by: Shreyansh Jain <shreyansh.jain at 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;
> 



More information about the dev mailing list