[dpdk-dev] [PATCH v4 02/12] vhost: Add a function to check virtio device type

Tetsuya Mukawa mukawa at igel.co.jp
Wed Mar 9 09:33:19 CET 2016


The patch adds below function to cleanup virtio code.
 - virtio_dev_check()

Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp>
---
 drivers/net/virtio/virtio_ethdev.c | 52 ++++++++++++++++++--------------------
 drivers/net/virtio/virtio_ethdev.h | 32 +++++++++++++++++++++++
 2 files changed, 57 insertions(+), 27 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 429377b..bc631c7 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -371,7 +371,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
 	vq->mz = mz;
 	vq->vq_ring_virt_mem = mz->addr;
 
-	if (dev->dev_type == RTE_ETH_DEV_PCI) {
+	if (virtio_dev_check(dev, RTE_ETH_DEV_PCI, NULL, 0)) {
 		vq->vq_ring_mem = mz->phys_addr;
 
 		/* Virtio PCI device VIRTIO_PCI_QUEUE_PF register is 32bit,
@@ -429,7 +429,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
 		vq->virtio_net_hdr_vaddr = mz->addr;
 		memset(vq->virtio_net_hdr_vaddr, 0, hdr_size);
 
-		if (dev->dev_type == RTE_ETH_DEV_PCI)
+		if (virtio_dev_check(dev, RTE_ETH_DEV_PCI, NULL, 0))
 			vq->virtio_net_hdr_mem = mz->phys_addr;
 #ifdef RTE_VIRTIO_VDEV
 		else
@@ -439,7 +439,7 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev,
 
 	hw->vtpci_ops->setup_queue(hw, vq);
 
-	if (dev->dev_type == RTE_ETH_DEV_PCI)
+	if (virtio_dev_check(dev, RTE_ETH_DEV_PCI, NULL, 0))
 		vq->offset = offsetof(struct rte_mbuf, buf_physaddr);
 #ifdef RTE_VIRTIO_VDEV
 	else
@@ -490,15 +490,13 @@ static void
 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;
 
 	PMD_INIT_LOG(DEBUG, "virtio_dev_close");
 
 	/* reset the NIC */
-	if (dev->dev_type == RTE_ETH_DEV_PCI) {
-		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-			vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
-	}
+	if (virtio_dev_check(dev, RTE_ETH_DEV_PCI, NULL, RTE_PCI_DRV_INTR_LSC))
+		vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
+
 	vtpci_reset(hw);
 	hw->started = 0;
 	virtio_dev_free_mbufs(dev);
@@ -1001,7 +999,7 @@ virtio_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
 	isr = vtpci_isr(hw);
 	PMD_DRV_LOG(INFO, "interrupt status = %#x", isr);
 
-	if (dev->dev_type == RTE_ETH_DEV_PCI)
+	if (virtio_dev_check(dev, RTE_ETH_DEV_PCI, NULL, 0))
 		if (rte_intr_enable(&dev->pci_dev->intr_handle) < 0)
 			PMD_DRV_LOG(ERR, "interrupt enable failed");
 
@@ -1056,9 +1054,10 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 
 	pci_dev = eth_dev->pci_dev;
 
-	if (eth_dev->dev_type == RTE_ETH_DEV_PCI)
+	if (virtio_dev_check(eth_dev, RTE_ETH_DEV_PCI, NULL, 0)) {
 		if (vtpci_init(pci_dev, hw) < 0)
 			return -1;
+	}
 
 	/* Reset the device although not necessary at startup */
 	vtpci_reset(hw);
@@ -1072,7 +1071,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 		return -1;
 
 	/* If host does not support status then disable LSC */
-	if (eth_dev->dev_type == RTE_ETH_DEV_PCI) {
+	if (virtio_dev_check(eth_dev, RTE_ETH_DEV_PCI, NULL, 0)) {
 		if (!vtpci_with_feature(hw, VIRTIO_NET_F_STATUS))
 			pci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
 
@@ -1154,13 +1153,14 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 
 	PMD_INIT_LOG(DEBUG, "hw->max_rx_queues=%d   hw->max_tx_queues=%d",
 			hw->max_rx_queues, hw->max_tx_queues);
-	if (eth_dev->dev_type == RTE_ETH_DEV_PCI) {
+	if (virtio_dev_check(eth_dev, RTE_ETH_DEV_PCI, NULL, 0)) {
 		PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x",
 			     eth_dev->data->port_id, pci_dev->id.vendor_id,
 			     pci_dev->id.device_id);
 
 		/* Setup interrupt callback  */
-		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+		if (virtio_dev_check(eth_dev, RTE_ETH_DEV_PCI,
+					NULL, RTE_PCI_DRV_INTR_LSC))
 			rte_intr_callback_register(&pci_dev->intr_handle,
 						   virtio_interrupt_handler,
 						   eth_dev);
@@ -1197,11 +1197,11 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 	eth_dev->data->mac_addrs = NULL;
 
 	/* reset interrupt callback  */
-	if (eth_dev->dev_type == RTE_ETH_DEV_PCI)
-		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-			rte_intr_callback_unregister(&pci_dev->intr_handle,
-						     virtio_interrupt_handler,
-						     eth_dev);
+	if (virtio_dev_check(eth_dev, RTE_ETH_DEV_PCI, NULL, RTE_PCI_DRV_INTR_LSC))
+		rte_intr_callback_unregister(&pci_dev->intr_handle,
+					     virtio_interrupt_handler,
+					     eth_dev);
+
 	rte_eal_pci_unmap_device(pci_dev);
 
 	PMD_INIT_LOG(DEBUG, "dev_uninit completed");
@@ -1248,7 +1248,6 @@ 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;
 
 	PMD_INIT_LOG(DEBUG, "configure");
 
@@ -1266,12 +1265,11 @@ virtio_dev_configure(struct rte_eth_dev *dev)
 		return -ENOTSUP;
 	}
 
-	if (dev->dev_type == RTE_ETH_DEV_PCI) {
-		if (pci_dev->driver->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;
-			}
+	if (virtio_dev_check(dev, RTE_ETH_DEV_PCI, NULL, 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;
+		}
 	}
 
 	return 0;
@@ -1283,11 +1281,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;
 
 	/* 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 (!virtio_dev_check(dev, RTE_ETH_DEV_PCI,
+					NULL, RTE_PCI_DRV_INTR_LSC)) {
 			PMD_DRV_LOG(ERR, "link status not supported by host");
 			return -ENOTSUP;
 		}
diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h
index fde77ca..223b56d 100644
--- a/drivers/net/virtio/virtio_ethdev.h
+++ b/drivers/net/virtio/virtio_ethdev.h
@@ -67,6 +67,38 @@
 	 1u << VIRTIO_NET_F_MRG_RXBUF	  |	\
 	 1ULL << VIRTIO_F_VERSION_1)
 
+static inline int
+virtio_dev_check(struct rte_eth_dev *dev, enum rte_eth_dev_type type,
+		const char *name, uint64_t flags)
+{
+	int ret;
+
+	if (dev == NULL)
+		return 0;
+
+	if (type != 0)
+		ret = (dev->dev_type == type);
+	else
+		ret = 1;
+
+	if (name != 0)
+		ret &= (strncmp(dev->data->name, name, strlen(name)) == 0);
+	else
+		ret &= 1;
+
+	if (flags != 0) {
+		if (dev->dev_type == RTE_ETH_DEV_PCI)
+			ret &= (dev->pci_dev->driver->drv_flags & flags) ? 1 : 0;
+		else if (dev->dev_type == RTE_ETH_DEV_VIRTUAL)
+			ret &= (dev->data->dev_flags & flags) ? 1 : 0;
+		else
+			ret = 0;
+	} else
+		ret &= 1;
+
+	return ret;
+}
+
 /*
  * CQ function prototype
  */
-- 
2.1.4



More information about the dev mailing list