| From: "Michael S. Tsirkin" <mst@redhat.com> |
| Date: Fri, 20 Apr 2018 20:51:18 +0300 |
| Subject: virtio_console: move removal code |
| |
| commit aa44ec867030a72e8aa127977e37dec551d8df19 upstream. |
| |
| Will make it reusable for error handling. |
| |
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/char/virtio_console.c | 72 +++++++++++++++++------------------ |
| 1 file changed, 36 insertions(+), 36 deletions(-) |
| |
| --- a/drivers/char/virtio_console.c |
| +++ b/drivers/char/virtio_console.c |
| @@ -1980,6 +1980,42 @@ static void remove_vqs(struct ports_devi |
| kfree(portdev->out_vqs); |
| } |
| |
| +static void virtcons_remove(struct virtio_device *vdev) |
| +{ |
| + struct ports_device *portdev; |
| + struct port *port, *port2; |
| + |
| + portdev = vdev->priv; |
| + |
| + spin_lock_irq(&pdrvdata_lock); |
| + list_del(&portdev->list); |
| + spin_unlock_irq(&pdrvdata_lock); |
| + |
| + /* Disable interrupts for vqs */ |
| + vdev->config->reset(vdev); |
| + /* Finish up work that's lined up */ |
| + if (use_multiport(portdev)) |
| + cancel_work_sync(&portdev->control_work); |
| + else |
| + cancel_work_sync(&portdev->config_work); |
| + |
| + list_for_each_entry_safe(port, port2, &portdev->ports, list) |
| + unplug_port(port); |
| + |
| + unregister_chrdev(portdev->chr_major, "virtio-portsdev"); |
| + |
| + /* |
| + * When yanking out a device, we immediately lose the |
| + * (device-side) queues. So there's no point in keeping the |
| + * guest side around till we drop our final reference. This |
| + * also means that any ports which are in an open state will |
| + * have to just stop using the port, as the vqs are going |
| + * away. |
| + */ |
| + remove_vqs(portdev); |
| + kfree(portdev); |
| +} |
| + |
| /* |
| * Once we're further in boot, we get probed like any other virtio |
| * device. |
| @@ -2097,42 +2133,6 @@ fail: |
| return err; |
| } |
| |
| -static void virtcons_remove(struct virtio_device *vdev) |
| -{ |
| - struct ports_device *portdev; |
| - struct port *port, *port2; |
| - |
| - portdev = vdev->priv; |
| - |
| - spin_lock_irq(&pdrvdata_lock); |
| - list_del(&portdev->list); |
| - spin_unlock_irq(&pdrvdata_lock); |
| - |
| - /* Disable interrupts for vqs */ |
| - vdev->config->reset(vdev); |
| - /* Finish up work that's lined up */ |
| - if (use_multiport(portdev)) |
| - cancel_work_sync(&portdev->control_work); |
| - else |
| - cancel_work_sync(&portdev->config_work); |
| - |
| - list_for_each_entry_safe(port, port2, &portdev->ports, list) |
| - unplug_port(port); |
| - |
| - unregister_chrdev(portdev->chr_major, "virtio-portsdev"); |
| - |
| - /* |
| - * When yanking out a device, we immediately lose the |
| - * (device-side) queues. So there's no point in keeping the |
| - * guest side around till we drop our final reference. This |
| - * also means that any ports which are in an open state will |
| - * have to just stop using the port, as the vqs are going |
| - * away. |
| - */ |
| - remove_vqs(portdev); |
| - kfree(portdev); |
| -} |
| - |
| static struct virtio_device_id id_table[] = { |
| { VIRTIO_ID_CONSOLE, VIRTIO_DEV_ANY_ID }, |
| { 0 }, |