virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read
@ 2010-09-16  9:13 Amit Shah
  2010-09-16  9:13 ` [PATCH 2/2] virtio: console: Disable lseek(2) for port file operations Amit Shah
  2010-09-20  2:49 ` [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Rusty Russell
  0 siblings, 2 replies; 4+ messages in thread
From: Amit Shah @ 2010-09-16  9:13 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Amit Shah, Hans de Goede, Virtualization List

From: Hans de Goede <hdegoede@redhat.com>

I found this while working on a Linux agent for spice, the symptom I was
seeing was select blocking on the spice vdagent virtio serial port even
though there were messages queued up there.

virtio_console's port_fops_poll checks port->inbuf != NULL to determine
if read won't block. However if an application reads enough bytes from
inbuf through port_fops_read, to empty the current port->inbuf,
port->inbuf will be NULL even though there may be buffers left in the
virtqueue.

This causes poll() to block even though there is data to be read,
this patch fixes this by using will_read_block(port) instead of the
port->inbuf != NULL check.

Signed-off-By: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 drivers/char/virtio_console.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index be67d6b..2dbcd41 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -710,7 +710,7 @@ static unsigned int port_fops_poll(struct file *filp, poll_table *wait)
 		return POLLHUP;
 	}
 	ret = 0;
-	if (port->inbuf)
+	if (!will_read_block(port))
 		ret |= POLLIN | POLLRDNORM;
 	if (!will_write_block(port))
 		ret |= POLLOUT;
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] virtio: console: Disable lseek(2) for port file operations
  2010-09-16  9:13 [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Amit Shah
@ 2010-09-16  9:13 ` Amit Shah
  2010-09-20  2:49 ` [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Rusty Russell
  1 sibling, 0 replies; 4+ messages in thread
From: Amit Shah @ 2010-09-16  9:13 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Amit Shah, Arnd Bergmann, Virtualization List

The ports are char devices; do not have seeking capabilities.  Calling
nonseekable_open() from the fops_open() call and setting the llseek fops
pointer to no_llseek ensures an lseek() call from userspace returns
-ESPIPE.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
CC: Arnd Bergmann <arnd@arndb.de>
---
 drivers/char/virtio_console.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 2dbcd41..28718a9 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -798,6 +798,8 @@ static int port_fops_open(struct inode *inode, struct file *filp)
 	reclaim_consumed_buffers(port);
 	spin_unlock_irq(&port->outvq_lock);
 
+	nonseekable_open(inode, filp);
+
 	/* Notify host of port being opened */
 	send_control_msg(filp->private_data, VIRTIO_CONSOLE_PORT_OPEN, 1);
 
@@ -829,6 +831,7 @@ static const struct file_operations port_fops = {
 	.poll  = port_fops_poll,
 	.release = port_fops_release,
 	.fasync = port_fops_fasync,
+	.llseek = no_llseek,
 };
 
 /*
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read
  2010-09-16  9:13 [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Amit Shah
  2010-09-16  9:13 ` [PATCH 2/2] virtio: console: Disable lseek(2) for port file operations Amit Shah
@ 2010-09-20  2:49 ` Rusty Russell
  2010-09-20  5:08   ` Amit Shah
  1 sibling, 1 reply; 4+ messages in thread
From: Rusty Russell @ 2010-09-20  2:49 UTC (permalink / raw)
  To: Amit Shah; +Cc: Hans de Goede, Virtualization List

On Thu, 16 Sep 2010 06:43:08 pm Amit Shah wrote:
> From: Hans de Goede <hdegoede@redhat.com>
> 
> I found this while working on a Linux agent for spice, the symptom I was
> seeing was select blocking on the spice vdagent virtio serial port even
> though there were messages queued up there.
> 
> virtio_console's port_fops_poll checks port->inbuf != NULL to determine
> if read won't block. However if an application reads enough bytes from
> inbuf through port_fops_read, to empty the current port->inbuf,
> port->inbuf will be NULL even though there may be buffers left in the
> virtqueue.
> 
> This causes poll() to block even though there is data to be read,
> this patch fixes this by using will_read_block(port) instead of the
> port->inbuf != NULL check.
> 
> Signed-off-By: Hans de Goede <hdegoede@redhat.com>
> Signed-off-by: Amit Shah <amit.shah@redhat.com>

Thanks.  I assume this one should go into stable too?

Cheers,
Rusty.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read
  2010-09-20  2:49 ` [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Rusty Russell
@ 2010-09-20  5:08   ` Amit Shah
  0 siblings, 0 replies; 4+ messages in thread
From: Amit Shah @ 2010-09-20  5:08 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Hans de Goede, Virtualization List

On (Mon) Sep 20 2010 [12:19:33], Rusty Russell wrote:
> On Thu, 16 Sep 2010 06:43:08 pm Amit Shah wrote:
> > From: Hans de Goede <hdegoede@redhat.com>
> > 
> > I found this while working on a Linux agent for spice, the symptom I was
> > seeing was select blocking on the spice vdagent virtio serial port even
> > though there were messages queued up there.
> > 
> > virtio_console's port_fops_poll checks port->inbuf != NULL to determine
> > if read won't block. However if an application reads enough bytes from
> > inbuf through port_fops_read, to empty the current port->inbuf,
> > port->inbuf will be NULL even though there may be buffers left in the
> > virtqueue.
> > 
> > This causes poll() to block even though there is data to be read,
> > this patch fixes this by using will_read_block(port) instead of the
> > port->inbuf != NULL check.
> > 
> > Signed-off-By: Hans de Goede <hdegoede@redhat.com>
> > Signed-off-by: Amit Shah <amit.shah@redhat.com>
> 
> Thanks.  I assume this one should go into stable too?

Yes, thanks.

		Amit

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-09-20  5:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-16  9:13 [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Amit Shah
2010-09-16  9:13 ` [PATCH 2/2] virtio: console: Disable lseek(2) for port file operations Amit Shah
2010-09-20  2:49 ` [PATCH 1/2] virtio: console: Fix poll blocking even though there is data to read Rusty Russell
2010-09-20  5:08   ` Amit Shah

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).