On Tue, Mar 22, 2011 at 06:04:04PM -0700, Jeff Brown wrote: > On SMP systems, it is possible for an evdev client blocked on poll() > to wake up and read events from the evdev ring buffer at the same > rate as they are enqueued. This can result in high CPU usage, > particularly for MT devices, because the client ends up reading > events one at a time instead of reading complete packets. This patch > ensures that the client only wakes from poll() when a complete packet > is ready to be read. > > Signed-off-by: jeffbrown@xxxxxxxxxxx > --- > drivers/input/evdev.c | 5 +++-- > 1 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c > index 203ed70..7b6770d 100644 > --- a/drivers/input/evdev.c > +++ b/drivers/input/evdev.c > @@ -73,7 +73,7 @@ static void evdev_pass_event(struct evdev_client *client, > } > spin_unlock(&client->buffer_lock); > > - if (event->type == EV_SYN) > + if (event->type == EV_SYN && event->code != SYN_MT_REPORT) It is not clear what should happen at the other SYN events. Maybe event->code == SYN_REPORT instead? > kill_fasync(&client->fasync, SIGIO, POLL_IN); > } > > @@ -103,7 +103,8 @@ static void evdev_event(struct input_handle *handle, > > rcu_read_unlock(); > > - wake_up_interruptible(&evdev->wait); > + if (type == EV_SYN && code != SYN_MT_REPORT) > + wake_up_interruptible(&evdev->wait); Ah, this is a good one. Since the code depends on the same logic being applied in evdev_pass_event as well, a boolean argument to that function would be good. Thanks, Henrik -- 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