Rusty Russell
2010-Mar-30 05:19 UTC
[PATCH 3/4] virtio: console makes incorrect assumption about virtio API
The get_buf() API sets the second arg to the number of bytes *written*
by the other side; in this case it should be zero as these are output buffers.
lguest gets this right (obviously kvm's console doesn't), resulting in
continual buildup of console writes.
Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
To: Amit Shah <amit.shah at redhat.com>
---
drivers/char/virtio_console.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -415,20 +415,16 @@ static ssize_t send_buf(struct port *por
out_vq->vq_ops->kick(out_vq);
if (ret < 0) {
- len = 0;
+ in_count = 0;
goto fail;
}
- /*
- * Wait till the host acknowledges it pushed out the data we
- * sent. Also ensure we return to userspace the number of
- * bytes that were successfully consumed by the host.
- */
+ /* Wait till the host acknowledges it pushed out the data we sent. */
while (!out_vq->vq_ops->get_buf(out_vq, &len))
cpu_relax();
fail:
/* We're expected to return the amount of data we wrote */
- return len;
+ return in_count;
}
/*
Amit Shah
2010-Mar-30 06:30 UTC
[PATCH 3/4] virtio: console makes incorrect assumption about virtio API
On (Tue) Mar 30 2010 [15:49:22], Rusty Russell wrote:> The get_buf() API sets the second arg to the number of bytes *written* > by the other side; in this case it should be zero as these are output buffers. > > lguest gets this right (obviously kvm's console doesn't), resulting in > continual buildup of console writes. > > Signed-off-by: Rusty Russell <rusty at rustcorp.com.au> > To: Amit Shah <amit.shah at redhat.com>Acked-by: Amit Shah <amit.shah at redhat.com>> --- > drivers/char/virtio_console.c | 10 +++------- > 1 file changed, 3 insertions(+), 7 deletions(-) > > diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c > --- a/drivers/char/virtio_console.c > +++ b/drivers/char/virtio_console.c > @@ -415,20 +415,16 @@ static ssize_t send_buf(struct port *por > out_vq->vq_ops->kick(out_vq); > > if (ret < 0) { > - len = 0; > + in_count = 0; > goto fail; > } > > - /* > - * Wait till the host acknowledges it pushed out the data we > - * sent. Also ensure we return to userspace the number of > - * bytes that were successfully consumed by the host. > - */ > + /* Wait till the host acknowledges it pushed out the data we sent. */ > while (!out_vq->vq_ops->get_buf(out_vq, &len)) > cpu_relax(); > fail: > /* We're expected to return the amount of data we wrote */ > - return len; > + return in_count; > } > > /* >Amit -- http://log.amitshah.net/
Apparently Analagous Threads
- [PATCH 3/4] virtio: console makes incorrect assumption about virtio API
- virtio: console: Return -EFAULT on copy_xx_user errors, allow larger writes
- virtio: console: Return -EFAULT on copy_xx_user errors, allow larger writes
- [PATCH 0/6] virtio: virtqueue ops cleanup
- [PATCH 0/6] virtio: virtqueue ops cleanup