summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2010-01-06 02:56:04 +0100
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2010-01-06 09:17:04 +0100
commit30a589fde0162aa4dac7c69803aeee8fbe8d1b82 (patch)
tree19cb0a9774daa4ad010ed5595ee1ac2ed590797b /drivers
parentInput: atkbd - fix canceling event_work in disconnect (diff)
downloadlinux-30a589fde0162aa4dac7c69803aeee8fbe8d1b82.tar.xz
linux-30a589fde0162aa4dac7c69803aeee8fbe8d1b82.zip
Input: evdev - be less aggressive about sending SIGIO notifies
When using realtime signals, we'll enqueue one signal for every event. This is unfortunate, because (for example) keyboard presses are three events: key, msc scancode, and syn. They'll be enqueued fast enough in kernel space that all three events will be ready to read by the time userspace runs, so the first invocation of the signal handler will read all three events, but then the second two invocations still have to run to do no work. Instead, only send the SIGIO notification on syn events. This is a slight abuse of SIGIO semantics, in principle it ought to fire as soon as any events are readable. But it matches evdev semantics, which is more important since SIGIO is rather vaguely defined to begin with. Signed-off-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/input/evdev.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index dee6706038aa..258c639571b5 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -59,7 +59,8 @@ static void evdev_pass_event(struct evdev_client *client,
client->head &= EVDEV_BUFFER_SIZE - 1;
spin_unlock(&client->buffer_lock);
- kill_fasync(&client->fasync, SIGIO, POLL_IN);
+ if (event->type == EV_SYN)
+ kill_fasync(&client->fasync, SIGIO, POLL_IN);
}
/*