Input: evdev - never leave the client buffer empty after write
authorHenrik Rydberg <rydberg@euromail.se>
Wed, 23 Jun 2010 17:09:26 +0000 (10:09 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 23 Jun 2010 20:05:27 +0000 (13:05 -0700)
When the client buffer is very small and wraps around a lot, it may
well be that a write increases the head such that head == tail. If
this happens between the point where a poll is triggered and the
actual data is being read, there will be no data to read. This is
confusing to applications, which might end up closing the file.

This patch solves the problem by making sure the client buffer is
never empty after writing to it.

Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/evdev.c

index 30836c05edd75cdae107ddb9fd33cd0765ed5f1a..cd323254ca6f560a1b7d38b5283297f67f5b84ee 100644 (file)
@@ -54,11 +54,15 @@ static void evdev_pass_event(struct evdev_client *client,
                             struct input_event *event)
 {
        /*
-        * Interrupts are disabled, just acquire the lock
+        * Interrupts are disabled, just acquire the lock.
+        * Make sure we don't leave with the client buffer
+        * "empty" by having client->head == client->tail.
         */
        spin_lock(&client->buffer_lock);
-       client->buffer[client->head++] = *event;
-       client->head &= client->bufsize - 1;
+       do {
+               client->buffer[client->head++] = *event;
+               client->head &= client->bufsize - 1;
+       } while (client->head == client->tail);
        spin_unlock(&client->buffer_lock);
 
        if (event->type == EV_SYN)
This page took 0.031636 seconds and 5 git commands to generate.