Add rte_dev_is_probed() check in rte_dev_dma_map() and rte_dev_dma_unmap() before calling bus-specific implementations.
The device parameter passed to bus DMA map/unmap operations cannot be NULL as the caller already dereferenced the bus structure to invoke these operations. The driver reference in the bus-specific device cannot be NULL since calling the .dma_map is done after dereferencing this pointer. Remove redundant checks on probed device, and NULL checks on the device/driver parameter and derived device/driver pointers. Signed-off-by: David Marchand <[email protected]> --- drivers/bus/auxiliary/auxiliary_common.c | 8 -------- drivers/bus/pci/pci_common.c | 12 ++---------- drivers/bus/platform/platform.c | 16 ++-------------- drivers/bus/vdev/vdev.c | 24 ++---------------------- lib/eal/common/eal_common_dev.c | 8 ++++++++ 5 files changed, 14 insertions(+), 54 deletions(-) diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c index 8f3e90eaf0..9690687600 100644 --- a/drivers/bus/auxiliary/auxiliary_common.c +++ b/drivers/bus/auxiliary/auxiliary_common.c @@ -356,10 +356,6 @@ auxiliary_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { struct rte_auxiliary_device *aux_dev = RTE_DEV_TO_AUXILIARY(dev); - if (dev == NULL || aux_dev->driver == NULL) { - rte_errno = EINVAL; - return -1; - } if (aux_dev->driver->dma_map == NULL) { rte_errno = ENOTSUP; return -1; @@ -373,10 +369,6 @@ auxiliary_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, { struct rte_auxiliary_device *aux_dev = RTE_DEV_TO_AUXILIARY(dev); - if (dev == NULL || aux_dev->driver == NULL) { - rte_errno = EINVAL; - return -1; - } if (aux_dev->driver->dma_unmap == NULL) { rte_errno = ENOTSUP; return -1; diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 51fd8c80e4..d7f028e365 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -672,11 +672,7 @@ pci_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { struct rte_pci_device *pdev = RTE_DEV_TO_PCI(dev); - if (!pdev || !pdev->driver) { - rte_errno = EINVAL; - return -1; - } - if (pdev->driver->dma_map) + if (pdev->driver->dma_map != NULL) return pdev->driver->dma_map(pdev, addr, iova, len); /** * In case driver don't provides any specific mapping @@ -695,11 +691,7 @@ pci_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { struct rte_pci_device *pdev = RTE_DEV_TO_PCI(dev); - if (!pdev || !pdev->driver) { - rte_errno = EINVAL; - return -1; - } - if (pdev->driver->dma_unmap) + if (pdev->driver->dma_unmap != NULL) return pdev->driver->dma_unmap(pdev, addr, iova, len); /** * In case driver don't provides any specific mapping diff --git a/drivers/bus/platform/platform.c b/drivers/bus/platform/platform.c index e54098d04f..8a89a3cad8 100644 --- a/drivers/bus/platform/platform.c +++ b/drivers/bus/platform/platform.c @@ -530,13 +530,7 @@ platform_bus_parse(const char *name, void *addr) static int platform_bus_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { - struct rte_platform_device *pdev; - - pdev = RTE_DEV_TO_PLATFORM_DEV(dev); - if (pdev == NULL || pdev->driver == NULL) { - rte_errno = EINVAL; - return -1; - } + struct rte_platform_device *pdev = RTE_DEV_TO_PLATFORM_DEV(dev); if (pdev->driver->dma_map != NULL) return pdev->driver->dma_map(pdev, addr, iova, len); @@ -547,13 +541,7 @@ platform_bus_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t l static int platform_bus_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { - struct rte_platform_device *pdev; - - pdev = RTE_DEV_TO_PLATFORM_DEV(dev); - if (pdev == NULL || pdev->driver == NULL) { - rte_errno = EINVAL; - return -1; - } + struct rte_platform_device *pdev = RTE_DEV_TO_PLATFORM_DEV(dev); if (pdev->driver->dma_unmap != NULL) return pdev->driver->dma_unmap(pdev, addr, iova, len); diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index eb1de0186e..a200a67847 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -144,20 +144,10 @@ vdev_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len) struct rte_vdev_device *vdev = RTE_DEV_TO_VDEV(dev); const struct rte_vdev_driver *driver; - if (!vdev) { - rte_errno = EINVAL; - return -1; - } - - if (!vdev->device.driver) { - VDEV_LOG(DEBUG, "no driver attach to device %s", dev->name); - return 1; - } - driver = container_of(vdev->device.driver, const struct rte_vdev_driver, driver); - if (driver->dma_map) + if (driver->dma_map != NULL) return driver->dma_map(vdev, addr, iova, len); return 0; @@ -169,20 +159,10 @@ vdev_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) struct rte_vdev_device *vdev = RTE_DEV_TO_VDEV(dev); const struct rte_vdev_driver *driver; - if (!vdev) { - rte_errno = EINVAL; - return -1; - } - - if (!vdev->device.driver) { - VDEV_LOG(DEBUG, "no driver attach to device %s", dev->name); - return 1; - } - driver = container_of(vdev->device.driver, const struct rte_vdev_driver, driver); - if (driver->dma_unmap) + if (driver->dma_unmap != NULL) return driver->dma_unmap(vdev, addr, iova, len); return 0; diff --git a/lib/eal/common/eal_common_dev.c b/lib/eal/common/eal_common_dev.c index 7185de0cb9..fceca75223 100644 --- a/lib/eal/common/eal_common_dev.c +++ b/lib/eal/common/eal_common_dev.c @@ -829,6 +829,10 @@ int rte_dev_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { + if (!rte_dev_is_probed(dev)) { + rte_errno = EINVAL; + return -1; + } if (dev->bus->dma_map == NULL || len == 0) { rte_errno = ENOTSUP; return -1; @@ -847,6 +851,10 @@ int rte_dev_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) { + if (!rte_dev_is_probed(dev)) { + rte_errno = EINVAL; + return -1; + } if (dev->bus->dma_unmap == NULL || len == 0) { rte_errno = ENOTSUP; return -1; -- 2.53.0

