Messages in this thread | | | Date | Mon, 17 Jan 2022 14:40:11 +0800 | Subject | Re: [PATCH] virtio_mem: break device on remove | From | Jason Wang <> |
| |
在 2022/1/15 上午5:43, Michael S. Tsirkin 写道: > A common pattern for device reset is currently: > vdev->config->reset(vdev); > .. cleanup .. > > reset prevents new interrupts from arriving and waits for interrupt > handlers to finish. > > However if - as is common - the handler queues a work request which is > flushed during the cleanup stage, we have code adding buffers / trying > to get buffers while device is reset. Not good. > > This was reproduced by running > modprobe virtio_console > modprobe -r virtio_console > in a loop, and this reasoning seems to apply to virtio mem though > I could not reproduce it there. > > Fix this up by calling virtio_break_device + flush before reset. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > --- > drivers/virtio/virtio_mem.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/virtio/virtio_mem.c b/drivers/virtio/virtio_mem.c > index 38becd8d578c..33b8a118a3ae 100644 > --- a/drivers/virtio/virtio_mem.c > +++ b/drivers/virtio/virtio_mem.c > @@ -2888,6 +2888,8 @@ static void virtio_mem_remove(struct virtio_device *vdev) > virtio_mem_deinit_hotplug(vm); > > /* reset the device and cleanup the queues */ > + virtio_break_device(vdev); > + flush_work(&vm->wq);
We set vm->removing to true and call cancel_work_sync() in virtio_mem_deinit_hotplug(). Isn't is sufficient?
Thanks
> virtio_reset_device(vdev); > vdev->config->del_vqs(vdev); >
| |