> On Sep 27, 2023, at 3:27 PM, Stefan Hajnoczi <stefa...@redhat.com> wrote:
>
> vhost-user-scsi has a VirtioDeviceClass->reset() function that calls
> ->vhost_reset_device(). The other vhost devices don't notify the vhost
> device upon reset.
>
> Stateful vhost devices may need to handle device reset in order to free
> resources or prevent stale device state from interfering after reset.
>
> Call ->vhost_device_reset() from virtio_reset() so that that vhost
> devices are notified of device reset.
>
> This patch affects behavior as follows:
> - vhost-kernel: No change in behavior since ->vhost_reset_device() is
> not implemented.
> - vhost-user: back-ends that negotiate
> VHOST_USER_PROTOCOL_F_RESET_DEVICE now receive a
> VHOST_USER_DEVICE_RESET message upon device reset. Otherwise there is
> no change in behavior. DPDK, SPDK, libvhost-user, and the
> vhost-user-backend crate do not negotiate
> VHOST_USER_PROTOCOL_F_RESET_DEVICE automatically.
> - vhost-vdpa: an extra SET_STATUS 0 call is made during device reset.
Reviewed-by: Raphael Norwitz <raphael.norw...@nutanix.com>
>
> Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com>
> ---
> include/hw/virtio/vhost.h | 3 +++
> hw/scsi/vhost-user-scsi.c | 11 -----------
> hw/virtio/vhost.c | 9 +++++++++
> hw/virtio/virtio.c | 4 ++++
> 4 files changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
> index 6a173cb9fa..381fb51966 100644
> --- a/include/hw/virtio/vhost.h
> +++ b/include/hw/virtio/vhost.h
> @@ -338,4 +338,7 @@ int vhost_dev_set_inflight(struct vhost_dev *dev,
> int vhost_dev_get_inflight(struct vhost_dev *dev, uint16_t queue_size,
> struct vhost_inflight *inflight);
> bool vhost_dev_has_iommu(struct vhost_dev *dev);
> +
> +int vhost_reset_device(struct vhost_dev *hdev);
> +
> #endif
> diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c
> index 8582b2e8ab..6917a748bb 100644
> --- a/hw/scsi/vhost-user-scsi.c
> +++ b/hw/scsi/vhost-user-scsi.c
> @@ -66,16 +66,6 @@ static void vhost_user_scsi_set_status(VirtIODevice *vdev,
> uint8_t status)
> }
> }
>
> -static void vhost_user_scsi_reset(VirtIODevice *vdev)
> -{
> - VHostSCSICommon *vsc = VHOST_SCSI_COMMON(vdev);
> - struct vhost_dev *dev = &vsc->dev;
> -
> - if (dev->vhost_ops->vhost_reset_device) {
> - dev->vhost_ops->vhost_reset_device(dev);
> - }
> -}
> -
> static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq)
> {
> }
> @@ -195,7 +185,6 @@ static void vhost_user_scsi_class_init(ObjectClass
> *klass, void *data)
> vdc->get_features = vhost_scsi_common_get_features;
> vdc->set_config = vhost_scsi_common_set_config;
> vdc->set_status = vhost_user_scsi_set_status;
> - vdc->reset = vhost_user_scsi_reset;
> fwc->get_dev_path = vhost_scsi_common_get_fw_dev_path;
> }
>
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index e2f6ffb446..6003e50e83 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -2087,3 +2087,12 @@ int vhost_net_set_backend(struct vhost_dev *hdev,
>
> return -ENOSYS;
> }
> +
> +int vhost_reset_device(struct vhost_dev *hdev)
> +{
> + if (hdev->vhost_ops->vhost_reset_device) {
> + return hdev->vhost_ops->vhost_reset_device(hdev);
> + }
> +
> + return -ENOSYS;
> +}
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index 4577f3f5b3..d863ffd5d6 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -2121,6 +2121,10 @@ void virtio_reset(void *opaque)
> vdev->device_endian = virtio_default_endian();
> }
>
> + if (vdev->vhost_started) {
> + vhost_reset_device(k->get_vhost(vdev));
> + }
> +
> if (k->reset) {
> k->reset(vdev);
> }
> --
> 2.41.0
>