Skip to content

Commit

Permalink
virtio: console: Move vq and vq buf removal into separate functions
Browse files Browse the repository at this point in the history
This common code will be shared with the PM freeze function.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
  • Loading branch information
Amit Shah authored and Rusty Russell committed Jan 12, 2012
1 parent f0fe6f1 commit a0e2dbf
Showing 1 changed file with 40 additions and 28 deletions.
68 changes: 40 additions & 28 deletions drivers/char/virtio_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -1271,15 +1271,27 @@ 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
* result in immediate removal the port.
*/
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);
Expand All @@ -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 --
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit a0e2dbf

Please sign in to comment.