Loading drivers/char/virtio_console.c +40 −28 Original line number Diff line number Diff line Loading @@ -1271,6 +1271,20 @@ static void remove_port(struct kref *kref) kfree(port); } static void remove_port_data(struct port *port) { struct port_buffer *buf; /* 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); } /* * Port got unplugged. Remove port from portdev's list and drop the * kref reference. If no userspace has this port opened, it will Loading @@ -1278,8 +1292,6 @@ static void remove_port(struct kref *kref) */ static void unplug_port(struct port *port) { struct port_buffer *buf; spin_lock_irq(&port->portdev->ports_lock); list_del(&port->list); spin_unlock_irq(&port->portdev->ports_lock); Loading @@ -1300,14 +1312,7 @@ static void unplug_port(struct port *port) hvc_remove(port->cons.hvc); } /* 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); remove_port_data(port); /* * We should just assume the device itself has gone off -- Loading Loading @@ -1659,6 +1664,28 @@ static const struct file_operations portdev_fops = { .owner = THIS_MODULE, }; static void remove_vqs(struct ports_device *portdev) { portdev->vdev->config->del_vqs(portdev->vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); } static void remove_controlq_data(struct ports_device *portdev) { struct port_buffer *buf; unsigned int len; if (!use_multiport(portdev)) return; while ((buf = virtqueue_get_buf(portdev->c_ivq, &len))) free_buf(buf); while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq))) free_buf(buf); } /* * Once we're further in boot, we get probed like any other virtio * device. Loading Loading @@ -1764,9 +1791,7 @@ static int __devinit virtcons_probe(struct virtio_device *vdev) /* The host might want to notify mgmt sw about device add failure */ __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, VIRTIO_CONSOLE_DEVICE_READY, 0); vdev->config->del_vqs(vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); remove_vqs(portdev); free_chrdev: unregister_chrdev(portdev->chr_major, "virtio-portsdev"); free: Loading Loading @@ -1804,21 +1829,8 @@ static void virtcons_remove(struct virtio_device *vdev) * have to just stop using the port, as the vqs are going * away. */ if (use_multiport(portdev)) { struct port_buffer *buf; unsigned int len; while ((buf = virtqueue_get_buf(portdev->c_ivq, &len))) free_buf(buf); while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq))) free_buf(buf); } vdev->config->del_vqs(vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); remove_controlq_data(portdev); remove_vqs(portdev); kfree(portdev); } Loading Loading
drivers/char/virtio_console.c +40 −28 Original line number Diff line number Diff line Loading @@ -1271,6 +1271,20 @@ static void remove_port(struct kref *kref) kfree(port); } static void remove_port_data(struct port *port) { struct port_buffer *buf; /* 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); } /* * Port got unplugged. Remove port from portdev's list and drop the * kref reference. If no userspace has this port opened, it will Loading @@ -1278,8 +1292,6 @@ static void remove_port(struct kref *kref) */ static void unplug_port(struct port *port) { struct port_buffer *buf; spin_lock_irq(&port->portdev->ports_lock); list_del(&port->list); spin_unlock_irq(&port->portdev->ports_lock); Loading @@ -1300,14 +1312,7 @@ static void unplug_port(struct port *port) hvc_remove(port->cons.hvc); } /* 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); remove_port_data(port); /* * We should just assume the device itself has gone off -- Loading Loading @@ -1659,6 +1664,28 @@ static const struct file_operations portdev_fops = { .owner = THIS_MODULE, }; static void remove_vqs(struct ports_device *portdev) { portdev->vdev->config->del_vqs(portdev->vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); } static void remove_controlq_data(struct ports_device *portdev) { struct port_buffer *buf; unsigned int len; if (!use_multiport(portdev)) return; while ((buf = virtqueue_get_buf(portdev->c_ivq, &len))) free_buf(buf); while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq))) free_buf(buf); } /* * Once we're further in boot, we get probed like any other virtio * device. Loading Loading @@ -1764,9 +1791,7 @@ static int __devinit virtcons_probe(struct virtio_device *vdev) /* The host might want to notify mgmt sw about device add failure */ __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, VIRTIO_CONSOLE_DEVICE_READY, 0); vdev->config->del_vqs(vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); remove_vqs(portdev); free_chrdev: unregister_chrdev(portdev->chr_major, "virtio-portsdev"); free: Loading Loading @@ -1804,21 +1829,8 @@ static void virtcons_remove(struct virtio_device *vdev) * have to just stop using the port, as the vqs are going * away. */ if (use_multiport(portdev)) { struct port_buffer *buf; unsigned int len; while ((buf = virtqueue_get_buf(portdev->c_ivq, &len))) free_buf(buf); while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq))) free_buf(buf); } vdev->config->del_vqs(vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); remove_controlq_data(portdev); remove_vqs(portdev); kfree(portdev); } Loading