[dpdk-dev] [RFC 6/6] eal: move driver pointer from rte_pci_device to rte_bus_device
Jan Viktorin
viktorin at rehivetech.com
Mon Jan 18 17:03:07 CET 2016
We define to_pci_driver helper macro here.
Suggested-by: David Marchand <david.marchand at 6wind.com>
Signed-off-by: Jan Viktorin <viktorin at rehivetech.com>
---
app/test/virtual_pmd.c | 2 +-
drivers/net/virtio/virtio_ethdev.c | 25 +++++++++++++++++--------
lib/librte_cryptodev/rte_cryptodev.c | 3 ++-
lib/librte_eal/common/eal_common_pci.c | 4 ++--
lib/librte_eal/common/include/rte_dev.h | 1 +
lib/librte_eal/common/include/rte_pci.h | 4 +++-
lib/librte_ether/rte_ethdev.c | 10 ++++++----
7 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/app/test/virtual_pmd.c b/app/test/virtual_pmd.c
index 0fe957f..c88972d 100644
--- a/app/test/virtual_pmd.c
+++ b/app/test/virtual_pmd.c
@@ -626,7 +626,7 @@ virtual_ethdev_create(const char *name, struct ether_addr *mac_addr,
eth_dev->dev_ops = &dev_private->dev_ops;
eth_dev->pci_dev = pci_dev;
- eth_dev->pci_dev->driver = ð_drv->pci_drv;
+ eth_dev->pci_dev->dev.driver = ð_drv->pci_drv.drv;
eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_success;
eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_success;
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 1ee9f85..22a7849 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -487,11 +487,12 @@ virtio_dev_close(struct rte_eth_dev *dev)
{
struct virtio_hw *hw = dev->data->dev_private;
struct rte_pci_device *pci_dev = dev->pci_dev;
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
PMD_INIT_LOG(DEBUG, "virtio_dev_close");
/* reset the NIC */
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
vtpci_reset(hw);
hw->started = 0;
@@ -1080,6 +1081,7 @@ virtio_has_msix(const struct rte_pci_addr *loc)
/* Extract I/O port numbers from sysfs */
static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)
{
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
char dirname[PATH_MAX];
char filename[PATH_MAX];
unsigned long start, size;
@@ -1122,7 +1124,7 @@ static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)
}
pci_dev->dev.intr_handle.type = RTE_INTR_HANDLE_UIO;
- pci_dev->driver->drv_flags |= RTE_PCI_DRV_INTR_LSC;
+ pci_drv->drv_flags |= RTE_PCI_DRV_INTR_LSC;
return 0;
}
@@ -1130,6 +1132,7 @@ static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)
/* Extract port I/O numbers from proc/ioports */
static int virtio_resource_init_by_ioports(struct rte_pci_device *pci_dev)
{
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
uint16_t start, end;
int size;
FILE *fp;
@@ -1188,7 +1191,7 @@ static int virtio_resource_init_by_ioports(struct rte_pci_device *pci_dev)
start, size);
/* can't support lsc interrupt without uio */
- pci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
+ pci_drv->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
return 0;
}
@@ -1265,6 +1268,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
struct virtio_net_config *config;
struct virtio_net_config local_config;
struct rte_pci_device *pci_dev;
+ struct rte_pci_driver *pci_drv;
RTE_BUILD_BUG_ON(RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr));
@@ -1286,6 +1290,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
}
pci_dev = eth_dev->pci_dev;
+ pci_drv = to_pci_driver(pci_dev->dev.driver);
if (virtio_resource_init(pci_dev) < 0)
return -1;
@@ -1305,7 +1310,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
/* If host does not support status then disable LSC */
if (!vtpci_with_feature(hw, VIRTIO_NET_F_STATUS))
- pci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
+ pci_drv->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
rte_eth_copy_pci_info(eth_dev, pci_dev);
@@ -1388,7 +1393,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
pci_dev->id.device_id);
/* Setup interrupt callback */
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
rte_intr_callback_register(&pci_dev->dev.intr_handle,
virtio_interrupt_handler, eth_dev);
@@ -1401,6 +1406,7 @@ static int
eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
{
struct rte_pci_device *pci_dev;
+ struct rte_pci_driver *pci_drv;
struct virtio_hw *hw = eth_dev->data->dev_private;
PMD_INIT_FUNC_TRACE();
@@ -1413,6 +1419,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
virtio_dev_close(eth_dev);
}
pci_dev = eth_dev->pci_dev;
+ pci_drv = to_pci_driver(pci_dev->dev.driver);
eth_dev->dev_ops = NULL;
eth_dev->tx_pkt_burst = NULL;
@@ -1424,7 +1431,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
eth_dev->data->mac_addrs = NULL;
/* reset interrupt callback */
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
rte_intr_callback_unregister(&pci_dev->dev.intr_handle,
virtio_interrupt_handler,
eth_dev);
@@ -1474,6 +1481,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
struct virtio_hw *hw = dev->data->dev_private;
struct rte_pci_device *pci_dev = dev->pci_dev;
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
PMD_INIT_LOG(DEBUG, "configure");
@@ -1491,7 +1499,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
return -ENOTSUP;
}
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
if (vtpci_irq_config(hw, 0) == VIRTIO_MSI_NO_VECTOR) {
PMD_DRV_LOG(ERR, "failed to set config vector");
return -EBUSY;
@@ -1507,10 +1515,11 @@ virtio_dev_start(struct rte_eth_dev *dev)
uint16_t nb_queues, i;
struct virtio_hw *hw = dev->data->dev_private;
struct rte_pci_device *pci_dev = dev->pci_dev;
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
/* check if lsc interrupt feature is enabled */
if (dev->data->dev_conf.intr_conf.lsc) {
- if (!(pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)) {
+ if (!(pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)) {
PMD_DRV_LOG(ERR, "link status not supported by host");
return -ENOTSUP;
}
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index f09f67e..f1c9a4e 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -394,7 +394,8 @@ rte_cryptodev_uninit(struct rte_pci_device *pci_dev)
if (cryptodev == NULL)
return -ENODEV;
- cryptodrv = (const struct rte_cryptodev_driver *)pci_dev->driver;
+ cryptodrv = (const struct rte_cryptodev_driver *)
+ to_pci_driver(pci_dev->dev.driver);
if (cryptodrv == NULL)
return -ENODEV;
diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c
index 4ac180d..8341a92 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -199,7 +199,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
}
/* reference driver structure */
- dev->driver = dr;
+ dev->dev.driver = &dr->drv;
/* call the driver devinit() function */
return dr->devinit(dr, dev);
@@ -250,7 +250,7 @@ rte_eal_pci_detach_dev(struct rte_pci_driver *dr,
return -1; /* negative value is an error */
/* clear driver structure */
- dev->driver = NULL;
+ dev->dev.driver = NULL;
if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING)
/* unmap resources for devices that use igb_uio */
diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h
index a481988..29655da 100644
--- a/lib/librte_eal/common/include/rte_dev.h
+++ b/lib/librte_eal/common/include/rte_dev.h
@@ -160,6 +160,7 @@ struct rte_devargs;
struct rte_bus_device {
const char *name;
+ struct rte_bus_driver *driver;
struct rte_devargs *devargs;
struct rte_intr_handle intr_handle;
int numa_node;
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index e2c3073..f2360a7 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -161,7 +161,6 @@ struct rte_pci_device {
struct rte_pci_addr addr; /**< PCI location. */
struct rte_pci_id id; /**< PCI ID. */
struct rte_pci_resource mem_resource[PCI_MAX_RESOURCE]; /**< PCI Memory Resource */
- struct rte_pci_driver *driver; /**< Associated driver */
uint16_t max_vfs; /**< sriov enable if not zero */
enum rte_kernel_driver kdrv; /**< Kernel driver passthrough */
struct rte_bus_device dev; /**< Generic device */
@@ -211,6 +210,9 @@ struct rte_pci_driver {
struct rte_bus_driver drv; /**< Generic driver */
};
+#define to_pci_driver(busdrv) \
+ container_of((busdrv), struct rte_pci_driver, drv)
+
/** Device needs PCI BAR mapping (done with either IGB_UIO or VFIO) */
#define RTE_PCI_DRV_NEED_MAPPING 0x0001
/** Device driver must be registered several times until failure - deprecated */
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index b93fba8..17db470 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -315,7 +315,8 @@ rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
if (eth_dev == NULL)
return -ENODEV;
- eth_drv = (const struct eth_driver *)pci_dev->driver;
+ eth_drv = (const struct eth_driver *)
+ to_pci_driver(pci_dev->dev.driver);
/* Invoke PMD device uninit function */
if (*eth_drv->eth_dev_uninit) {
@@ -3223,6 +3224,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
void
rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_dev)
{
+ struct rte_pci_driver *drv = to_pci_driver(pci_dev->dev.driver);
if ((eth_dev == NULL) || (pci_dev == NULL)) {
RTE_PMD_DEBUG_TRACE("NULL pointer eth_dev=%p pci_dev=%p\n",
eth_dev, pci_dev);
@@ -3230,12 +3232,12 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_de
}
eth_dev->data->dev_flags = 0;
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_DETACHABLE)
+ if (drv->drv_flags & RTE_PCI_DRV_DETACHABLE)
eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
eth_dev->data->kdrv = pci_dev->kdrv;
eth_dev->data->numa_node = pci_dev->dev.numa_node;
- eth_dev->data->drv_name = pci_dev->driver->name;
+ eth_dev->data->drv_name = pci_dev->dev.driver->name;
}
--
2.7.0
More information about the dev
mailing list