[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 41/86] virtio-pci: support queue reset
From: |
Michael S. Tsirkin |
Subject: |
[PULL 41/86] virtio-pci: support queue reset |
Date: |
Mon, 31 Oct 2022 08:52:41 -0400 |
From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
PCI devices support vq reset.
Based on this function, the driver can adjust the size of the ring, and
quickly recycle the buffer in the ring.
The migration of the virtio devices will not happen during a reset
operation. This is becuase the global iothread lock is held. Migration
thread also needs the lock. As a result, when migration of virtio
devices starts, the 'reset' status of VirtIOPCIQueue will always be 0.
Thus, we do not need to add it in vmstate_virtio_pci_modern_queue_state.
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20221017092558.111082-6-xuanzhuo@linux.alibaba.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
include/hw/virtio/virtio-pci.h | 5 +++++
hw/virtio/virtio-pci.c | 15 +++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/include/hw/virtio/virtio-pci.h b/include/hw/virtio/virtio-pci.h
index 2446dcd9ae..938799e8f6 100644
--- a/include/hw/virtio/virtio-pci.h
+++ b/include/hw/virtio/virtio-pci.h
@@ -117,6 +117,11 @@ typedef struct VirtIOPCIRegion {
typedef struct VirtIOPCIQueue {
uint16_t num;
bool enabled;
+ /*
+ * No need to migrate the reset status, because it is always 0
+ * when the migration starts.
+ */
+ bool reset;
uint32_t desc[2];
uint32_t avail[2];
uint32_t used[2];
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 34db51e241..d4f2ffe986 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1251,6 +1251,9 @@ static uint64_t virtio_pci_common_read(void *opaque,
hwaddr addr,
case VIRTIO_PCI_COMMON_Q_USEDHI:
val = proxy->vqs[vdev->queue_sel].used[1];
break;
+ case VIRTIO_PCI_COMMON_Q_RESET:
+ val = proxy->vqs[vdev->queue_sel].reset;
+ break;
default:
val = 0;
}
@@ -1338,6 +1341,7 @@ static void virtio_pci_common_write(void *opaque, hwaddr
addr,
((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 |
proxy->vqs[vdev->queue_sel].used[0]);
proxy->vqs[vdev->queue_sel].enabled = 1;
+ proxy->vqs[vdev->queue_sel].reset = 0;
} else {
virtio_error(vdev, "wrong value for queue_enable %"PRIx64, val);
}
@@ -1360,6 +1364,16 @@ static void virtio_pci_common_write(void *opaque, hwaddr
addr,
case VIRTIO_PCI_COMMON_Q_USEDHI:
proxy->vqs[vdev->queue_sel].used[1] = val;
break;
+ case VIRTIO_PCI_COMMON_Q_RESET:
+ if (val == 1) {
+ proxy->vqs[vdev->queue_sel].reset = 1;
+
+ virtio_queue_reset(vdev, vdev->queue_sel);
+
+ proxy->vqs[vdev->queue_sel].reset = 0;
+ proxy->vqs[vdev->queue_sel].enabled = 0;
+ }
+ break;
default:
break;
}
@@ -1954,6 +1968,7 @@ static void virtio_pci_reset(DeviceState *qdev)
for (i = 0; i < VIRTIO_QUEUE_MAX; i++) {
proxy->vqs[i].enabled = 0;
+ proxy->vqs[i].reset = 0;
proxy->vqs[i].num = 0;
proxy->vqs[i].desc[0] = proxy->vqs[i].desc[1] = 0;
proxy->vqs[i].avail[0] = proxy->vqs[i].avail[1] = 0;
--
MST
- [PULL 26/86] tests/acpi: virt: update ACPI MADT and FADT binaries, (continued)
- [PULL 26/86] tests/acpi: virt: update ACPI MADT and FADT binaries, Michael S. Tsirkin, 2022/10/31
- [PULL 31/86] hw/pci-bridge/cxl-upstream: Add a CDAT table access DOE, Michael S. Tsirkin, 2022/10/31
- [PULL 35/86] hw/virtio/virtio-iommu-pci: Enforce the device is plugged on the root bus, Michael S. Tsirkin, 2022/10/31
- [PULL 36/86] virtio: re-order vm_running and use_started checks, Michael S. Tsirkin, 2022/10/31
- [PULL 37/86] virtio: introduce __virtio_queue_reset(), Michael S. Tsirkin, 2022/10/31
- [PULL 38/86] virtio: introduce virtio_queue_reset(), Michael S. Tsirkin, 2022/10/31
- [PULL 28/86] hw/mem/cxl-type3: Add MSIX support, Michael S. Tsirkin, 2022/10/31
- [PULL 34/86] vhost-user: Support vhost_dev_start, Michael S. Tsirkin, 2022/10/31
- [PULL 39/86] virtio: introduce virtio_queue_enable(), Michael S. Tsirkin, 2022/10/31
- [PULL 40/86] virtio: core: vq reset feature negotation support, Michael S. Tsirkin, 2022/10/31
- [PULL 41/86] virtio-pci: support queue reset,
Michael S. Tsirkin <=
- [PULL 42/86] virtio-pci: support queue enable, Michael S. Tsirkin, 2022/10/31
- [PULL 43/86] vhost: expose vhost_virtqueue_start(), Michael S. Tsirkin, 2022/10/31
- [PULL 44/86] vhost: expose vhost_virtqueue_stop(), Michael S. Tsirkin, 2022/10/31
- [PULL 45/86] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_reset(), Michael S. Tsirkin, 2022/10/31
- [PULL 46/86] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_restart(), Michael S. Tsirkin, 2022/10/31
- [PULL 47/86] virtio-net: introduce flush_or_purge_queued_packets(), Michael S. Tsirkin, 2022/10/31
- [PULL 49/86] virtio-net: support queue_enable, Michael S. Tsirkin, 2022/10/31
- [PULL 48/86] virtio-net: support queue reset, Michael S. Tsirkin, 2022/10/31
- [PULL 51/86] virtio-net: enable vq reset feature, Michael S. Tsirkin, 2022/10/31
- [PULL 50/86] vhost: vhost-kernel: enable vq reset feature, Michael S. Tsirkin, 2022/10/31