[v5,5/7] drivers/bus: move driver assignment to end of probing

Message ID 20181014204747.26621-6-thomas@monjalon.net (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series [v5,1/7] net/mlx5: remove useless driver name comparison |

Checks

Context Check Description
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Thomas Monjalon Oct. 14, 2018, 8:47 p.m. UTC
  The PCI mapping requires to know the PCI driver to use,
even before the probing is done. That's why the PCI driver is
referenced early inside the PCI device structure. See
commit 1d20a073fa5e ("bus/pci: reference driver structure before mapping")

However the rte_driver does not need to be referenced in rte_device
before the device probing is done.
By moving back this assignment at the end of the device probing,
it becomes possible to make clear the status of a rte_device.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
Tested-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/bus/ifpga/ifpga_bus.c           | 9 ++++-----
 drivers/bus/pci/pci_common.c            | 7 +++----
 drivers/bus/pci/rte_bus_pci.h           | 2 +-
 drivers/bus/vdev/vdev.c                 | 5 ++---
 drivers/bus/vmbus/vmbus_common.c        | 5 +++--
 drivers/net/i40e/i40e_vf_representor.c  | 3 ---
 drivers/net/mlx4/mlx4.c                 | 1 -
 drivers/net/mlx5/mlx5.c                 | 1 -
 drivers/net/szedata2/rte_eth_szedata2.c | 6 +++---
 lib/librte_eal/common/include/rte_dev.h | 2 +-
 10 files changed, 17 insertions(+), 24 deletions(-)
  

Comments

Thomas Monjalon Oct. 14, 2018, 8:53 p.m. UTC | #1
+Cc vmbus, ifpga, i40e, mlx and szedata2 maintainers

14/10/2018 22:47, Thomas Monjalon:
> The PCI mapping requires to know the PCI driver to use,
> even before the probing is done. That's why the PCI driver is
> referenced early inside the PCI device structure. See
> commit 1d20a073fa5e ("bus/pci: reference driver structure before mapping")
> 
> However the rte_driver does not need to be referenced in rte_device
> before the device probing is done.
> By moving back this assignment at the end of the device probing,
> it becomes possible to make clear the status of a rte_device.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> Tested-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
>  drivers/bus/ifpga/ifpga_bus.c           | 9 ++++-----
>  drivers/bus/pci/pci_common.c            | 7 +++----
>  drivers/bus/pci/rte_bus_pci.h           | 2 +-
>  drivers/bus/vdev/vdev.c                 | 5 ++---
>  drivers/bus/vmbus/vmbus_common.c        | 5 +++--
>  drivers/net/i40e/i40e_vf_representor.c  | 3 ---
>  drivers/net/mlx4/mlx4.c                 | 1 -
>  drivers/net/mlx5/mlx5.c                 | 1 -
>  drivers/net/szedata2/rte_eth_szedata2.c | 6 +++---
>  lib/librte_eal/common/include/rte_dev.h | 2 +-
>  10 files changed, 17 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c
> index 80663328a..fca2dbace 100644
> --- a/drivers/bus/ifpga/ifpga_bus.c
> +++ b/drivers/bus/ifpga/ifpga_bus.c
> @@ -280,14 +280,13 @@ ifpga_probe_one_driver(struct rte_afu_driver *drv,
>  
>  	/* reference driver structure */
>  	afu_dev->driver = drv;
> -	afu_dev->device.driver = &drv->driver;
>  
>  	/* call the driver probe() function */
>  	ret = drv->probe(afu_dev);
> -	if (ret) {
> +	if (ret)
>  		afu_dev->driver = NULL;
> -		afu_dev->device.driver = NULL;
> -	}
> +	else
> +		afu_dev->device.driver = &drv->driver;
>  
>  	return ret;
>  }
> @@ -302,7 +301,7 @@ ifpga_probe_all_drivers(struct rte_afu_device *afu_dev)
>  		return -1;
>  
>  	/* Check if a driver is already loaded */
> -	if (afu_dev->driver != NULL)
> +	if (afu_dev->device.driver != NULL)
>  		return 0;
>  
>  	TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) {
> diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
> index c7695d108..d63e68045 100644
> --- a/drivers/bus/pci/pci_common.c
> +++ b/drivers/bus/pci/pci_common.c
> @@ -160,14 +160,12 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr,
>  	 * driver flags for adjusting configuration.
>  	 */
>  	dev->driver = dr;
> -	dev->device.driver = &dr->driver;
>  
>  	if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
>  		/* map resources for devices that use igb_uio */
>  		ret = rte_pci_map_device(dev);
>  		if (ret != 0) {
>  			dev->driver = NULL;
> -			dev->device.driver = NULL;
>  			return ret;
>  		}
>  	}
> @@ -176,7 +174,6 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr,
>  	ret = dr->probe(dr, dev);
>  	if (ret) {
>  		dev->driver = NULL;
> -		dev->device.driver = NULL;
>  		if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) &&
>  			/* Don't unmap if device is unsupported and
>  			 * driver needs mapped resources.
> @@ -184,6 +181,8 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr,
>  			!(ret > 0 &&
>  				(dr->drv_flags & RTE_PCI_DRV_KEEP_MAPPED_RES)))
>  			rte_pci_unmap_device(dev);
> +	} else {
> +		dev->device.driver = &dr->driver;
>  	}
>  
>  	return ret;
> @@ -244,7 +243,7 @@ pci_probe_all_drivers(struct rte_pci_device *dev)
>  		return -1;
>  
>  	/* Check if a driver is already loaded */
> -	if (dev->driver != NULL)
> +	if (dev->device.driver != NULL)
>  		return 0;
>  
>  	FOREACH_DRIVER_ON_PCIBUS(dr) {
> diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
> index 0d1955ffe..984df2b37 100644
> --- a/drivers/bus/pci/rte_bus_pci.h
> +++ b/drivers/bus/pci/rte_bus_pci.h
> @@ -62,7 +62,7 @@ struct rte_pci_device {
>  	struct rte_mem_resource mem_resource[PCI_MAX_RESOURCE];
>  					    /**< PCI Memory Resource */
>  	struct rte_intr_handle intr_handle; /**< Interrupt handle */
> -	struct rte_pci_driver *driver;      /**< Associated driver */
> +	struct rte_pci_driver *driver;      /**< PCI driver used in probing */
>  	uint16_t max_vfs;                   /**< sriov enable if not zero */
>  	enum rte_kernel_driver kdrv;        /**< Kernel driver passthrough */
>  	char name[PCI_PRI_STR_SIZE+1];      /**< PCI location (ASCII) */
> diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
> index 0142fb2c8..3f27f3510 100644
> --- a/drivers/bus/vdev/vdev.c
> +++ b/drivers/bus/vdev/vdev.c
> @@ -150,10 +150,9 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev)
>  
>  	if (vdev_parse(name, &driver))
>  		return -1;
> -	dev->device.driver = &driver->driver;
>  	ret = driver->probe(dev);
> -	if (ret)
> -		dev->device.driver = NULL;
> +	if (ret == 0)
> +		dev->device.driver = &driver->driver;
>  	return ret;
>  }
>  
> diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c
> index e3ceb6906..de5548aa4 100644
> --- a/drivers/bus/vmbus/vmbus_common.c
> +++ b/drivers/bus/vmbus/vmbus_common.c
> @@ -111,7 +111,6 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
>  
>  	/* reference driver structure */
>  	dev->driver = dr;
> -	dev->device.driver = &dr->driver;
>  
>  	if (dev->device.numa_node < 0) {
>  		VMBUS_LOG(WARNING, "  Invalid NUMA socket, default to 0");
> @@ -124,6 +123,8 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
>  	if (ret) {
>  		dev->driver = NULL;
>  		rte_vmbus_unmap_device(dev);
> +	} else {
> +		dev->device.driver = &dr->driver;
>  	}
>  
>  	return ret;
> @@ -142,7 +143,7 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev)
>  	int rc;
>  
>  	/* Check if a driver is already loaded */
> -	if (dev->driver != NULL) {
> +	if (dev->device.driver != NULL) {
>  		VMBUS_LOG(DEBUG, "VMBUS driver already loaded");
>  		return 0;
>  	}
> diff --git a/drivers/net/i40e/i40e_vf_representor.c b/drivers/net/i40e/i40e_vf_representor.c
> index 0bfbb4f60..24751d13c 100644
> --- a/drivers/net/i40e/i40e_vf_representor.c
> +++ b/drivers/net/i40e/i40e_vf_representor.c
> @@ -487,9 +487,6 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)
>  	if (representor->vf_id >= pf->vf_num)
>  		return -ENODEV;
>  
> -	/** representor shares the same driver as it's PF device */
> -	ethdev->device->driver = representor->adapter->eth_dev->device->driver;
> -
>  	/* Set representor device ops */
>  	ethdev->dev_ops = &i40e_representor_dev_ops;
>  
> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
> index defc0d4b0..3de7bc53e 100644
> --- a/drivers/net/mlx4/mlx4.c
> +++ b/drivers/net/mlx4/mlx4.c
> @@ -734,7 +734,6 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
>  		eth_dev->data->mac_addrs = priv->mac;
>  		eth_dev->device = &pci_dev->device;
>  		rte_eth_copy_pci_info(eth_dev, pci_dev);
> -		eth_dev->device->driver = &mlx4_driver.driver;
>  		/* Initialize local interrupt handle for current port. */
>  		priv->intr_handle = (struct rte_intr_handle){
>  			.fd = -1,
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index 795a21977..8cbfee1ba 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -1090,7 +1090,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
>  	priv->dev_data = eth_dev->data;
>  	eth_dev->data->mac_addrs = priv->mac;
>  	eth_dev->device = dpdk_dev;
> -	eth_dev->device->driver = &mlx5_driver.driver;
>  	err = mlx5_uar_init_primary(eth_dev);
>  	if (err) {
>  		err = rte_errno;
> diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
> index 8f92e72f2..4e5e01cf1 100644
> --- a/drivers/net/szedata2/rte_eth_szedata2.c
> +++ b/drivers/net/szedata2/rte_eth_szedata2.c
> @@ -1474,7 +1474,7 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev, struct port_info *pi)
>  	PMD_INIT_FUNC_TRACE();
>  
>  	PMD_INIT_LOG(INFO, "Initializing eth_dev %s (driver %s)", data->name,
> -			dev->device->driver->name);
> +			RTE_STR(RTE_SZEDATA2_DRIVER_NAME));
>  
>  	/* Fill internal private structure. */
>  	internals->dev = dev;
> @@ -1525,7 +1525,7 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev *dev, struct port_info *pi)
>  	ether_addr_copy(&eth_addr, data->mac_addrs);
>  
>  	PMD_INIT_LOG(INFO, "%s device %s successfully initialized",
> -			dev->device->driver->name, data->name);
> +			RTE_STR(RTE_SZEDATA2_DRIVER_NAME), data->name);
>  
>  	return 0;
>  }
> @@ -1547,7 +1547,7 @@ rte_szedata2_eth_dev_uninit(struct rte_eth_dev *dev)
>  	rte_free(dev->data->mac_addrs);
>  
>  	PMD_DRV_LOG(INFO, "%s device %s successfully uninitialized",
> -			dev->device->driver->name, dev->data->name);
> +			RTE_STR(RTE_SZEDATA2_DRIVER_NAME), dev->data->name);
>  
>  	return 0;
>  }
> diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
> index 036180ff3..5084c645b 100644
> --- a/lib/librte_eal/common/include/rte_dev.h
> +++ b/lib/librte_eal/common/include/rte_dev.h
> @@ -156,7 +156,7 @@ struct rte_driver {
>  struct rte_device {
>  	TAILQ_ENTRY(rte_device) next; /**< Next device */
>  	const char *name;             /**< Device name */
> -	const struct rte_driver *driver;/**< Associated driver */
> +	const struct rte_driver *driver; /**< Driver assigned after probing */
>  	const struct rte_bus *bus;    /**< Bus handle assigned on scan */
>  	int numa_node;                /**< NUMA node connection */
>  	struct rte_devargs *devargs;  /**< Device user arguments */
>
  
Xu, Rosen Oct. 15, 2018, 6:11 a.m. UTC | #2
> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Monday, October 15, 2018 4:54
> To: dev@dpdk.org
> Cc: gaetan.rivet@6wind.com; ophirmu@mellanox.com; Zhang, Qi Z
> <qi.z.zhang@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>;
> remes@netcope.com; Xing, Beilei <beilei.xing@intel.com>;
> shahafs@mellanox.com; yskoh@mellanox.com; Xu, Rosen
> <rosen.xu@intel.com>; stephen@networkplumber.org
> Subject: Re: [dpdk-dev] [PATCH v5 5/7] drivers/bus: move driver assignment
> to end of probing
> 
> +Cc vmbus, ifpga, i40e, mlx and szedata2 maintainers
> 
> 14/10/2018 22:47, Thomas Monjalon:
> > The PCI mapping requires to know the PCI driver to use, even before
> > the probing is done. That's why the PCI driver is referenced early
> > inside the PCI device structure. See commit 1d20a073fa5e ("bus/pci:
> > reference driver structure before mapping")
> >
> > However the rte_driver does not need to be referenced in rte_device
> > before the device probing is done.
> > By moving back this assignment at the end of the device probing, it
> > becomes possible to make clear the status of a rte_device.
> >
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > Tested-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > ---
> >  drivers/bus/ifpga/ifpga_bus.c           | 9 ++++-----
> >  drivers/bus/pci/pci_common.c            | 7 +++----
> >  drivers/bus/pci/rte_bus_pci.h           | 2 +-
> >  drivers/bus/vdev/vdev.c                 | 5 ++---
> >  drivers/bus/vmbus/vmbus_common.c        | 5 +++--
> >  drivers/net/i40e/i40e_vf_representor.c  | 3 ---
> >  drivers/net/mlx4/mlx4.c                 | 1 -
> >  drivers/net/mlx5/mlx5.c                 | 1 -
> >  drivers/net/szedata2/rte_eth_szedata2.c | 6 +++---
> > lib/librte_eal/common/include/rte_dev.h | 2 +-
> >  10 files changed, 17 insertions(+), 24 deletions(-)
> >
> > diff --git a/drivers/bus/ifpga/ifpga_bus.c
> > b/drivers/bus/ifpga/ifpga_bus.c index 80663328a..fca2dbace 100644
> > --- a/drivers/bus/ifpga/ifpga_bus.c
> > +++ b/drivers/bus/ifpga/ifpga_bus.c
> > @@ -280,14 +280,13 @@ ifpga_probe_one_driver(struct rte_afu_driver
> > *drv,
> >
> >  	/* reference driver structure */
> >  	afu_dev->driver = drv;
> > -	afu_dev->device.driver = &drv->driver;
> >
> >  	/* call the driver probe() function */
> >  	ret = drv->probe(afu_dev);
> > -	if (ret) {
> > +	if (ret)
> >  		afu_dev->driver = NULL;
> > -		afu_dev->device.driver = NULL;
> > -	}
> > +	else
> > +		afu_dev->device.driver = &drv->driver;
> >
> >  	return ret;
> >  }
> > @@ -302,7 +301,7 @@ ifpga_probe_all_drivers(struct rte_afu_device
> *afu_dev)
> >  		return -1;
> >
> >  	/* Check if a driver is already loaded */
> > -	if (afu_dev->driver != NULL)
> > +	if (afu_dev->device.driver != NULL)
> >  		return 0;
> >
> >  	TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) { diff --git

 Reviewed-by: Rosen Xu <rosen.xu@intel.com>

> > a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index
> > c7695d108..d63e68045 100644
> > --- a/drivers/bus/pci/pci_common.c
> > +++ b/drivers/bus/pci/pci_common.c
> > @@ -160,14 +160,12 @@ rte_pci_probe_one_driver(struct rte_pci_driver
> *dr,
> >  	 * driver flags for adjusting configuration.
> >  	 */
> >  	dev->driver = dr;
> > -	dev->device.driver = &dr->driver;
> >
> >  	if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
> >  		/* map resources for devices that use igb_uio */
> >  		ret = rte_pci_map_device(dev);
> >  		if (ret != 0) {
> >  			dev->driver = NULL;
> > -			dev->device.driver = NULL;
> >  			return ret;
> >  		}
> >  	}
> > @@ -176,7 +174,6 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr,
> >  	ret = dr->probe(dr, dev);
> >  	if (ret) {
> >  		dev->driver = NULL;
> > -		dev->device.driver = NULL;
> >  		if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) &&
> >  			/* Don't unmap if device is unsupported and
> >  			 * driver needs mapped resources.
> > @@ -184,6 +181,8 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr,
> >  			!(ret > 0 &&
> >  				(dr->drv_flags &
> RTE_PCI_DRV_KEEP_MAPPED_RES)))
> >  			rte_pci_unmap_device(dev);
> > +	} else {
> > +		dev->device.driver = &dr->driver;
> >  	}
> >
> >  	return ret;
> > @@ -244,7 +243,7 @@ pci_probe_all_drivers(struct rte_pci_device *dev)
> >  		return -1;
> >
> >  	/* Check if a driver is already loaded */
> > -	if (dev->driver != NULL)
> > +	if (dev->device.driver != NULL)
> >  		return 0;
> >
> >  	FOREACH_DRIVER_ON_PCIBUS(dr) {
> > diff --git a/drivers/bus/pci/rte_bus_pci.h
> > b/drivers/bus/pci/rte_bus_pci.h index 0d1955ffe..984df2b37 100644
> > --- a/drivers/bus/pci/rte_bus_pci.h
> > +++ b/drivers/bus/pci/rte_bus_pci.h
> > @@ -62,7 +62,7 @@ struct rte_pci_device {
> >  	struct rte_mem_resource mem_resource[PCI_MAX_RESOURCE];
> >  					    /**< PCI Memory Resource */
> >  	struct rte_intr_handle intr_handle; /**< Interrupt handle */
> > -	struct rte_pci_driver *driver;      /**< Associated driver */
> > +	struct rte_pci_driver *driver;      /**< PCI driver used in probing */
> >  	uint16_t max_vfs;                   /**< sriov enable if not zero */
> >  	enum rte_kernel_driver kdrv;        /**< Kernel driver passthrough */
> >  	char name[PCI_PRI_STR_SIZE+1];      /**< PCI location (ASCII) */
> > diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index
> > 0142fb2c8..3f27f3510 100644
> > --- a/drivers/bus/vdev/vdev.c
> > +++ b/drivers/bus/vdev/vdev.c
> > @@ -150,10 +150,9 @@ vdev_probe_all_drivers(struct rte_vdev_device
> > *dev)
> >
> >  	if (vdev_parse(name, &driver))
> >  		return -1;
> > -	dev->device.driver = &driver->driver;
> >  	ret = driver->probe(dev);
> > -	if (ret)
> > -		dev->device.driver = NULL;
> > +	if (ret == 0)
> > +		dev->device.driver = &driver->driver;
> >  	return ret;
> >  }
> >
> > diff --git a/drivers/bus/vmbus/vmbus_common.c
> > b/drivers/bus/vmbus/vmbus_common.c
> > index e3ceb6906..de5548aa4 100644
> > --- a/drivers/bus/vmbus/vmbus_common.c
> > +++ b/drivers/bus/vmbus/vmbus_common.c
> > @@ -111,7 +111,6 @@ vmbus_probe_one_driver(struct rte_vmbus_driver
> > *dr,
> >
> >  	/* reference driver structure */
> >  	dev->driver = dr;
> > -	dev->device.driver = &dr->driver;
> >
> >  	if (dev->device.numa_node < 0) {
> >  		VMBUS_LOG(WARNING, "  Invalid NUMA socket, default to
> 0"); @@
> > -124,6 +123,8 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
> >  	if (ret) {
> >  		dev->driver = NULL;
> >  		rte_vmbus_unmap_device(dev);
> > +	} else {
> > +		dev->device.driver = &dr->driver;
> >  	}
> >
> >  	return ret;
> > @@ -142,7 +143,7 @@ vmbus_probe_all_drivers(struct rte_vmbus_device
> *dev)
> >  	int rc;
> >
> >  	/* Check if a driver is already loaded */
> > -	if (dev->driver != NULL) {
> > +	if (dev->device.driver != NULL) {
> >  		VMBUS_LOG(DEBUG, "VMBUS driver already loaded");
> >  		return 0;
> >  	}
> > diff --git a/drivers/net/i40e/i40e_vf_representor.c
> > b/drivers/net/i40e/i40e_vf_representor.c
> > index 0bfbb4f60..24751d13c 100644
> > --- a/drivers/net/i40e/i40e_vf_representor.c
> > +++ b/drivers/net/i40e/i40e_vf_representor.c
> > @@ -487,9 +487,6 @@ i40e_vf_representor_init(struct rte_eth_dev
> *ethdev, void *init_params)
> >  	if (representor->vf_id >= pf->vf_num)
> >  		return -ENODEV;
> >
> > -	/** representor shares the same driver as it's PF device */
> > -	ethdev->device->driver = representor->adapter->eth_dev->device-
> >driver;
> > -
> >  	/* Set representor device ops */
> >  	ethdev->dev_ops = &i40e_representor_dev_ops;
> >
> > diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index
> > defc0d4b0..3de7bc53e 100644
> > --- a/drivers/net/mlx4/mlx4.c
> > +++ b/drivers/net/mlx4/mlx4.c
> > @@ -734,7 +734,6 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv,
> struct rte_pci_device *pci_dev)
> >  		eth_dev->data->mac_addrs = priv->mac;
> >  		eth_dev->device = &pci_dev->device;
> >  		rte_eth_copy_pci_info(eth_dev, pci_dev);
> > -		eth_dev->device->driver = &mlx4_driver.driver;
> >  		/* Initialize local interrupt handle for current port. */
> >  		priv->intr_handle = (struct rte_intr_handle){
> >  			.fd = -1,
> > diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index
> > 795a21977..8cbfee1ba 100644
> > --- a/drivers/net/mlx5/mlx5.c
> > +++ b/drivers/net/mlx5/mlx5.c
> > @@ -1090,7 +1090,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
> >  	priv->dev_data = eth_dev->data;
> >  	eth_dev->data->mac_addrs = priv->mac;
> >  	eth_dev->device = dpdk_dev;
> > -	eth_dev->device->driver = &mlx5_driver.driver;
> >  	err = mlx5_uar_init_primary(eth_dev);
> >  	if (err) {
> >  		err = rte_errno;
> > diff --git a/drivers/net/szedata2/rte_eth_szedata2.c
> > b/drivers/net/szedata2/rte_eth_szedata2.c
> > index 8f92e72f2..4e5e01cf1 100644
> > --- a/drivers/net/szedata2/rte_eth_szedata2.c
> > +++ b/drivers/net/szedata2/rte_eth_szedata2.c
> > @@ -1474,7 +1474,7 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev
> *dev, struct port_info *pi)
> >  	PMD_INIT_FUNC_TRACE();
> >
> >  	PMD_INIT_LOG(INFO, "Initializing eth_dev %s (driver %s)", data-
> >name,
> > -			dev->device->driver->name);
> > +			RTE_STR(RTE_SZEDATA2_DRIVER_NAME));
> >
> >  	/* Fill internal private structure. */
> >  	internals->dev = dev;
> > @@ -1525,7 +1525,7 @@ rte_szedata2_eth_dev_init(struct rte_eth_dev
> *dev, struct port_info *pi)
> >  	ether_addr_copy(&eth_addr, data->mac_addrs);
> >
> >  	PMD_INIT_LOG(INFO, "%s device %s successfully initialized",
> > -			dev->device->driver->name, data->name);
> > +			RTE_STR(RTE_SZEDATA2_DRIVER_NAME), data-
> >name);
> >
> >  	return 0;
> >  }
> > @@ -1547,7 +1547,7 @@ rte_szedata2_eth_dev_uninit(struct rte_eth_dev
> *dev)
> >  	rte_free(dev->data->mac_addrs);
> >
> >  	PMD_DRV_LOG(INFO, "%s device %s successfully uninitialized",
> > -			dev->device->driver->name, dev->data->name);
> > +			RTE_STR(RTE_SZEDATA2_DRIVER_NAME), dev->data-
> >name);
> >
> >  	return 0;
> >  }
> > diff --git a/lib/librte_eal/common/include/rte_dev.h
> > b/lib/librte_eal/common/include/rte_dev.h
> > index 036180ff3..5084c645b 100644
> > --- a/lib/librte_eal/common/include/rte_dev.h
> > +++ b/lib/librte_eal/common/include/rte_dev.h
> > @@ -156,7 +156,7 @@ struct rte_driver {  struct rte_device {
> >  	TAILQ_ENTRY(rte_device) next; /**< Next device */
> >  	const char *name;             /**< Device name */
> > -	const struct rte_driver *driver;/**< Associated driver */
> > +	const struct rte_driver *driver; /**< Driver assigned after probing
> > +*/
> >  	const struct rte_bus *bus;    /**< Bus handle assigned on scan */
> >  	int numa_node;                /**< NUMA node connection */
> >  	struct rte_devargs *devargs;  /**< Device user arguments */
> >
> 
> 
> 
>
  

Patch

diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c
index 80663328a..fca2dbace 100644
--- a/drivers/bus/ifpga/ifpga_bus.c
+++ b/drivers/bus/ifpga/ifpga_bus.c
@@ -280,14 +280,13 @@  ifpga_probe_one_driver(struct rte_afu_driver *drv,
 
 	/* reference driver structure */
 	afu_dev->driver = drv;
-	afu_dev->device.driver = &drv->driver;
 
 	/* call the driver probe() function */
 	ret = drv->probe(afu_dev);
-	if (ret) {
+	if (ret)
 		afu_dev->driver = NULL;
-		afu_dev->device.driver = NULL;
-	}
+	else
+		afu_dev->device.driver = &drv->driver;
 
 	return ret;
 }
@@ -302,7 +301,7 @@  ifpga_probe_all_drivers(struct rte_afu_device *afu_dev)
 		return -1;
 
 	/* Check if a driver is already loaded */
-	if (afu_dev->driver != NULL)
+	if (afu_dev->device.driver != NULL)
 		return 0;
 
 	TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) {
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index c7695d108..d63e68045 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -160,14 +160,12 @@  rte_pci_probe_one_driver(struct rte_pci_driver *dr,
 	 * driver flags for adjusting configuration.
 	 */
 	dev->driver = dr;
-	dev->device.driver = &dr->driver;
 
 	if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
 		/* map resources for devices that use igb_uio */
 		ret = rte_pci_map_device(dev);
 		if (ret != 0) {
 			dev->driver = NULL;
-			dev->device.driver = NULL;
 			return ret;
 		}
 	}
@@ -176,7 +174,6 @@  rte_pci_probe_one_driver(struct rte_pci_driver *dr,
 	ret = dr->probe(dr, dev);
 	if (ret) {
 		dev->driver = NULL;
-		dev->device.driver = NULL;
 		if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) &&
 			/* Don't unmap if device is unsupported and
 			 * driver needs mapped resources.
@@ -184,6 +181,8 @@  rte_pci_probe_one_driver(struct rte_pci_driver *dr,
 			!(ret > 0 &&
 				(dr->drv_flags & RTE_PCI_DRV_KEEP_MAPPED_RES)))
 			rte_pci_unmap_device(dev);
+	} else {
+		dev->device.driver = &dr->driver;
 	}
 
 	return ret;
@@ -244,7 +243,7 @@  pci_probe_all_drivers(struct rte_pci_device *dev)
 		return -1;
 
 	/* Check if a driver is already loaded */
-	if (dev->driver != NULL)
+	if (dev->device.driver != NULL)
 		return 0;
 
 	FOREACH_DRIVER_ON_PCIBUS(dr) {
diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
index 0d1955ffe..984df2b37 100644
--- a/drivers/bus/pci/rte_bus_pci.h
+++ b/drivers/bus/pci/rte_bus_pci.h
@@ -62,7 +62,7 @@  struct rte_pci_device {
 	struct rte_mem_resource mem_resource[PCI_MAX_RESOURCE];
 					    /**< PCI Memory Resource */
 	struct rte_intr_handle intr_handle; /**< Interrupt handle */
-	struct rte_pci_driver *driver;      /**< Associated driver */
+	struct rte_pci_driver *driver;      /**< PCI driver used in probing */
 	uint16_t max_vfs;                   /**< sriov enable if not zero */
 	enum rte_kernel_driver kdrv;        /**< Kernel driver passthrough */
 	char name[PCI_PRI_STR_SIZE+1];      /**< PCI location (ASCII) */
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
index 0142fb2c8..3f27f3510 100644
--- a/drivers/bus/vdev/vdev.c
+++ b/drivers/bus/vdev/vdev.c
@@ -150,10 +150,9 @@  vdev_probe_all_drivers(struct rte_vdev_device *dev)
 
 	if (vdev_parse(name, &driver))
 		return -1;
-	dev->device.driver = &driver->driver;
 	ret = driver->probe(dev);
-	if (ret)
-		dev->device.driver = NULL;
+	if (ret == 0)
+		dev->device.driver = &driver->driver;
 	return ret;
 }
 
diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c
index e3ceb6906..de5548aa4 100644
--- a/drivers/bus/vmbus/vmbus_common.c
+++ b/drivers/bus/vmbus/vmbus_common.c
@@ -111,7 +111,6 @@  vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
 
 	/* reference driver structure */
 	dev->driver = dr;
-	dev->device.driver = &dr->driver;
 
 	if (dev->device.numa_node < 0) {
 		VMBUS_LOG(WARNING, "  Invalid NUMA socket, default to 0");
@@ -124,6 +123,8 @@  vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
 	if (ret) {
 		dev->driver = NULL;
 		rte_vmbus_unmap_device(dev);
+	} else {
+		dev->device.driver = &dr->driver;
 	}
 
 	return ret;
@@ -142,7 +143,7 @@  vmbus_probe_all_drivers(struct rte_vmbus_device *dev)
 	int rc;
 
 	/* Check if a driver is already loaded */
-	if (dev->driver != NULL) {
+	if (dev->device.driver != NULL) {
 		VMBUS_LOG(DEBUG, "VMBUS driver already loaded");
 		return 0;
 	}
diff --git a/drivers/net/i40e/i40e_vf_representor.c b/drivers/net/i40e/i40e_vf_representor.c
index 0bfbb4f60..24751d13c 100644
--- a/drivers/net/i40e/i40e_vf_representor.c
+++ b/drivers/net/i40e/i40e_vf_representor.c
@@ -487,9 +487,6 @@  i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params)
 	if (representor->vf_id >= pf->vf_num)
 		return -ENODEV;
 
-	/** representor shares the same driver as it's PF device */
-	ethdev->device->driver = representor->adapter->eth_dev->device->driver;
-
 	/* Set representor device ops */
 	ethdev->dev_ops = &i40e_representor_dev_ops;
 
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index defc0d4b0..3de7bc53e 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -734,7 +734,6 @@  mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
 		eth_dev->data->mac_addrs = priv->mac;
 		eth_dev->device = &pci_dev->device;
 		rte_eth_copy_pci_info(eth_dev, pci_dev);
-		eth_dev->device->driver = &mlx4_driver.driver;
 		/* Initialize local interrupt handle for current port. */
 		priv->intr_handle = (struct rte_intr_handle){
 			.fd = -1,
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 795a21977..8cbfee1ba 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1090,7 +1090,6 @@  mlx5_dev_spawn(struct rte_device *dpdk_dev,
 	priv->dev_data = eth_dev->data;
 	eth_dev->data->mac_addrs = priv->mac;
 	eth_dev->device = dpdk_dev;
-	eth_dev->device->driver = &mlx5_driver.driver;
 	err = mlx5_uar_init_primary(eth_dev);
 	if (err) {
 		err = rte_errno;
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 8f92e72f2..4e5e01cf1 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1474,7 +1474,7 @@  rte_szedata2_eth_dev_init(struct rte_eth_dev *dev, struct port_info *pi)
 	PMD_INIT_FUNC_TRACE();
 
 	PMD_INIT_LOG(INFO, "Initializing eth_dev %s (driver %s)", data->name,
-			dev->device->driver->name);
+			RTE_STR(RTE_SZEDATA2_DRIVER_NAME));
 
 	/* Fill internal private structure. */
 	internals->dev = dev;
@@ -1525,7 +1525,7 @@  rte_szedata2_eth_dev_init(struct rte_eth_dev *dev, struct port_info *pi)
 	ether_addr_copy(&eth_addr, data->mac_addrs);
 
 	PMD_INIT_LOG(INFO, "%s device %s successfully initialized",
-			dev->device->driver->name, data->name);
+			RTE_STR(RTE_SZEDATA2_DRIVER_NAME), data->name);
 
 	return 0;
 }
@@ -1547,7 +1547,7 @@  rte_szedata2_eth_dev_uninit(struct rte_eth_dev *dev)
 	rte_free(dev->data->mac_addrs);
 
 	PMD_DRV_LOG(INFO, "%s device %s successfully uninitialized",
-			dev->device->driver->name, dev->data->name);
+			RTE_STR(RTE_SZEDATA2_DRIVER_NAME), dev->data->name);
 
 	return 0;
 }
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index 036180ff3..5084c645b 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -156,7 +156,7 @@  struct rte_driver {
 struct rte_device {
 	TAILQ_ENTRY(rte_device) next; /**< Next device */
 	const char *name;             /**< Device name */
-	const struct rte_driver *driver;/**< Associated driver */
+	const struct rte_driver *driver; /**< Driver assigned after probing */
 	const struct rte_bus *bus;    /**< Bus handle assigned on scan */
 	int numa_node;                /**< NUMA node connection */
 	struct rte_devargs *devargs;  /**< Device user arguments */