Loading drivers/char/virtio_console.c +36 −36 Original line number Diff line number Diff line Loading @@ -1988,6 +1988,42 @@ static void remove_vqs(struct ports_device *portdev) 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. Loading Loading @@ -2116,42 +2152,6 @@ static int virtcons_probe(struct virtio_device *vdev) 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 }, Loading Loading
drivers/char/virtio_console.c +36 −36 Original line number Diff line number Diff line Loading @@ -1988,6 +1988,42 @@ static void remove_vqs(struct ports_device *portdev) 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. Loading Loading @@ -2116,42 +2152,6 @@ static int virtcons_probe(struct virtio_device *vdev) 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 }, Loading