diff mbox series

[1/2] virtio: Add queue interface to restore avail index from vring used index

Message ID 20171116184835.28556-2-maxime.coquelin@redhat.com
State New
Headers show
Series virtio-net: Fix TX data discard on backend disconnection | expand

Commit Message

Maxime Coquelin Nov. 16, 2017, 6:48 p.m. UTC
In case of backend crash, it is not possible to restore internal
avail index from the backend value as vhost_get_vring_base
callback fails.

This patch provides a new interface to restore internal avail index
from the vring used index, as done by some vhost-user backend on
reconnection.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 hw/virtio/virtio.c         | 10 ++++++++++
 include/hw/virtio/virtio.h |  1 +
 2 files changed, 11 insertions(+)

Comments

Jens Freimann Nov. 17, 2017, 9:15 a.m. UTC | #1
On Thu, Nov 16, 2017 at 06:48:34PM +0000, Maxime Coquelin wrote:
>In case of backend crash, it is not possible to restore internal
>avail index from the backend value as vhost_get_vring_base
>callback fails.
>
>This patch provides a new interface to restore internal avail index
>from the vring used index, as done by some vhost-user backend on
>reconnection.
>
>Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>---
> hw/virtio/virtio.c         | 10 ++++++++++
> include/hw/virtio/virtio.h |  1 +
> 2 files changed, 11 insertions(+)
>

Reviewed-by: Jens Freimann <jfreimann@redhat.com>
diff mbox series

Patch

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 5884ce3480..583516c428 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2310,6 +2310,16 @@  void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx)
     vdev->vq[n].shadow_avail_idx = idx;
 }
 
+void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n)
+{
+    rcu_read_lock();
+    if (vdev->vq[n].vring.desc) {
+        vdev->vq[n].last_avail_idx = vring_used_idx(&vdev->vq[n]);
+        vdev->vq[n].shadow_avail_idx = vdev->vq[n].last_avail_idx;
+    }
+    rcu_read_unlock();
+}
+
 void virtio_queue_update_used_idx(VirtIODevice *vdev, int n)
 {
     rcu_read_lock();
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index 5abada6966..098bdaaea3 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -272,6 +272,7 @@  hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n);
 hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
 uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
 void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx);
+void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n);
 void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n);
 void virtio_queue_update_used_idx(VirtIODevice *vdev, int n);
 VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n);