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

Reply via email to