[PATCH v2 19/23] dma/idxd: remove specific bus type

Bruce Richardson bruce.richardson at intel.com
Wed May 20 19:20:25 CEST 2026


On Wed, May 06, 2026 at 05:51:51PM +0200, David Marchand wrote:
> There is nothing that requires a specific bus type.
> 
> Signed-off-by: David Marchand <david.marchand at redhat.com>

This patch exposes an underlying issue with the DSA driver. When applied,
attempting to probe the workqueues gives the output:

"EAL: Device wq0.0 is already probed"

For each device. This is because the device is not zeroed in the scan
function, leaving a non-NULL driver pointer. See inline below.

/Bruce

> ---
>  drivers/dma/idxd/idxd_bus.c | 38 ++++++++++++++-----------------------
>  1 file changed, 14 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/dma/idxd/idxd_bus.c b/drivers/dma/idxd/idxd_bus.c
> index 93bde69ff9..daf5f48ac1 100644
> --- a/drivers/dma/idxd/idxd_bus.c
> +++ b/drivers/dma/idxd/idxd_bus.c
> @@ -41,34 +41,24 @@ struct rte_dsa_device {
>  };
>  
>  /* forward prototypes */
> -struct dsa_bus;
>  static int dsa_scan(void);
>  static bool dsa_match(const struct rte_driver *drv, const struct rte_device *dev);
>  static int dsa_probe_device(struct rte_driver *drv, struct rte_device *dev);
>  static enum rte_iova_mode dsa_get_iommu_class(void);
>  static int dsa_addr_parse(const char *name, void *addr);
>  
> -/**
> - * Structure describing the DSA bus
> - */
> -struct dsa_bus {
> -	struct rte_bus bus;               /**< Inherit the generic class */
> -	struct rte_driver driver;         /**< Driver struct for devices to point to */
> +struct rte_bus dsa_bus = {
> +	.scan = dsa_scan,
> +	.probe = rte_bus_generic_probe,
> +	.match = dsa_match,
> +	.probe_device = dsa_probe_device,
> +	.find_device = rte_bus_generic_find_device,
> +	.get_iommu_class = dsa_get_iommu_class,
> +	.parse = dsa_addr_parse,
>  };
>  
> -struct dsa_bus dsa_bus = {
> -	.bus = {
> -		.scan = dsa_scan,
> -		.probe = rte_bus_generic_probe,
> -		.match = dsa_match,
> -		.probe_device = dsa_probe_device,
> -		.find_device = rte_bus_generic_find_device,
> -		.get_iommu_class = dsa_get_iommu_class,
> -		.parse = dsa_addr_parse,
> -	},
> -	.driver = {
> -		.name = "dmadev_idxd",
> -	},
> +struct rte_driver dsa_driver = {
> +	.name = "dmadev_idxd",
>  };
>  
>  static inline const char *
> @@ -267,7 +257,7 @@ static bool dsa_match(const struct rte_driver *drv, const struct rte_device *dev
>  {
>  	const struct rte_dsa_device *dsa_dev = RTE_BUS_DEVICE(dev, *dsa_dev);
>  
> -	if (drv == &dsa_bus.driver) {
> +	if (drv == &dsa_driver) {
>  		char type[64], name[64];
>  
>  		if (read_wq_string(dsa_dev, "type", type, sizeof(type)) >= 0 &&
> @@ -319,7 +309,7 @@ dsa_scan(void)
>  			continue;
>  		}
>  		strlcpy(dev->wq_name, wq->d_name, sizeof(dev->wq_name));
> -		rte_bus_add_device(&dsa_bus.bus, &dev->device);
> +		rte_bus_add_device(&dsa_bus, &dev->device);

The issue with the driver is here. Before the strlcpy, and the previous
dsa_addr_parse() call, we just need to add:

		memset(dev, 0, sizeof(*dev));

Since malloc does not zero the memory. [Alternatively, we can change malloc
to a zeroing equivalent].

Do you want me to do a separate patch to fix this, or roll the fix change
into this patch?

>  		devcount++;
>  
>  		read_device_int(dev, "numa_node", &numa_node);
> @@ -357,8 +347,8 @@ dsa_addr_parse(const char *name, void *addr)
>  	return 0;
>  }
>  
> -RTE_REGISTER_BUS(dsa, dsa_bus.bus);
> +RTE_REGISTER_BUS(dsa, dsa_bus);
>  RTE_INIT(dsa_bus_init)
>  {
> -	rte_bus_add_driver(&dsa_bus.bus, &dsa_bus.driver);
> +	rte_bus_add_driver(&dsa_bus, &dsa_driver);
>  }
> -- 
> 2.53.0
> 


More information about the dev mailing list