virtio: console: add locks around buffer removal in port unplug path
authorAmit Shah <amit.shah@redhat.com>
Mon, 29 Jul 2013 04:53:46 +0000 (14:23 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 29 Jul 2013 05:20:47 +0000 (14:50 +0930)
The removal functions act on the vqs, and the vq operations need to be
locked.

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

index 1b456fe9b87a12f98e8a6d691487c252271cb3e6..601962b1708b8367c244cc7728651bcf788590ed 100644 (file)
@@ -1513,18 +1513,22 @@ static void remove_port_data(struct port *port)
 {
        struct port_buffer *buf;
 
+       spin_lock_irq(&port->inbuf_lock);
        /* Remove unused data this port might have received. */
        discard_port_data(port);
 
-       reclaim_consumed_buffers(port);
-
        /* Remove buffers we queued up for the Host to send us data in. */
        while ((buf = virtqueue_detach_unused_buf(port->in_vq)))
                free_buf(buf, true);
+       spin_unlock_irq(&port->inbuf_lock);
+
+       spin_lock_irq(&port->outvq_lock);
+       reclaim_consumed_buffers(port);
 
        /* Free pending buffers from the out-queue. */
        while ((buf = virtqueue_detach_unused_buf(port->out_vq)))
                free_buf(buf, true);
+       spin_unlock_irq(&port->outvq_lock);
 }
 
 /*