On 08/05/2020 04:57, Jason Wang wrote: > > On 2020/5/7 下午7:49, Laurent Vivier wrote: >> This new command shows internal status of a VirtQueue. >> (vrings and indexes). >> >> Signed-off-by: Laurent Vivier <lviv...@redhat.com> > > > It looks to me that packed virtqueue is not supported. It's better to > add them in the future.
I agree, it's why the series still remains an "RFC". ... >> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c >> index 59bf6ef651a6..57552bf05014 100644 >> --- a/hw/virtio/virtio.c >> +++ b/hw/virtio/virtio.c >> @@ -3877,6 +3877,41 @@ static VirtIODevice *virtio_device_find(const >> char *path) >> return NULL; >> } >> +VirtQueueStatus *qmp_x_debug_virtio_queue_status(const char *path, >> + uint16_t queue, >> Error **errp) >> +{ >> + VirtIODevice *vdev; >> + VirtQueueStatus *status; >> + >> + vdev = virtio_device_find(path); >> + if (vdev == NULL) { >> + error_setg(errp, "Path %s is not a VirtIO device", path); >> + return NULL; >> + } >> + >> + if (queue >= VIRTIO_QUEUE_MAX || !virtio_queue_get_num(vdev, >> queue)) { >> + error_setg(errp, "Invalid virtqueue number %d", queue); >> + return NULL; >> + } >> + >> + status = g_new0(VirtQueueStatus, 1); >> + status->queue_index = vdev->vq[queue].queue_index; >> + status->inuse = vdev->vq[queue].inuse; >> + status->vring_num = vdev->vq[queue].vring.num; >> + status->vring_num_default = vdev->vq[queue].vring.num_default; >> + status->vring_align = vdev->vq[queue].vring.align; >> + status->vring_desc = vdev->vq[queue].vring.desc; >> + status->vring_avail = vdev->vq[queue].vring.avail; >> + status->vring_used = vdev->vq[queue].vring.used; >> + status->last_avail_idx = vdev->vq[queue].last_avail_idx; > > > This might not be correct when vhost is used. > > We may consider to sync last_avail_idx from vhost backends here? Yes, but I don't know how to do that. Where can I find the information? Thanks, Laurent