From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id A58D347D1 for ; Tue, 15 Nov 2016 12:39:56 +0100 (CET) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga102.jf.intel.com with ESMTP; 15 Nov 2016 03:39:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,494,1473145200"; d="scan'208";a="31499470" Received: from yliu-dev.sh.intel.com ([10.239.67.162]) by fmsmga006.fm.intel.com with ESMTP; 15 Nov 2016 03:39:55 -0800 From: Yuanhan Liu To: Yuanhan Liu Cc: Kyle Larose , Maxime Coquelin , dpdk stable Date: Tue, 15 Nov 2016 19:40:33 +0800 Message-Id: <1479210033-24775-13-git-send-email-yuanhan.liu@linux.intel.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1479210033-24775-1-git-send-email-yuanhan.liu@linux.intel.com> References: <1479210033-24775-1-git-send-email-yuanhan.liu@linux.intel.com> Subject: [dpdk-stable] patch 'net/virtio: revert fix restart' has been queued to stable release 16.07.2 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Nov 2016 11:39:57 -0000 Hi, FYI, your patch has been queued to stable release 16.07.2 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 11/19/16. So please shout if anyone has objections. Thanks. --yliu --- >>From 60030e50665bad4136c90dc20d0575700f5f46d7 Mon Sep 17 00:00:00 2001 From: Yuanhan Liu Date: Sat, 5 Nov 2016 17:40:56 +0800 Subject: [PATCH] net/virtio: revert fix restart [ backported from upstream commit 3f3b3d549bd5f308aaf425a9ab58473e4fb812b1 ] This reverts commit 9a0615af7746 ("virtio: fix restart"); conflict is manually addressed. Kyle reported an issue with above commit qemu-kvm: Guest moved used index from 5 to 1 with following steps, 1) Start my virtio interfaces 2) Send some traffic into/out of the interfaces 3) Stop the interfaces 4) Start the interfaces 5) Send some more traffic And here are some quotes from Kyle's analysis, Prior to the patch, if an interface were stopped then started, without restarting the application, the queues would be left as-is, because hw->started would be set to 1. Now, calling stop sets hw->started to 0, which means the next call to start will "touch the queues". This is the unintended side-effect that causes the problem. We should not touch the queues once the init is done, otherwise, the vring state of virtio PMD driver and vhost-user would be inconsistent, leading some issue like above. Thus this patch is reverted. Fixes: 9a0615af7746 ("virtio: fix restart") Reported-by: Kyle Larose Signed-off-by: Yuanhan Liu Reviewed-by: Maxime Coquelin (cherry picked from commit 3f3b3d549bd5f308aaf425a9ab58473e4fb812b1) Conflicts: drivers/net/virtio/virtio_ethdev.c --- drivers/net/virtio/virtio_ethdev.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 4cee067..86cf8a3 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -549,13 +549,11 @@ virtio_dev_close(struct rte_eth_dev *dev) PMD_INIT_LOG(DEBUG, "virtio_dev_close"); - if (hw->started == 1) - virtio_dev_stop(dev); - /* reset the NIC */ if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR); vtpci_reset(hw); + hw->started = 0; virtio_dev_free_mbufs(dev); virtio_free_queues(dev); } @@ -1275,9 +1273,10 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() == RTE_PROC_SECONDARY) return -EPERM; - /* Close it anyway since there's no way to know if closed */ - virtio_dev_close(eth_dev); - + if (hw->started == 1) { + virtio_dev_stop(eth_dev); + virtio_dev_close(eth_dev); + } pci_dev = eth_dev->pci_dev; eth_dev->dev_ops = NULL; @@ -1486,12 +1485,9 @@ static void virtio_dev_stop(struct rte_eth_dev *dev) { struct rte_eth_link link; - struct virtio_hw *hw = dev->data->dev_private; PMD_INIT_LOG(DEBUG, "stop"); - hw->started = 0; - if (dev->data->dev_conf.intr_conf.lsc) rte_intr_disable(&dev->pci_dev->intr_handle); -- 1.9.0