Michael S. Tsirkin
2018-Apr-20 18:18 UTC
[PATCH 0/6] virtio-console: spec compliance fixes
Turns out virtio console tries to take a buffer out of an active vq. Works by sheer luck, and is explicitly forbidden by spec. And while going over it I saw that error handling is also broken - failure is easy to trigger if I force allocations to fail. Lightly tested. Michael S. Tsirkin (6): virtio_console: don't tie bufs to a vq virtio: add ability to iterate over vqs virtio_console: free buffers after reset virtio_console: drop custom control queue cleanup virtio_console: move removal code virtio_console: reset on out of memory drivers/char/virtio_console.c | 155 ++++++++++++++++++++---------------------- include/linux/virtio.h | 3 + 2 files changed, 75 insertions(+), 83 deletions(-) -- MST
Michael S. Tsirkin
2018-Apr-20 18:18 UTC
[PATCH 1/6] virtio_console: don't tie bufs to a vq
an allocated buffer doesn't need to be tied to a vq - only vq->vdev is ever used. Pass the function the just what it needs - the vdev. Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- drivers/char/virtio_console.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 468f061..3e56f32 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -422,7 +422,7 @@ static void reclaim_dma_bufs(void) } } -static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size, +static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size, int pages) { struct port_buffer *buf; @@ -445,16 +445,16 @@ static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size, return buf; } - if (is_rproc_serial(vq->vdev)) { + if (is_rproc_serial(vdev)) { /* * Allocate DMA memory from ancestor. When a virtio * device is created by remoteproc, the DMA memory is * associated with the grandparent device: * vdev => rproc => platform-dev. */ - if (!vq->vdev->dev.parent || !vq->vdev->dev.parent->parent) + if (!vdev->dev.parent || !vdev->dev.parent->parent) goto free_buf; - buf->dev = vq->vdev->dev.parent->parent; + buf->dev = vdev->dev.parent->parent; /* Increase device refcnt to avoid freeing it */ get_device(buf->dev); @@ -838,7 +838,7 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf, count = min((size_t)(32 * 1024), count); - buf = alloc_buf(port->out_vq, count, 0); + buf = alloc_buf(port->portdev->vdev, count, 0); if (!buf) return -ENOMEM; @@ -957,7 +957,7 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe, if (ret < 0) goto error_out; - buf = alloc_buf(port->out_vq, 0, pipe->nrbufs); + buf = alloc_buf(port->portdev->vdev, 0, pipe->nrbufs); if (!buf) { ret = -ENOMEM; goto error_out; @@ -1374,7 +1374,7 @@ static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock) nr_added_bufs = 0; do { - buf = alloc_buf(vq, PAGE_SIZE, 0); + buf = alloc_buf(vq->vdev, PAGE_SIZE, 0); if (!buf) break; -- MST
Michael S. Tsirkin
2018-Apr-20 18:18 UTC
[PATCH 3/6] virtio_console: free buffers after reset
Console driver is out of spec. The spec says: A driver MUST NOT decrement the available idx on a live virtqueue (ie. there is no way to ?unexpose? buffers). and it does exactly that by trying to detach unused buffers without doing a device reset first. Defer detaching the buffers until device unplug. Of course this means we might get an interrupt for a vq without an attached port now. Handle that by discarding the consumed buffer. Reported-by: Tiwei Bie <tiwei.bie at intel.com> Fixes: b3258ff1d6 ("virtio: Decrement avail idx on buffer detach") CC: stable at kernel.org Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- drivers/char/virtio_console.c | 49 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 3e56f32..26a66ff 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1402,7 +1402,6 @@ static int add_port(struct ports_device *portdev, u32 id) { char debugfs_name[16]; struct port *port; - struct port_buffer *buf; dev_t devt; unsigned int nr_added_bufs; int err; @@ -1513,8 +1512,6 @@ static int add_port(struct ports_device *portdev, u32 id) return 0; free_inbufs: - while ((buf = virtqueue_detach_unused_buf(port->in_vq))) - free_buf(buf, true); free_device: device_destroy(pdrvdata.class, port->dev->devt); free_cdev: @@ -1539,34 +1536,14 @@ static void remove_port(struct kref *kref) static void remove_port_data(struct port *port) { - struct port_buffer *buf; - spin_lock_irq(&port->inbuf_lock); /* Remove unused data this port might have received. */ discard_port_data(port); spin_unlock_irq(&port->inbuf_lock); - /* Remove buffers we queued up for the Host to send us data in. */ - do { - spin_lock_irq(&port->inbuf_lock); - buf = virtqueue_detach_unused_buf(port->in_vq); - spin_unlock_irq(&port->inbuf_lock); - if (buf) - free_buf(buf, true); - } while (buf); - spin_lock_irq(&port->outvq_lock); reclaim_consumed_buffers(port); spin_unlock_irq(&port->outvq_lock); - - /* Free pending buffers from the out-queue. */ - do { - spin_lock_irq(&port->outvq_lock); - buf = virtqueue_detach_unused_buf(port->out_vq); - spin_unlock_irq(&port->outvq_lock); - if (buf) - free_buf(buf, true); - } while (buf); } /* @@ -1791,13 +1768,24 @@ static void control_work_handler(struct work_struct *work) spin_unlock(&portdev->c_ivq_lock); } +static void flush_bufs(struct virtqueue *vq, bool can_sleep) +{ + struct port_buffer *buf; + unsigned int len; + + while ((buf = virtqueue_get_buf(vq, &len))) + free_buf(buf, can_sleep); +} + static void out_intr(struct virtqueue *vq) { struct port *port; port = find_port_by_vq(vq->vdev->priv, vq); - if (!port) + if (!port) { + flush_bufs(vq, false); return; + } wake_up_interruptible(&port->waitqueue); } @@ -1808,8 +1796,10 @@ static void in_intr(struct virtqueue *vq) unsigned long flags; port = find_port_by_vq(vq->vdev->priv, vq); - if (!port) + if (!port) { + flush_bufs(vq, false); return; + } spin_lock_irqsave(&port->inbuf_lock, flags); port->inbuf = get_inbuf(port); @@ -1984,6 +1974,15 @@ static const struct file_operations portdev_fops = { static void remove_vqs(struct ports_device *portdev) { + struct virtqueue *vq; + + virtio_device_for_each_vq(portdev->vdev, vq) { + struct port_buffer *buf; + + flush_bufs(vq, true); + while ((buf = virtqueue_detach_unused_buf(vq))) + free_buf(buf, true); + } portdev->vdev->config->del_vqs(portdev->vdev); kfree(portdev->in_vqs); kfree(portdev->out_vqs); -- MST
Michael S. Tsirkin
2018-Apr-20 18:18 UTC
[PATCH 2/6] virtio: add ability to iterate over vqs
For cleanup it's helpful to be able to simply scan all vqs and discard all data. Add an iterator to do that. Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- include/linux/virtio.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/linux/virtio.h b/include/linux/virtio.h index 988c735..fa1b5da 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h @@ -157,6 +157,9 @@ int virtio_device_freeze(struct virtio_device *dev); int virtio_device_restore(struct virtio_device *dev); #endif +#define virtio_device_for_each_vq(vdev, vq) \ + list_for_each_entry(vq, &vdev->vqs, list) + /** * virtio_driver - operations for a virtio I/O driver * @driver: underlying device driver (populate name and owner). -- MST
Michael S. Tsirkin
2018-Apr-20 18:18 UTC
[PATCH 4/6] virtio_console: drop custom control queue cleanup
We now cleanup all VQs on device removal - no need to handle the control VQ specially. Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- drivers/char/virtio_console.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 26a66ff..2d87ce5 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1988,21 +1988,6 @@ static void remove_vqs(struct ports_device *portdev) 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, true); - - while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq))) - free_buf(buf, true); -} - /* * Once we're further in boot, we get probed like any other virtio * device. @@ -2163,7 +2148,6 @@ static void virtcons_remove(struct virtio_device *vdev) * have to just stop using the port, as the vqs are going * away. */ - remove_controlq_data(portdev); remove_vqs(portdev); kfree(portdev); } @@ -2208,7 +2192,6 @@ static int virtcons_freeze(struct virtio_device *vdev) */ if (use_multiport(portdev)) virtqueue_disable_cb(portdev->c_ivq); - remove_controlq_data(portdev); list_for_each_entry(port, &portdev->ports, list) { virtqueue_disable_cb(port->in_vq); -- MST
Will make it reusable for error handling. Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- drivers/char/virtio_console.c | 72 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 2d87ce5..e8480fe 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -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. @@ -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 }, -- MST
Michael S. Tsirkin
2018-Apr-20 18:18 UTC
[PATCH 6/6] virtio_console: reset on out of memory
When out of memory and we can't add ctrl vq buffers, probe fails. Unfortunately the error handling is out of spec: it calls del_vqs without bothering to reset the device first. To fix, call the full cleanup function in this case. Cc: stable at vger.kernel.org Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- drivers/char/virtio_console.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index e8480fe..2108551 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -2090,6 +2090,7 @@ static int virtcons_probe(struct virtio_device *vdev) spin_lock_init(&portdev->ports_lock); INIT_LIST_HEAD(&portdev->ports); + INIT_LIST_HEAD(&portdev->list); virtio_device_ready(portdev->vdev); @@ -2107,8 +2108,15 @@ static int virtcons_probe(struct virtio_device *vdev) if (!nr_added_bufs) { dev_err(&vdev->dev, "Error allocating buffers for control queue\n"); - err = -ENOMEM; - goto free_vqs; + /* + * 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); + /* Device was functional: we need full cleanup. */ + virtcons_remove(vdev); + return -ENOMEM; } } else { /* @@ -2139,11 +2147,6 @@ static int virtcons_probe(struct virtio_device *vdev) return 0; -free_vqs: - /* 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); - remove_vqs(portdev); free_chrdev: unregister_chrdev(portdev->chr_major, "virtio-portsdev"); free: -- MST
Greg Kroah-Hartman
2018-Apr-21 07:30 UTC
[PATCH 1/6] virtio_console: don't tie bufs to a vq
On Fri, Apr 20, 2018 at 09:18:01PM +0300, Michael S. Tsirkin wrote:> an allocated buffer doesn't need to be tied to a vq - > only vq->vdev is ever used. Pass the function the > just what it needs - the vdev. > > Signed-off-by: Michael S. Tsirkin <mst at redhat.com> > --- > drivers/char/virtio_console.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c > index 468f061..3e56f32 100644 > --- a/drivers/char/virtio_console.c > +++ b/drivers/char/virtio_console.c > @@ -422,7 +422,7 @@ static void reclaim_dma_bufs(void) > } > } > > -static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size, > +static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size, > int pages) > { > struct port_buffer *buf; > @@ -445,16 +445,16 @@ static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size, > return buf; > } > > - if (is_rproc_serial(vq->vdev)) { > + if (is_rproc_serial(vdev)) { > /* > * Allocate DMA memory from ancestor. When a virtio > * device is created by remoteproc, the DMA memory is > * associated with the grandparent device: > * vdev => rproc => platform-dev. > */ > - if (!vq->vdev->dev.parent || !vq->vdev->dev.parent->parent) > + if (!vdev->dev.parent || !vdev->dev.parent->parent) > goto free_buf; > - buf->dev = vq->vdev->dev.parent->parent; > + buf->dev = vdev->dev.parent->parent; > > /* Increase device refcnt to avoid freeing it */ > get_device(buf->dev); > @@ -838,7 +838,7 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf, > > count = min((size_t)(32 * 1024), count); > > - buf = alloc_buf(port->out_vq, count, 0); > + buf = alloc_buf(port->portdev->vdev, count, 0); > if (!buf) > return -ENOMEM; > > @@ -957,7 +957,7 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe, > if (ret < 0) > goto error_out; > > - buf = alloc_buf(port->out_vq, 0, pipe->nrbufs); > + buf = alloc_buf(port->portdev->vdev, 0, pipe->nrbufs); > if (!buf) { > ret = -ENOMEM; > goto error_out; > @@ -1374,7 +1374,7 @@ static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock) > > nr_added_bufs = 0; > do { > - buf = alloc_buf(vq, PAGE_SIZE, 0); > + buf = alloc_buf(vq->vdev, PAGE_SIZE, 0); > if (!buf) > break; > > -- > MST<formletter> This is not the correct way to submit patches for inclusion in the stable kernel tree. Please read: https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html for how to do this properly. </formletter>
On 2018?04?21? 02:18, Michael S. Tsirkin wrote:> Console driver is out of spec. The spec says: > A driver MUST NOT decrement the available idx on a live > virtqueue (ie. there is no way to ?unexpose? buffers). > and it does exactly that by trying to detach unused buffers > without doing a device reset first. > > Defer detaching the buffers until device unplug. > > Of course this means we might get an interrupt for > a vq without an attached port now. Handle that by > discarding the consumed buffer. > > Reported-by: Tiwei Bie <tiwei.bie at intel.com> > Fixes: b3258ff1d6 ("virtio: Decrement avail idx on buffer detach") > CC: stable at kernel.org > Signed-off-by: Michael S. Tsirkin <mst at redhat.com>I wonder whether or not we can have some BUG_ON() in virtqueue_detach_unused_buf() to detect such bugs (e.g by checking status?). Thanks> --- > drivers/char/virtio_console.c | 49 +++++++++++++++++++++---------------------- > 1 file changed, 24 insertions(+), 25 deletions(-) > > diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c > index 3e56f32..26a66ff 100644 > --- a/drivers/char/virtio_console.c > +++ b/drivers/char/virtio_console.c > @@ -1402,7 +1402,6 @@ static int add_port(struct ports_device *portdev, u32 id) > { > char debugfs_name[16]; > struct port *port; > - struct port_buffer *buf; > dev_t devt; > unsigned int nr_added_bufs; > int err; > @@ -1513,8 +1512,6 @@ static int add_port(struct ports_device *portdev, u32 id) > return 0; > > free_inbufs: > - while ((buf = virtqueue_detach_unused_buf(port->in_vq))) > - free_buf(buf, true); > free_device: > device_destroy(pdrvdata.class, port->dev->devt); > free_cdev: > @@ -1539,34 +1536,14 @@ static void remove_port(struct kref *kref) > > static void remove_port_data(struct port *port) > { > - struct port_buffer *buf; > - > spin_lock_irq(&port->inbuf_lock); > /* Remove unused data this port might have received. */ > discard_port_data(port); > spin_unlock_irq(&port->inbuf_lock); > > - /* Remove buffers we queued up for the Host to send us data in. */ > - do { > - spin_lock_irq(&port->inbuf_lock); > - buf = virtqueue_detach_unused_buf(port->in_vq); > - spin_unlock_irq(&port->inbuf_lock); > - if (buf) > - free_buf(buf, true); > - } while (buf); > - > spin_lock_irq(&port->outvq_lock); > reclaim_consumed_buffers(port); > spin_unlock_irq(&port->outvq_lock); > - > - /* Free pending buffers from the out-queue. */ > - do { > - spin_lock_irq(&port->outvq_lock); > - buf = virtqueue_detach_unused_buf(port->out_vq); > - spin_unlock_irq(&port->outvq_lock); > - if (buf) > - free_buf(buf, true); > - } while (buf); > } > > /* > @@ -1791,13 +1768,24 @@ static void control_work_handler(struct work_struct *work) > spin_unlock(&portdev->c_ivq_lock); > } > > +static void flush_bufs(struct virtqueue *vq, bool can_sleep) > +{ > + struct port_buffer *buf; > + unsigned int len; > + > + while ((buf = virtqueue_get_buf(vq, &len))) > + free_buf(buf, can_sleep); > +} > + > static void out_intr(struct virtqueue *vq) > { > struct port *port; > > port = find_port_by_vq(vq->vdev->priv, vq); > - if (!port) > + if (!port) { > + flush_bufs(vq, false); > return; > + } > > wake_up_interruptible(&port->waitqueue); > } > @@ -1808,8 +1796,10 @@ static void in_intr(struct virtqueue *vq) > unsigned long flags; > > port = find_port_by_vq(vq->vdev->priv, vq); > - if (!port) > + if (!port) { > + flush_bufs(vq, false); > return; > + } > > spin_lock_irqsave(&port->inbuf_lock, flags); > port->inbuf = get_inbuf(port); > @@ -1984,6 +1974,15 @@ static const struct file_operations portdev_fops = { > > static void remove_vqs(struct ports_device *portdev) > { > + struct virtqueue *vq; > + > + virtio_device_for_each_vq(portdev->vdev, vq) { > + struct port_buffer *buf; > + > + flush_bufs(vq, true); > + while ((buf = virtqueue_detach_unused_buf(vq))) > + free_buf(buf, true); > + } > portdev->vdev->config->del_vqs(portdev->vdev); > kfree(portdev->in_vqs); > kfree(portdev->out_vqs);
Michael S. Tsirkin
2018-Apr-24 18:41 UTC
[PATCH 0/6] virtio-console: spec compliance fixes
On Fri, Apr 20, 2018 at 09:17:59PM +0300, Michael S. Tsirkin wrote:> Turns out virtio console tries to take a buffer out of an active vq. > Works by sheer luck, and is explicitly forbidden by spec. And while > going over it I saw that error handling is also broken - > failure is easy to trigger if I force allocations to fail. > > Lightly tested.Amit - any feedback before I push these patches?> Michael S. Tsirkin (6): > virtio_console: don't tie bufs to a vq > virtio: add ability to iterate over vqs > virtio_console: free buffers after reset > virtio_console: drop custom control queue cleanup > virtio_console: move removal code > virtio_console: reset on out of memory > > drivers/char/virtio_console.c | 155 ++++++++++++++++++++---------------------- > include/linux/virtio.h | 3 + > 2 files changed, 75 insertions(+), 83 deletions(-) > > -- > MST >
On (Tue) 24 Apr 2018 [21:41:29], Michael S. Tsirkin wrote:> On Fri, Apr 20, 2018 at 09:17:59PM +0300, Michael S. Tsirkin wrote: > > Turns out virtio console tries to take a buffer out of an active vq. > > Works by sheer luck, and is explicitly forbidden by spec. And while > > going over it I saw that error handling is also broken - > > failure is easy to trigger if I force allocations to fail. > > > > Lightly tested. > > Amit - any feedback before I push these patches?The changes look good spec-wise. There are a bunch of tests in avocado-vt that test virtio-console functionality. Can you give those a try before pushing? Amit -- http://amitshah.net/
Michael S. Tsirkin
2018-May-03 19:28 UTC
[PATCH 0/6] virtio-console: spec compliance fixes
On Thu, May 03, 2018 at 05:45:29AM +0200, Amit Shah wrote:> (apologies if you received a dup) > > On (Tue) 24 Apr 2018 [21:41:29], Michael S. Tsirkin wrote: > > On Fri, Apr 20, 2018 at 09:17:59PM +0300, Michael S. Tsirkin wrote: > > > Turns out virtio console tries to take a buffer out of an active vq. > > > Works by sheer luck, and is explicitly forbidden by spec. And while > > > going over it I saw that error handling is also broken - > > > failure is easy to trigger if I force allocations to fail. > > > > > > Lightly tested. > > > > Amit - any feedback before I push these patches? > > The changes look good spec-wise. > > There are a bunch of tests in avocado-vt that test virtio-console > functionality. Can you give those a try before pushing? > > AmitI pushed before I did that test, will try to find the time later. BTW do you still want to be on the maintainers list?> -- > http://amitshah.net/
On (Thu) 03 May 2018 [22:28:32], Michael S. Tsirkin wrote:> On Thu, May 03, 2018 at 05:45:29AM +0200, Amit Shah wrote: > > (apologies if you received a dup) > > > > On (Tue) 24 Apr 2018 [21:41:29], Michael S. Tsirkin wrote: > > > On Fri, Apr 20, 2018 at 09:17:59PM +0300, Michael S. Tsirkin wrote: > > > > Turns out virtio console tries to take a buffer out of an active vq. > > > > Works by sheer luck, and is explicitly forbidden by spec. And while > > > > going over it I saw that error handling is also broken - > > > > failure is easy to trigger if I force allocations to fail. > > > > > > > > Lightly tested. > > > > > > Amit - any feedback before I push these patches? > > > > The changes look good spec-wise. > > > > There are a bunch of tests in avocado-vt that test virtio-console > > functionality. Can you give those a try before pushing? > > > > Amit > > I pushed before I did that test, will try to find the time later. BTW > do you still want to be on the maintainers list?Yes, I want to be on the maintainers list; but won't mind co-maintainers. The recent changes seem to be spec-related, and I'd expect you to have a good handle on that anyway. Amit -- http://amitshah.net/
Michael S. Tsirkin
2018-May-06 19:52 UTC
[PATCH 0/6] virtio-console: spec compliance fixes
On Sun, May 06, 2018 at 08:24:30PM +0200, Amit Shah wrote:> On (Thu) 03 May 2018 [22:28:32], Michael S. Tsirkin wrote: > > On Thu, May 03, 2018 at 05:45:29AM +0200, Amit Shah wrote: > > > (apologies if you received a dup) > > > > > > On (Tue) 24 Apr 2018 [21:41:29], Michael S. Tsirkin wrote: > > > > On Fri, Apr 20, 2018 at 09:17:59PM +0300, Michael S. Tsirkin wrote: > > > > > Turns out virtio console tries to take a buffer out of an active vq. > > > > > Works by sheer luck, and is explicitly forbidden by spec. And while > > > > > going over it I saw that error handling is also broken - > > > > > failure is easy to trigger if I force allocations to fail. > > > > > > > > > > Lightly tested. > > > > > > > > Amit - any feedback before I push these patches? > > > > > > The changes look good spec-wise. > > > > > > There are a bunch of tests in avocado-vt that test virtio-console > > > functionality. Can you give those a try before pushing? > > > > > > Amit > > > > I pushed before I did that test, will try to find the time later. BTW > > do you still want to be on the maintainers list? > > Yes, I want to be on the maintainers list; but won't mind > co-maintainers. The recent changes seem to be spec-related, and I'd > expect you to have a good handle on that anyway. > > AmitIf you can do extra testing that would be appreciated though.> -- > http://amitshah.net/
Reasonably Related Threads
- [PATCH 0/6] virtio-console: spec compliance fixes
- [PATCH 0/6] virtio-console: spec compliance fixes
- [PATCH 0/6] virtio-console: spec compliance fixes
- [PATCH 0/6] virtio-console: spec compliance fixes
- [PATCH RFC] virtio_pci: fix virtio spec compliance on restore