Message ID | a7a06e68bde2cf8c57fbf2c95b095b9f86eb527f.1658141552.git.kangjie.xu@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support VIRTIO_F_RING_RESET for virtio-net and vhost-user in virtio pci | expand |
在 2022/7/18 19:17, Kangjie Xu 写道: > Introduce the interface queue_enable() in VirtioDeviceClass and the > fucntion virtio_queue_enable() in virtio, it can be called when > VIRTIO_PCI_COMMON_Q_ENABLE is written. I'd suggest to split this series into two. 1) queue_enable 2) queue_reset The patch looks good to me. Thanks > > Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com> > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > --- > hw/virtio/virtio-pci.c | 1 + > hw/virtio/virtio.c | 9 +++++++++ > include/hw/virtio/virtio.h | 2 ++ > 3 files changed, 12 insertions(+) > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index 35e8a5101a..85e1840479 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -1335,6 +1335,7 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr, > proxy->vqs[vdev->queue_sel].avail[0], > ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 | > proxy->vqs[vdev->queue_sel].used[0]); > + virtio_queue_enable(vdev, vdev->queue_sel); > proxy->vqs[vdev->queue_sel].enabled = 1; > proxy->vqs[vdev->queue_sel].reset = 0; > } else { > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index 0e9d41366f..82eb9dd4f2 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -2050,6 +2050,15 @@ void virtio_queue_reset(VirtIODevice *vdev, uint32_t queue_index) > __virtio_queue_reset(vdev, queue_index); > } > > +void virtio_queue_enable(VirtIODevice *vdev, uint32_t queue_index) > +{ > + VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); > + > + if (k->queue_enable) { > + k->queue_enable(vdev, queue_index); > + } > +} > + > void virtio_reset(void *opaque) > { > VirtIODevice *vdev = opaque; > diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h > index 879394299b..085997d8f3 100644 > --- a/include/hw/virtio/virtio.h > +++ b/include/hw/virtio/virtio.h > @@ -131,6 +131,7 @@ struct VirtioDeviceClass { > void (*reset)(VirtIODevice *vdev); > void (*set_status)(VirtIODevice *vdev, uint8_t val); > void (*queue_reset)(VirtIODevice *vdev, uint32_t queue_index); > + void (*queue_enable)(VirtIODevice *vdev, uint32_t queue_index); > /* For transitional devices, this is a bitmap of features > * that are only exposed on the legacy interface but not > * the modern one. > @@ -270,6 +271,7 @@ int virtio_queue_set_host_notifier_mr(VirtIODevice *vdev, int n, > int virtio_set_status(VirtIODevice *vdev, uint8_t val); > void virtio_reset(void *opaque); > void virtio_queue_reset(VirtIODevice *vdev, uint32_t queue_index); > +void virtio_queue_enable(VirtIODevice *vdev, uint32_t queue_index); > void virtio_update_irq(VirtIODevice *vdev); > int virtio_set_features(VirtIODevice *vdev, uint64_t val); >
在 2022/7/26 12:17, Jason Wang 写道: > > 在 2022/7/18 19:17, Kangjie Xu 写道: >> Introduce the interface queue_enable() in VirtioDeviceClass and the >> fucntion virtio_queue_enable() in virtio, it can be called when >> VIRTIO_PCI_COMMON_Q_ENABLE is written. > > > I'd suggest to split this series into two. > > 1) queue_enable > > 2) queue_reset > > The patch looks good to me. > > Thanks > Okay, will fix. Thanks > >> >> Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com> >> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> >> --- >> hw/virtio/virtio-pci.c | 1 + >> hw/virtio/virtio.c | 9 +++++++++ >> include/hw/virtio/virtio.h | 2 ++ >> 3 files changed, 12 insertions(+) >> >> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c >> index 35e8a5101a..85e1840479 100644 >> --- a/hw/virtio/virtio-pci.c >> +++ b/hw/virtio/virtio-pci.c >> @@ -1335,6 +1335,7 @@ static void virtio_pci_common_write(void >> *opaque, hwaddr addr, >> proxy->vqs[vdev->queue_sel].avail[0], >> ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 | >> proxy->vqs[vdev->queue_sel].used[0]); >> + virtio_queue_enable(vdev, vdev->queue_sel); >> proxy->vqs[vdev->queue_sel].enabled = 1; >> proxy->vqs[vdev->queue_sel].reset = 0; >> } else { >> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c >> index 0e9d41366f..82eb9dd4f2 100644 >> --- a/hw/virtio/virtio.c >> +++ b/hw/virtio/virtio.c >> @@ -2050,6 +2050,15 @@ void virtio_queue_reset(VirtIODevice *vdev, >> uint32_t queue_index) >> __virtio_queue_reset(vdev, queue_index); >> } >> +void virtio_queue_enable(VirtIODevice *vdev, uint32_t queue_index) >> +{ >> + VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); >> + >> + if (k->queue_enable) { >> + k->queue_enable(vdev, queue_index); >> + } >> +} >> + >> void virtio_reset(void *opaque) >> { >> VirtIODevice *vdev = opaque; >> diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h >> index 879394299b..085997d8f3 100644 >> --- a/include/hw/virtio/virtio.h >> +++ b/include/hw/virtio/virtio.h >> @@ -131,6 +131,7 @@ struct VirtioDeviceClass { >> void (*reset)(VirtIODevice *vdev); >> void (*set_status)(VirtIODevice *vdev, uint8_t val); >> void (*queue_reset)(VirtIODevice *vdev, uint32_t queue_index); >> + void (*queue_enable)(VirtIODevice *vdev, uint32_t queue_index); >> /* For transitional devices, this is a bitmap of features >> * that are only exposed on the legacy interface but not >> * the modern one. >> @@ -270,6 +271,7 @@ int >> virtio_queue_set_host_notifier_mr(VirtIODevice *vdev, int n, >> int virtio_set_status(VirtIODevice *vdev, uint8_t val); >> void virtio_reset(void *opaque); >> void virtio_queue_reset(VirtIODevice *vdev, uint32_t queue_index); >> +void virtio_queue_enable(VirtIODevice *vdev, uint32_t queue_index); >> void virtio_update_irq(VirtIODevice *vdev); >> int virtio_set_features(VirtIODevice *vdev, uint64_t val);
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 35e8a5101a..85e1840479 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1335,6 +1335,7 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr, proxy->vqs[vdev->queue_sel].avail[0], ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 | proxy->vqs[vdev->queue_sel].used[0]); + virtio_queue_enable(vdev, vdev->queue_sel); proxy->vqs[vdev->queue_sel].enabled = 1; proxy->vqs[vdev->queue_sel].reset = 0; } else { diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 0e9d41366f..82eb9dd4f2 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -2050,6 +2050,15 @@ void virtio_queue_reset(VirtIODevice *vdev, uint32_t queue_index) __virtio_queue_reset(vdev, queue_index); } +void virtio_queue_enable(VirtIODevice *vdev, uint32_t queue_index) +{ + VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); + + if (k->queue_enable) { + k->queue_enable(vdev, queue_index); + } +} + void virtio_reset(void *opaque) { VirtIODevice *vdev = opaque; diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 879394299b..085997d8f3 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -131,6 +131,7 @@ struct VirtioDeviceClass { void (*reset)(VirtIODevice *vdev); void (*set_status)(VirtIODevice *vdev, uint8_t val); void (*queue_reset)(VirtIODevice *vdev, uint32_t queue_index); + void (*queue_enable)(VirtIODevice *vdev, uint32_t queue_index); /* For transitional devices, this is a bitmap of features * that are only exposed on the legacy interface but not * the modern one. @@ -270,6 +271,7 @@ int virtio_queue_set_host_notifier_mr(VirtIODevice *vdev, int n, int virtio_set_status(VirtIODevice *vdev, uint8_t val); void virtio_reset(void *opaque); void virtio_queue_reset(VirtIODevice *vdev, uint32_t queue_index); +void virtio_queue_enable(VirtIODevice *vdev, uint32_t queue_index); void virtio_update_irq(VirtIODevice *vdev); int virtio_set_features(VirtIODevice *vdev, uint64_t val);