> 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
> 


Reply via email to