From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53433) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XP78c-0002mL-99 for qemu-devel@nongnu.org; Wed, 03 Sep 2014 05:46:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XP78X-0004uL-Nj for qemu-devel@nongnu.org; Wed, 03 Sep 2014 05:46:02 -0400 Date: Wed, 3 Sep 2014 12:30:40 +0300 From: "Michael S. Tsirkin" Message-ID: <1409736593-8455-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCH v2] vhost_net: cleanup recovery List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Jason Wang , Andrey Korolyov , qemu-stable@nongnu.org commit aad4dce934649b3a398396fc2a76f215bb194ea4 vhost_net: start/stop guest notifiers properly changed the order of calls for guest notifiers, but did not recover in the correct (reverse) order. Fix it up. Cc: qemu-stable@nongnu.org Cc: Andrey Korolyov Cc: Jason Wang Signed-off-by: Michael S. Tsirkin --- hw/net/vhost_net.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index ba5d544..ddebd04 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -289,7 +289,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev))); VirtioBusState *vbus = VIRTIO_BUS(qbus); VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); - int r, i = 0; + int r, i; if (!vhost_net_device_endian_ok(dev)) { error_report("vhost-net does not support cross-endian"); @@ -317,16 +317,22 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev); if (r < 0) { - goto err; + goto err_start; } } return 0; -err: +err_start: while (--i >= 0) { vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev); } + r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false); + if (r < 0) { + fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r); + fflush(stderr); + } +err: return r; } -- MST