From patchwork Fri Dec 24 02:55:39 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yoshiaki Tamura X-Patchwork-Id: 76577 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1F1FBB6F1E for ; Fri, 24 Dec 2010 14:14:04 +1100 (EST) Received: from localhost ([127.0.0.1]:34091 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PVy6T-0007dK-2S for incoming@patchwork.ozlabs.org; Thu, 23 Dec 2010 22:14:01 -0500 Received: from [140.186.70.92] (port=40720 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PVxq1-0006ML-8f for qemu-devel@nongnu.org; Thu, 23 Dec 2010 21:57:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PVxpx-0006IQ-M2 for qemu-devel@nongnu.org; Thu, 23 Dec 2010 21:57:01 -0500 Received: from sh.osrg.net ([192.16.179.4]:33738) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PVxpx-0006Fl-1Q for qemu-devel@nongnu.org; Thu, 23 Dec 2010 21:56:57 -0500 Received: from fs.osrg.net (postfix@fs.osrg.net [10.0.0.12]) by sh.osrg.net (8.14.3/8.14.3/OSRG-NET) with ESMTP id oBO2uSL8004294; Fri, 24 Dec 2010 11:56:28 +0900 Received: from localhost (hype-nh0.osrg.net [10.72.1.48]) by fs.osrg.net (Postfix) with ESMTP id 1295D3E042A; Fri, 24 Dec 2010 11:56:25 +0900 (JST) From: Yoshiaki Tamura To: kvm@vger.kernel.org, qemu-devel@nongnu.org Date: Fri, 24 Dec 2010 11:55:39 +0900 Message-Id: <1293159350-30762-7-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> X-Mailer: git-send-email 1.7.1.2 In-Reply-To: <1293159350-30762-1-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> References: <1293159350-30762-1-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> X-Dispatcher: imput version 20070423(IM149) Lines: 49 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-3.0 (sh.osrg.net [192.16.179.4]); Fri, 24 Dec 2010 11:56:30 +0900 (JST) X-Virus-Scanned: clamav-milter 0.96.5 at sh X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: kwolf@redhat.com, aliguori@us.ibm.com, mtosatti@redhat.com, ananth@in.ibm.com, mst@redhat.com, dlaor@redhat.com, vatsa@linux.vnet.ibm.com, Yoshiaki Tamura , ohmura.kei@lab.ntt.co.jp, avi@redhat.com, psuriset@linux.vnet.ibm.com, stefanha@linux.vnet.ibm.com Subject: [Qemu-devel] [PATCH 06/17] virtio: update last_avail_idx when inuse is decreased. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org virtio save/load is currently sending last_avail_idx, but inuse isn't. This causes inconsistent state when using Kemari which replays outstanding requests on the secondary. By letting last_avail_idx to be updated after inuse is decreased, it would be possible to replay the outstanding requests. Noth that live migration shouldn't be affected because it waits until flushing all requests. Also in conjunction with event-tap, requests inversion should be avoided. Signed-off-by: Yoshiaki Tamura --- hw/virtio.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/hw/virtio.c b/hw/virtio.c index 07dbf86..f915c46 100644 --- a/hw/virtio.c +++ b/hw/virtio.c @@ -72,7 +72,7 @@ struct VirtQueue VRing vring; target_phys_addr_t pa; uint16_t last_avail_idx; - int inuse; + uint16_t inuse; uint16_t vector; void (*handle_output)(VirtIODevice *vdev, VirtQueue *vq); VirtIODevice *vdev; @@ -671,6 +671,7 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f) qemu_put_be32(f, vdev->vq[i].vring.num); qemu_put_be64(f, vdev->vq[i].pa); qemu_put_be16s(f, &vdev->vq[i].last_avail_idx); + qemu_put_be16s(f, &vdev->vq[i].inuse); if (vdev->binding->save_queue) vdev->binding->save_queue(vdev->binding_opaque, i, f); } @@ -710,6 +711,11 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f) vdev->vq[i].vring.num = qemu_get_be32(f); vdev->vq[i].pa = qemu_get_be64(f); qemu_get_be16s(f, &vdev->vq[i].last_avail_idx); + qemu_get_be16s(f, &vdev->vq[i].inuse); + + /* revert last_avail_idx if there are outstanding emulation. */ + vdev->vq[i].last_avail_idx -= vdev->vq[i].inuse; + vdev->vq[i].inuse = 0; if (vdev->vq[i].pa) { uint16_t nheads;