[dpdk-stable] patch 'bus/vdev: fix find device implementation' has been queued to stable release 18.02.2

Gaëtan Rivet gaetan.rivet at 6wind.com
Wed May 2 10:26:02 CEST 2018


Hi Luca,

On Mon, Apr 30, 2018 at 03:53:21PM +0100, luca.boccassi at gmail.com wrote:
> Hi,
> 
> FYI, your patch has been queued to stable release 18.02.2
> 
> Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
> It will be pushed if I get no objections before 05/02/18. So please
> shout if anyone has objections.

This patch will be bogus while still compiling in a stable release,
without the commit: 35f462839b69 ("bus/vdev: add lock on device list").

It should be slightly reworked to function without. The previous version
of this patch [1] could be used instead.

[1]: https://dpdk.org/ml/archives/dev/2018-April/098822.html

Regards,

> 
> Thanks.
> 
> Luca Boccassi
> 
> ---
> From c2afaf6b85b6d55dee13c3742baf2052d7994a9d Mon Sep 17 00:00:00 2001
> From: Gaetan Rivet <gaetan.rivet at 6wind.com>
> Date: Fri, 27 Apr 2018 16:13:06 +0200
> Subject: [PATCH] bus/vdev: fix find device implementation
> 
> [ upstream commit 3701b792a8a3bce519adc979d5cc8d127231fd48 ]
> 
> If start is set and a device before it matches the data,
> this device is returned.
> 
> This induces potentially infinite loops.
> 
> Fixes: c7fe1eea8a74 ("bus: simplify finding starting point")
> 
> Signed-off-by: Gaetan Rivet <gaetan.rivet at 6wind.com>
> ---
>  drivers/bus/vdev/rte_bus_vdev.h |  3 +++
>  drivers/bus/vdev/vdev.c         | 16 ++++++++++------
>  2 files changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/bus/vdev/rte_bus_vdev.h b/drivers/bus/vdev/rte_bus_vdev.h
> index f9d8a2383..4da9967c6 100644
> --- a/drivers/bus/vdev/rte_bus_vdev.h
> +++ b/drivers/bus/vdev/rte_bus_vdev.h
> @@ -53,6 +53,9 @@ struct rte_vdev_device {
>  #define RTE_DEV_TO_VDEV(ptr) \
>  	container_of(ptr, struct rte_vdev_device, device)
>  
> +#define RTE_DEV_TO_VDEV_CONST(ptr) \
> +	container_of(ptr, const struct rte_vdev_device, device)
> +
>  static inline const char *
>  rte_vdev_device_name(const struct rte_vdev_device *dev)
>  {
> diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
> index 7eae319cb..914073d12 100644
> --- a/drivers/bus/vdev/vdev.c
> +++ b/drivers/bus/vdev/vdev.c
> @@ -386,15 +386,19 @@ static struct rte_device *
>  vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
>  		 const void *data)
>  {
> +	const struct rte_vdev_device *vstart;
>  	struct rte_vdev_device *dev;
>  
> -	TAILQ_FOREACH(dev, &vdev_device_list, next) {
> -		if (start && &dev->device == start) {
> -			start = NULL;
> -			continue;
> -		}
> +	if (start != NULL) {
> +		vstart = RTE_DEV_TO_VDEV_CONST(start);
> +		dev = TAILQ_NEXT(vstart, next);
> +	} else {
> +		dev = TAILQ_FIRST(&vdev_device_list);
> +	}
> +	while (dev != NULL) {
>  		if (cmp(&dev->device, data) == 0)
> -			return &dev->device;
> +			break;
> +		dev = TAILQ_NEXT(dev, next);
>  	}
>  	return NULL;
>  }
> -- 
> 2.14.2
> 

-- 
Gaëtan Rivet
6WIND


More information about the stable mailing list