diff options
author | Amit Shah <amit.shah@redhat.com> | 2011-09-14 13:06:43 +0530 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2011-11-02 11:41:00 +1030 |
commit | d25a9ddae93ca97aa03fdab1363baf0e0c35d960 (patch) | |
tree | fea9bd4041716248fdfd8db78bab715f1d907670 /drivers/char | |
parent | defde66996476295dc7b1b60ea318965f8c3ad86 (diff) | |
download | op-kernel-dev-d25a9ddae93ca97aa03fdab1363baf0e0c35d960.zip op-kernel-dev-d25a9ddae93ca97aa03fdab1363baf0e0c35d960.tar.gz |
virtio: console: make get_inbuf() return port->inbuf if present
Instead of pulling in a buffer from the vq each time it's called,
get_inbuf() now checks if the current active buffer, in port->inbuf is
valid. If it is, just returns a pointer to it. This ends up
simplifying a lot of code calling get_inbuf() since the check for
port->inbuf being valid was done by all the callers.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/virtio_console.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 3516aeb..cb5edf3 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -351,11 +351,12 @@ fail: static struct port_buffer *get_inbuf(struct port *port) { struct port_buffer *buf; - struct virtqueue *vq; unsigned int len; - vq = port->in_vq; - buf = virtqueue_get_buf(vq, &len); + if (port->inbuf) + return port->inbuf; + + buf = virtqueue_get_buf(port->in_vq, &len); if (buf) { buf->len = len; buf->offset = 0; @@ -418,18 +419,12 @@ static bool port_has_data(struct port *port) unsigned long flags; bool ret; + ret = false; spin_lock_irqsave(&port->inbuf_lock, flags); - if (port->inbuf) { - ret = true; - goto out; - } port->inbuf = get_inbuf(port); - if (port->inbuf) { + if (port->inbuf) ret = true; - goto out; - } - ret = false; -out: + spin_unlock_irqrestore(&port->inbuf_lock, flags); return ret; } @@ -1489,8 +1484,7 @@ static void in_intr(struct virtqueue *vq) return; spin_lock_irqsave(&port->inbuf_lock, flags); - if (!port->inbuf) - port->inbuf = get_inbuf(port); + port->inbuf = get_inbuf(port); /* * Don't queue up data when port is closed. This condition |