From patchwork Thu Jan 12 06:03:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanhan Liu X-Patchwork-Id: 19160 X-Patchwork-Delegate: yuanhan.liu@linux.intel.com 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 89039F934; Thu, 12 Jan 2017 07:01:18 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 27EA1F92F for ; Thu, 12 Jan 2017 07:01:10 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga105.fm.intel.com with ESMTP; 11 Jan 2017 22:01:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,348,1477983600"; d="scan'208";a="29354747" Received: from yliu-dev.sh.intel.com ([10.239.67.162]) by orsmga002.jf.intel.com with ESMTP; 11 Jan 2017 22:01:08 -0800 From: Yuanhan Liu To: dev@dpdk.org Cc: Yuanhan Liu Date: Thu, 12 Jan 2017 14:03:20 +0800 Message-Id: <1484201000-31071-2-git-send-email-yuanhan.liu@linux.intel.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1484201000-31071-1-git-send-email-yuanhan.liu@linux.intel.com> References: <1484201000-31071-1-git-send-email-yuanhan.liu@linux.intel.com> Subject: [dpdk-dev] [PATCH 2/2] net/virtio: do not store PCI device pointer at shared memory X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" hw->dev, a pointer to pci_dev, was actually not used, until the refactor of decouping from PCI device. This would somehow break the multiple process again, since "hw" is stored at shared memory, while "pci_dev" is not: the primary and secondary process could have different address for it, while just one value is allowed. Thus we should not store it to "hw", instead, we could retrieve it from the "eth_dev->device" field. Fixes: ae34410a8a8a ("ethdev: move info filling of PCI into drivers") Fixes: eac901ce29be ("ethdev: decouple from PCI device") Signed-off-by: Yuanhan Liu --- drivers/net/virtio/virtio_ethdev.c | 16 ++++++++-------- drivers/net/virtio/virtio_pci.c | 2 -- drivers/net/virtio/virtio_pci.h | 1 - 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index edef2a2..f596f4d 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -489,7 +489,7 @@ struct rte_virtio_xstats_name_off { * virtual address. And we need properly set _offset_, please see * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information. */ - if (hw->dev) + if (!hw->virtio_user_dev) vq->offset = offsetof(struct rte_mbuf, buf_physaddr); else { vq->vq_ring_mem = (uintptr_t)mz->addr; @@ -1194,7 +1194,7 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev, struct virtio_hw *hw = eth_dev->data->dev_private; struct virtio_net_config *config; struct virtio_net_config local_config; - struct rte_pci_device *pci_dev = hw->dev; + struct rte_pci_device *pci_dev = NULL; int ret; /* Reset the device although not necessary at startup */ @@ -1214,8 +1214,10 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev, else eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; - if (pci_dev) + if (eth_dev->device) { + pci_dev = RTE_DEV_TO_PCI(eth_dev->device); rte_eth_copy_pci_info(eth_dev, pci_dev); + } rx_func_get(eth_dev); @@ -1406,8 +1408,6 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev, static int eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev) { - struct virtio_hw *hw = eth_dev->data->dev_private; - PMD_INIT_FUNC_TRACE(); if (rte_eal_process_type() == RTE_PROC_SECONDARY) @@ -1428,8 +1428,8 @@ static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev, rte_intr_callback_unregister(eth_dev->intr_handle, virtio_interrupt_handler, eth_dev); - if (hw->dev) - rte_eal_pci_unmap_device(hw->dev); + if (eth_dev->device) + rte_eal_pci_unmap_device(RTE_DEV_TO_PCI(eth_dev->device)); PMD_INIT_LOG(DEBUG, "dev_uninit completed"); @@ -1687,7 +1687,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev) uint64_t tso_mask; struct virtio_hw *hw = dev->data->dev_private; - dev_info->pci_dev = hw->dev; + dev_info->pci_dev = dev->device ? RTE_DEV_TO_PCI(dev->device) : NULL; dev_info->max_rx_queues = RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES); dev_info->max_tx_queues = diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index f5754e5..fbdb5b7 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -730,8 +730,6 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw, uint32_t *dev_flags) { - hw->dev = dev; - /* * Try if we can succeed reading virtio pci caps, which exists * only on modern pci device. If failed, we fallback to legacy diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 511a1c8..4235bef 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -258,7 +258,6 @@ struct virtio_hw { uint32_t notify_off_multiplier; uint8_t *isr; uint16_t *notify_base; - struct rte_pci_device *dev; struct virtio_pci_common_cfg *common_cfg; struct virtio_net_config *dev_cfg; void *virtio_user_dev;