bus/pci: fix find device implementation
If start is set, and a device before it matches the data passed for comparison, then this first device is returned. This induces potentially infinite loops. Fixes: c7fe1eea8a74 ("bus: simplify finding starting point") Cc: stable@dpdk.org Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
This commit is contained in:
parent
996096e629
commit
64de7e4069
@ -455,17 +455,20 @@ static struct rte_device *
|
||||
pci_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
|
||||
const void *data)
|
||||
{
|
||||
struct rte_pci_device *dev;
|
||||
const struct rte_pci_device *pstart;
|
||||
struct rte_pci_device *pdev;
|
||||
|
||||
FOREACH_DEVICE_ON_PCIBUS(dev) {
|
||||
if (start && &dev->device == start) {
|
||||
start = NULL; /* starting point found */
|
||||
continue;
|
||||
}
|
||||
if (cmp(&dev->device, data) == 0)
|
||||
return &dev->device;
|
||||
if (start != NULL) {
|
||||
pstart = RTE_DEV_TO_PCI_CONST(start);
|
||||
pdev = TAILQ_NEXT(pstart, next);
|
||||
} else {
|
||||
pdev = TAILQ_FIRST(&rte_pci_bus.device_list);
|
||||
}
|
||||
while (pdev != NULL) {
|
||||
if (cmp(&pdev->device, data) == 0)
|
||||
return &pdev->device;
|
||||
pdev = TAILQ_NEXT(pdev, next);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -74,6 +74,9 @@ struct rte_pci_device {
|
||||
*/
|
||||
#define RTE_DEV_TO_PCI(ptr) container_of(ptr, struct rte_pci_device, device)
|
||||
|
||||
#define RTE_DEV_TO_PCI_CONST(ptr) \
|
||||
container_of(ptr, const struct rte_pci_device, device)
|
||||
|
||||
#define RTE_ETH_DEV_TO_PCI(eth_dev) RTE_DEV_TO_PCI((eth_dev)->device)
|
||||
|
||||
/** Any PCI device identifier (vendor, device, ...) */
|
||||
|
Loading…
x
Reference in New Issue
Block a user