virtio: console: Disable callbacks for virtqueues at start of S4 freeze
authorAmit Shah <amit.shah@redhat.com>
Fri, 6 Jan 2012 10:49:08 +0000 (16:19 +0530)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 12 Jan 2012 05:14:45 +0000 (15:44 +1030)
To ensure we don't receive any more interrupts from the host after we
enter the freeze function, disable all vq interrupts.

There wasn't any problem seen due to this in tests, but applying this
patch makes the freeze case more robust.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
drivers/char/virtio_console.c

index 614b84d38d7a1b408cbbeba01e5b1da17cdd402e..b58b5618706588936ebcf7a028bde7dba8f616c1 100644 (file)
@@ -1854,10 +1854,18 @@ static int virtcons_freeze(struct virtio_device *vdev)
 
        vdev->config->reset(vdev);
 
+       virtqueue_disable_cb(portdev->c_ivq);
        cancel_work_sync(&portdev->control_work);
+       /*
+        * Once more: if control_work_handler() was running, it would
+        * enable the cb as the last step.
+        */
+       virtqueue_disable_cb(portdev->c_ivq);
        remove_controlq_data(portdev);
 
        list_for_each_entry(port, &portdev->ports, list) {
+               virtqueue_disable_cb(port->in_vq);
+               virtqueue_disable_cb(port->out_vq);
                /*
                 * We'll ask the host later if the new invocation has
                 * the port opened or closed.