From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53674) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKu75-00083z-Np for qemu-devel@nongnu.org; Tue, 04 Mar 2014 13:30:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WKu6z-0006tu-1E for qemu-devel@nongnu.org; Tue, 04 Mar 2014 13:30:47 -0500 Received: from mail-we0-f176.google.com ([74.125.82.176]:44260) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKu6y-0006th-RY for qemu-devel@nongnu.org; Tue, 04 Mar 2014 13:30:40 -0500 Received: by mail-we0-f176.google.com with SMTP id x48so5247539wes.7 for ; Tue, 04 Mar 2014 10:30:40 -0800 (PST) From: Antonios Motakis Date: Tue, 4 Mar 2014 19:22:53 +0100 Message-Id: <1393957383-16685-11-git-send-email-a.motakis@virtualopensystems.com> In-Reply-To: <1393957383-16685-1-git-send-email-a.motakis@virtualopensystems.com> References: <1393957383-16685-1-git-send-email-a.motakis@virtualopensystems.com> Subject: [Qemu-devel] [PATCH v9 10/20] Gracefully handle ioctl failure in vhost_virtqueue_stop List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, snabb-devel@googlegroups.com Cc: lukego@gmail.com, Antonios Motakis , tech@virtualopensystems.com, n.nikolaev@virtualopensystems.com, mst@redhat.com On stopping the vhost, a call to VHOST_GET_VRING_BASE is issued. The received value is stored as last_avail_idx, so the virtqueue can continue operating if the connection is resumed. Handle the failure of this call and use the current avail_idx. Some packets from the avail ring may be omitted but still we keep a sane value and can continue on reconnect. Signed-off-by: Antonios Motakis Signed-off-by: Nikolay Nikolaev --- hw/virtio/vhost.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 9e336ad..322e2c0 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -758,12 +758,13 @@ static void vhost_virtqueue_stop(struct vhost_dev *dev, assert(idx >= dev->vq_index && idx < dev->vq_index + dev->nvqs); r = ioctl(dev->control, VHOST_GET_VRING_BASE, &state); if (r < 0) { + state.num = virtio_queue_get_avail_idx(vdev, idx); fprintf(stderr, "vhost VQ %d ring restore failed: %d\n", idx, r); fflush(stderr); } virtio_queue_set_last_avail_idx(vdev, idx, state.num); virtio_queue_invalidate_signalled_used(vdev, idx); - assert (r >= 0); + cpu_physical_memory_unmap(vq->ring, virtio_queue_get_ring_size(vdev, idx), 0, virtio_queue_get_ring_size(vdev, idx)); cpu_physical_memory_unmap(vq->used, virtio_queue_get_used_size(vdev, idx), -- 1.8.3.2