在 2022/7/18 19:17, Kangjie Xu 写道:
> 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.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> ---
> hw/virtio/virtio-pci.c | 16 ++++++++++++++++
> include/hw/virtio/virtio-pci.h | 1 +
> 2 files changed, 17 insertions(+)
>
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 45327f0b31..35e8a5101a 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -1246,6 +1246,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;
> }
> @@ -1333,6 +1336,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);
> }
> @@ -1355,6 +1359,17 @@ 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);
> +
> + /* mark reset complete */
The code explain itself, so the comment could be removed.
> + proxy->vqs[vdev->queue_sel].reset = 0;
> + proxy->vqs[vdev->queue_sel].enabled = 0;
> + }
> + break;
> default:
> break;
> }
> @@ -1950,6 +1965,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;
> diff --git a/include/hw/virtio/virtio-pci.h b/include/hw/virtio/virtio-pci.h
> index 2446dcd9ae..e9290e2b94 100644
> --- a/include/hw/virtio/virtio-pci.h
> +++ b/include/hw/virtio/virtio-pci.h
> @@ -117,6 +117,7 @@ typedef struct VirtIOPCIRegion {
> typedef struct VirtIOPCIQueue {
> uint16_t num;
> bool enabled;
> + bool reset;
How is this migrated?
Thanks
> uint32_t desc[2];
> uint32_t avail[2];
> uint32_t used[2];