bus/vdev: fix find device implementation
If start is set and a device before it matches the data,
this device is returned.
This induces potentially infinite loops.
Fixes: c7fe1eea8a
("bus: simplify finding starting point")
Cc: stable@dpdk.org
Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
This commit is contained in:
parent
64de7e4069
commit
3701b792a8
@ -25,6 +25,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)
|
||||
{
|
||||
|
@ -495,16 +495,20 @@ 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;
|
||||
|
||||
rte_spinlock_lock(&vdev_device_list_lock);
|
||||
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)
|
||||
break;
|
||||
dev = TAILQ_NEXT(dev, next);
|
||||
}
|
||||
rte_spinlock_unlock(&vdev_device_list_lock);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user