Commit d9679d00 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin
Browse files

virtio: wrap config->reset calls



This will enable cleanups down the road.
The idea is to disable cbs, then add "flush_queued_cbs" callback
as a parameter, this way drivers can flush any work
queued after callbacks have been disabled.

Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Link: https://lore.kernel.org/r/20211013105226.20225-1-mst@redhat.com


Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent c9e6606c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -616,7 +616,7 @@ static void um_pci_virtio_remove(struct virtio_device *vdev)
	int i;

        /* Stop all virtqueues */
        vdev->config->reset(vdev);
        virtio_reset_device(vdev);
        vdev->config->del_vqs(vdev);

	device_set_wakeup_enable(&vdev->dev, false);
+2 −2
Original line number Diff line number Diff line
@@ -977,7 +977,7 @@ static void virtblk_remove(struct virtio_device *vdev)
	mutex_lock(&vblk->vdev_mutex);

	/* Stop all the virtqueues. */
	vdev->config->reset(vdev);
	virtio_reset_device(vdev);

	/* Virtqueues are stopped, nothing can use vblk->vdev anymore. */
	vblk->vdev = NULL;
@@ -996,7 +996,7 @@ static int virtblk_freeze(struct virtio_device *vdev)
	struct virtio_blk *vblk = vdev->priv;

	/* Ensure we don't receive any more interrupts */
	vdev->config->reset(vdev);
	virtio_reset_device(vdev);

	/* Make sure no work handler is accessing the device. */
	flush_work(&vblk->config_work);
+1 −1
Original line number Diff line number Diff line
@@ -364,7 +364,7 @@ static void virtbt_remove(struct virtio_device *vdev)
	struct hci_dev *hdev = vbt->hdev;

	hci_unregister_dev(hdev);
	vdev->config->reset(vdev);
	virtio_reset_device(vdev);

	hci_free_dev(hdev);
	vbt->hdev = NULL;
+1 −1
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ static void remove_common(struct virtio_device *vdev)
	vi->data_avail = 0;
	vi->data_idx = 0;
	complete(&vi->have_data);
	vdev->config->reset(vdev);
	virtio_reset_device(vdev);
	if (vi->hwrng_register_done)
		hwrng_unregister(&vi->hwrng);
	vdev->config->del_vqs(vdev);
+2 −2
Original line number Diff line number Diff line
@@ -1958,7 +1958,7 @@ static void virtcons_remove(struct virtio_device *vdev)
	spin_unlock_irq(&pdrvdata_lock);

	/* Disable interrupts for vqs */
	vdev->config->reset(vdev);
	virtio_reset_device(vdev);
	/* Finish up work that's lined up */
	if (use_multiport(portdev))
		cancel_work_sync(&portdev->control_work);
@@ -2148,7 +2148,7 @@ static int virtcons_freeze(struct virtio_device *vdev)

	portdev = vdev->priv;

	vdev->config->reset(vdev);
	virtio_reset_device(vdev);

	if (use_multiport(portdev))
		virtqueue_disable_cb(portdev->c_ivq);
Loading