Bus find_device fixes
cover Bus find_device fixes
These patches are extracted from the device querying series [1] for earlier integration.
[1]: https://dpdk.org/ml/archives/dev/2018-March/092891.html
Gaetan Rivet (2):
bus/pci: fix find device implementation
bus/vdev: fix find device implementation
drivers/bus/pci/pci_common.c | 21 ++++++++++++--------- drivers/bus/pci/rte_bus_pci.h | 3 +++ drivers/bus/vdev/rte_bus_vdev.h | 3 +++ drivers/bus/vdev/vdev.c | 14 +++++++++----- 4 files changed, 27 insertions(+), 14 deletions(-)
Signature · 1 line
2.11.0
PATCH 1/2 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.
--- drivers/bus/pci/pci_common.c | 21 ++++++++++++--------- drivers/bus/pci/rte_bus_pci.h | 3 +++ 2 files changed, 15 insertions(+), 9 deletions(-)
drivers/bus/pci/pci_common.c +12 -9
@@ -459,17 +459,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 ; }
drivers/bus/pci/rte_bus_pci.h +3 -0
@@ -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, ...) */
Signature · 1 line
2.11.0
PATCH 2/2 bus/vdev: fix find device implementation
In reply to Gaetan RivetIf start is set and a device before it matches the data, this device is returned.
This induces potentially infinite loops.
--- drivers/bus/vdev/rte_bus_vdev.h | 3 +++ drivers/bus/vdev/vdev.c | 14 +++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-)
drivers/bus/vdev/rte_bus_vdev.h +3 -0
@@ -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) {
drivers/bus/vdev/vdev.c +9 -5
@@ -358,15 +358,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; + dev =TAILQ_NEXT (dev, next); }return NULL ; }
Signature · 1 line
2.11.0
v2 cover Bus find_device fixes
In reply to Gaetan RivetThese patches are extracted from the device querying series [1] for earlier integration.
[1]: https://dpdk.org/ml/archives/dev/2018-March/092891.html
v2:
* Rebase on master
Gaetan Rivet (2):
bus/pci: fix find device implementation
bus/vdev: fix find device implementation
drivers/bus/pci/pci_common.c | 21 ++++++++++++--------- drivers/bus/pci/rte_bus_pci.h | 3 +++ drivers/bus/vdev/rte_bus_vdev.h | 3 +++ drivers/bus/vdev/vdev.c | 14 +++++++++----- 4 files changed, 27 insertions(+), 14 deletions(-)
Signature · 1 line
2.11.0
PATCH v2 1/2 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.
--- drivers/bus/pci/pci_common.c | 21 ++++++++++++--------- drivers/bus/pci/rte_bus_pci.h | 3 +++ 2 files changed, 15 insertions(+), 9 deletions(-)
drivers/bus/pci/pci_common.c +12 -9
@@ -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 ; }
drivers/bus/pci/rte_bus_pci.h +3 -0
@@ -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, ...) */
Signature · 1 line
2.11.0
PATCH v2 2/2 bus/vdev: fix find device implementation
In reply to Gaetan RivetIf start is set and a device before it matches the data, this device is returned.
This induces potentially infinite loops.
--- drivers/bus/vdev/rte_bus_vdev.h | 3 +++ drivers/bus/vdev/vdev.c | 14 +++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-)
drivers/bus/vdev/rte_bus_vdev.h +3 -0
@@ -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) {
drivers/bus/vdev/vdev.c +9 -5
@@ -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);
Signature · 1 line
2.11.0
Thomas Monjalon
AppliedQuoted 3 lines
Gaetan Rivet (2):
bus/pci: fix find device implementation
bus/vdev: fix find device implementation
Applied, thanks