From patchwork Wed Feb 10 03:40:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tetsuya Mukawa X-Patchwork-Id: 10449 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id DFF1295DD; Wed, 10 Feb 2016 04:40:36 +0100 (CET) Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by dpdk.org (Postfix) with ESMTP id 6BE1C95D7 for ; Wed, 10 Feb 2016 04:40:35 +0100 (CET) Received: by mail-pa0-f49.google.com with SMTP id p2so320611pav.1 for ; Tue, 09 Feb 2016 19:40:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=igel-co-jp.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=UfonoUZxyFGgB5F1HIni+XLKGpxIVTVWyZ4pFSVR5pg=; b=nw1x4Sb1QMYYC/v+N9Uy4Z8CEyiGNWmWJhXGu9Br4AAyMo51NcVFp4MpZJ1gq0Om8Z HRo9EoYA/B7gyZ6op8dvgjJcbMqxYQQXC4tbgwocxikDOi7Q737jl+1cd8RednW19kXn lig7PKEZ/f81L1UkIFPJuFZz5CQzsr8YH+1b4jp+CaSz1MfuD53SVGbLDz9vZnqmU+pA gB+7jwJOKjPjyn6yLpIZ4MEK5084SAzmXSygujGhHNDk1L1cdYLCRmjCQKpIZh9fYhNU CW1jNrL0ge0ha3SYXT0Zx5eWLNO0A6h8L+u9Ax5aAtLUNkRLQPF+ZNmDVqOykcrb3aaS +Nag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=UfonoUZxyFGgB5F1HIni+XLKGpxIVTVWyZ4pFSVR5pg=; b=YbnissgSW2n4ajG5qSglgN/BLnLJvW1SVYkV+wnNV2EX0p6YfDCRxQ6wCOBURwNiFz LZ+7Gku3QiQJdhMne0LVufqGJXg8xdz8ZdbV20Ki/yoCvDlji5dLYVnggZZ103wujxUz MYlxWRXHS/7i3CWt4zQ9sGBN7xrdR3TrkT0RAmd2l29nHP/5Ad2458GH4O5LVCYtoIfx vOYiSsi1zHg3vp8spSNL178wCfSnjRMyuXsN61EGUWw1izH2whuSl/UujGrlMdWXH7SZ 0+xKyVrNatC1d4GlKBCXSaKZbjwrn8pm9qeYDgGotxA/HuWIJ1C6tf0FWJLT+ULD8AfD 2BHg== X-Gm-Message-State: AG10YOQQTbZlo7PBlY4Z20QrAuWP6SDvn0nJ3NbeNDxff5HRufbD8HXj9qWEpwkmuAibKA== X-Received: by 10.66.139.166 with SMTP id qz6mr55533608pab.148.1455075634892; Tue, 09 Feb 2016 19:40:34 -0800 (PST) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by smtp.gmail.com with ESMTPSA id m75sm1001576pfj.38.2016.02.09.19.40.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 09 Feb 2016 19:40:33 -0800 (PST) From: Tetsuya Mukawa To: dev@dpdk.org Date: Wed, 10 Feb 2016 12:40:11 +0900 Message-Id: <1455075613-3605-4-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1455075613-3605-1-git-send-email-mukawa@igel.co.jp> References: <1455075613-3605-1-git-send-email-mukawa@igel.co.jp> In-Reply-To: <1453374478-30996-6-git-send-email-mukawa@igel.co.jp> References: <1453374478-30996-6-git-send-email-mukawa@igel.co.jp> Subject: [dpdk-dev] [PATCH v2 3/5] vhost: Add a function to check virtio device type X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The patch adds below function to cleanup virtio code. - virtio_dev_check() Signed-off-by: Tetsuya Mukawa --- 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 1c8c955..c3e877a 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 */