The newest event can be SYN_REPORT in case of dropping all old events when buffer is full, but as now there is no device data available to read so lets drop SYN_REPORT as well and store only SYN_DROPPED. Signed-off-by: Aniroop Mathur <a.mathur@xxxxxxxxxxx> --- drivers/input/evdev.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index e9ae3d5..e270219 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -228,7 +228,7 @@ static int evdev_set_clk_type(struct evdev_client *client, unsigned int clkid) return 0; } -static void __pass_event(struct evdev_client *client, +static int __pass_event(struct evdev_client *client, const struct input_event *event) { client->buffer[client->head++] = *event; @@ -247,12 +247,24 @@ static void __pass_event(struct evdev_client *client, client->buffer[client->tail].value = 0; client->packet_head = client->tail; + + /* + * Do not store SYN_REPORT as there is no device data in buffer + * and return to avoid wakeup and changing packet_head. + */ + if (event->type == EV_SYN && event->code == SYN_REPORT) { + client->head--; + client->head &= client->bufsize - 1; + return 1; + } } if (event->type == EV_SYN && event->code == SYN_REPORT) { client->packet_head = client->head; kill_fasync(&client->fasync, SIGIO, POLL_IN); } + + return 0; } static void evdev_pass_values(struct evdev_client *client, @@ -287,7 +299,8 @@ static void evdev_pass_values(struct evdev_client *client, event.type = v->type; event.code = v->code; event.value = v->value; - __pass_event(client, &event); + if (__pass_event(client, &event)) + wakeup = false; } spin_unlock(&client->buffer_lock); -- 2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html