Skip to content

Commit d9bc9e8

Browse files
author
Herton R. Krzesinski
committed
Merge: virtio_console: break out of buf poll on remove
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/2064 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1786239 Upstream Status: All mainline 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. Fix this up by calling virtio_break_device + flush before reset. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1786239 Signed-off-by: Michael S. Tsirkin <mst@redhat.com> (cherry picked from commit 0e7174b) Signed-off-by: Cindy Lu <lulu@redhat.com> Approved-by: Eugenio Pérez <eperezma@redhat.com> Approved-by: Laurent Vivier <lvivier@redhat.com> Approved-by: Jason Wang <jasowang@redhat.com> Approved-by: MST <mst@redhat.com> Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
2 parents ddf001f + 30ff2ab commit d9bc9e8

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

drivers/char/virtio_console.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1952,6 +1952,13 @@ static void virtcons_remove(struct virtio_device *vdev)
19521952
list_del(&portdev->list);
19531953
spin_unlock_irq(&pdrvdata_lock);
19541954

1955+
/* Device is going away, exit any polling for buffers */
1956+
virtio_break_device(vdev);
1957+
if (use_multiport(portdev))
1958+
flush_work(&portdev->control_work);
1959+
else
1960+
flush_work(&portdev->config_work);
1961+
19551962
/* Disable interrupts for vqs */
19561963
virtio_reset_device(vdev);
19571964
/* Finish up work that's lined up */

0 commit comments

Comments
 (0)