Amit Shah
2010-Sep-02 13:17 UTC
[PATCH 0/3] virtio: console: async notifications for host connect / disconnect
Hey Rusty, This patchset is on top of the previous one. It sends a SIGIO signal to apps that request signals for host activity. SIGIO is sent on host connect, disconnect as well as hot-unplug (which can be seen as a special case of host disconnect). Tested using several testcases in the test-virtserial repo: http://fedorapeople.org/gitweb?p=amitshah/public_git/test-virtserial.git Please apply. Thanks, Amit. Amit Shah (3): virtio: console: Send SIGIO to processes that request it for host events virtio: console: Send SIGIO on new data arrival on ports virtio: console: Send SIGIO in case of port unplug drivers/char/virtio_console.c | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+), 0 deletions(-) -- 1.7.2.2
Amit Shah
2010-Sep-02 13:17 UTC
[PATCH 1/3] 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 | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 793817b..afbbc54 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -196,6 +196,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; @@ -800,6 +803,14 @@ out: return ret; } +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 @@ -813,6 +824,7 @@ static const struct file_operations port_fops = { .write = port_fops_write, .poll = port_fops_poll, .release = port_fops_release, + .fasync = port_fops_fasync, }; /* @@ -1071,6 +1083,12 @@ static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock) return nr_added_bufs; } +static void send_sigio_to_port(struct port *port) +{ + if (port->async_queue && port->guest_connected) + kill_fasync(&port->async_queue, SIGIO, POLL_OUT); +} + static int add_port(struct ports_device *portdev, u32 id) { char debugfs_name[16]; @@ -1093,6 +1111,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; @@ -1347,6 +1366,12 @@ 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. + */ + send_sigio_to_port(port); break; case VIRTIO_CONSOLE_PORT_NAME: /* -- 1.7.2.2
Amit Shah
2010-Sep-02 13:17 UTC
[PATCH 2/3] 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 | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index afbbc54..a750d2b 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1468,6 +1468,9 @@ 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 */ + send_sigio_to_port(port); + if (is_console_port(port) && hvc_poll(port->cons.hvc)) hvc_kick(); } -- 1.7.2.2
Amit Shah
2010-Sep-02 13:17 UTC
[PATCH 3/3] virtio: console: Send SIGIO in case of port unplug
If a port has registered for SIGIO signals, let the application know that the port is getting unplugged. Signed-off-by: Amit Shah <amit.shah at redhat.com> --- 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 a750d2b..f7adfd3 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1244,6 +1244,9 @@ static void unplug_port(struct port *port) port->guest_connected = false; port->host_connected = false; wake_up_interruptible(&port->waitqueue); + + /* Let the app know the port is going down. */ + send_sigio_to_port(port); } if (is_console_port(port)) { -- 1.7.2.2
Rusty Russell
2010-Sep-06 09:21 UTC
[PATCH 3/3] virtio: console: Send SIGIO in case of port unplug
On Thu, 2 Sep 2010 10:47:54 pm Amit Shah wrote:> If a port has registered for SIGIO signals, let the application > know that the port is getting unplugged. > > Signed-off-by: Amit Shah <amit.shah at redhat.com>Thanks Amit, these patches were really well organized and nice to read. Applied them all... Rusty.
Seemingly Similar Threads
- [PATCH 0/3] virtio: console: async notifications for host connect / disconnect
- [PATCH 0/4] virtio: console: fixes, SIGIO
- [PATCH 0/4] virtio: console: fixes, SIGIO
- [PATCH 2/2] virtio-serial: setup_port_vq when adding port
- [PATCH 2/2] virtio-serial: setup_port_vq when adding port