Hi Rusty,
The main thing in these patches is the introduction of injecting SIGIO
on host-side connect/disconnect events and when new data is available
for ports.
The first two patches fix bugs that I haven't seen, but look like the
right thing to do.
These have been tested extensively using the test-virtserial test
suite.
Please apply,
Amit.
Amit Shah (4):
virtio: console: Un-block reads on chardev close
virtio: console: Annotate virtcons_remove with __devexit_p
virtio: console: Send SIGIO to processes that request it for host
events
virtio: console: Send SIGIO on new data arrival on ports
drivers/char/virtio_console.c | 32 ++++++++++++++++++++++++++++++--
1 files changed, 30 insertions(+), 2 deletions(-)
--
1.7.2.2
Amit Shah
2010-Aug-26 05:04 UTC
[PATCH 1/4] virtio: console: Un-block reads on chardev close
If a chardev is closed, any blocked read / poll calls should just return
and not attempt to use other state.
Signed-off-by: Amit Shah <amit.shah at redhat.com>
---
drivers/char/virtio_console.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 942a982..92ae3f8 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -522,6 +522,10 @@ static ssize_t fill_readbuf(struct port *port, char
*out_buf, size_t out_count,
/* The condition that must be true for polling to end */
static bool will_read_block(struct port *port)
{
+ if (!port->guest_connected) {
+ /* Port got hot-unplugged. Let's exit. */
+ return false;
+ }
return !port_has_data(port) && port->host_connected;
}
--
1.7.2.2
Amit Shah
2010-Aug-26 05:04 UTC
[PATCH 2/4] virtio: console: Annotate virtcons_remove with __devexit_p
virtcons_remove is called on device unplug. Mark with __devexit_p.
Signed-off-by: Amit Shah <amit.shah at redhat.com>
---
drivers/char/virtio_console.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 92ae3f8..a34f40e 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1585,7 +1585,7 @@ fail:
return err;
}
-static void virtcons_remove(struct virtio_device *vdev)
+static void __devexit virtcons_remove(struct virtio_device *vdev)
{
struct ports_device *portdev;
struct port *port, *port2;
@@ -1631,7 +1631,7 @@ static struct virtio_driver virtio_console = {
.driver.owner = THIS_MODULE,
.id_table = id_table,
.probe = virtcons_probe,
- .remove = virtcons_remove,
+ .remove = __devexit_p(virtcons_remove),
.config_changed = config_intr,
};
--
1.7.2.2
Amit Shah
2010-Aug-26 05:04 UTC
[PATCH 3/4] virtio: console: Send SIGIO to processes that request it for host events
A process can request for SIGIO on host connect / disconnect events
using the O_ASYNC file flag using fcntl().
If that's requested, and if the guest-side connection for the port is
open, any host-side open/close events for that port will raise a SIGIO.
The process can then use poll() within the signal handler to find out
which port triggered the signal.
Signed-off-by: Amit Shah <amit.shah at redhat.com>
---
drivers/char/virtio_console.c | 20 ++++++++++++++++++++
1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index a34f40e..b74d097 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -187,6 +187,9 @@ struct port {
/* The 'name' of the port that we expose via sysfs properties */
char *name;
+ /* We can notify apps of host connect / disconnect events via SIGIO */
+ struct fasync_struct *async_queue;
+
/* The 'id' to identify the port with the Host */
u32 id;
@@ -719,6 +722,14 @@ static int port_fops_open(struct inode *inode, struct file
*filp)
return 0;
}
+static int port_fops_fasync(int fd, struct file *filp, int mode)
+{
+ struct port *port;
+
+ port = filp->private_data;
+ return fasync_helper(fd, filp, mode, &port->async_queue);
+}
+
/*
* The file operations that we support: programs in the guest can open
* a console device, read from it, write to it, poll for data and
@@ -732,6 +743,7 @@ static const struct file_operations port_fops = {
.write = port_fops_write,
.poll = port_fops_poll,
.release = port_fops_release,
+ .fasync = port_fops_fasync,
};
/*
@@ -1011,6 +1023,7 @@ static int add_port(struct ports_device *portdev, u32 id)
port->name = NULL;
port->inbuf = NULL;
port->cons.hvc = NULL;
+ port->async_queue = NULL;
port->cons.ws.ws_row = port->cons.ws.ws_col = 0;
@@ -1234,6 +1247,13 @@ static void handle_control_message(struct ports_device
*portdev,
spin_lock_irq(&port->outvq_lock);
reclaim_consumed_buffers(port);
spin_unlock_irq(&port->outvq_lock);
+
+ /*
+ * If the guest is connected, it'll be interested in
+ * knowing the host connection state changed.
+ */
+ if (port->async_queue && port->guest_connected)
+ kill_fasync(&port->async_queue, SIGIO, POLL_OUT);
break;
case VIRTIO_CONSOLE_PORT_NAME:
/*
--
1.7.2.2
Amit Shah
2010-Aug-26 05:04 UTC
[PATCH 4/4] virtio: console: Send SIGIO on new data arrival on ports
Send a SIGIO signal when new data arrives on a port. This is sent only when the process has requested for the signal to be sent using fcntl(). Signed-off-by: Amit Shah <amit.shah at redhat.com> --- drivers/char/virtio_console.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index b74d097..be0a8e4 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1350,6 +1350,10 @@ static void in_intr(struct virtqueue *vq) wake_up_interruptible(&port->waitqueue); + /* Send a SIGIO indicating new data in case the process asked for it */ + if (port->async_queue && port->guest_connected) + kill_fasync(&port->async_queue, SIGIO, POLL_IN); + if (is_console_port(port) && hvc_poll(port->cons.hvc)) hvc_kick(); } -- 1.7.2.2
On (Thu) Aug 26 2010 [10:34:04], Amit Shah wrote:> Hi Rusty, > > The main thing in these patches is the introduction of injecting SIGIO > on host-side connect/disconnect events and when new data is available > for ports. > > The first two patches fix bugs that I haven't seen, but look like the > right thing to do. > > These have been tested extensively using the test-virtserial test > suite. > > Please apply,Since you haven't picked this up already, I'll send a new series that has more fixes and another call to SIGIO. I'll also split up the series in two patchsets, one for hot-unplug related fixes and one for the SIGIO. Amit
Maybe Matching Threads
- [PATCH 0/4] virtio: console: fixes, SIGIO
- [PATCH 0/3] virtio: console: async notifications for host connect / disconnect
- [PATCH 0/3] virtio: console: async notifications for host connect / disconnect
- [PATCH 00/14] virtio: console: Hot-unplug fixes
- [PATCH 00/14] virtio: console: Hot-unplug fixes