Message ID | 20200410233557.3892-1-kl@kl.wtf (mailing list archive) |
---|---|
State | Mainlined |
Commit | 81b4d1d22ca0d0162360d3536b0eb3f6d5bfcf88 |
Headers | show |
Series | input/evdev: make evdev use keyed wakeups | expand |
On Sat, Apr 11, 2020 at 01:35:57AM +0200, Kenny Levinsen wrote: > Some processes, such as systemd, are only polling for EPOLLERR|EPOLLHUP. > As evdev uses unkeyed wakeups, such a poll receives many spurious > wakeups from uninteresting events. > > Use keyed wakeups to allow the wakeup target to more efficiently discard > these uninteresting events. > > Signed-off-by: Kenny Levinsen <kl@kl.wtf> Applied, thank you. > --- > drivers/input/evdev.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c > index d7dd6fcf2db0..f54d3d31f61d 100644 > --- a/drivers/input/evdev.c > +++ b/drivers/input/evdev.c > @@ -282,7 +282,8 @@ static void evdev_pass_values(struct evdev_client *client, > spin_unlock(&client->buffer_lock); > > if (wakeup) > - wake_up_interruptible(&evdev->wait); > + wake_up_interruptible_poll(&evdev->wait, > + EPOLLIN | EPOLLOUT | EPOLLRDNORM | EPOLLWRNORM); > } > > /* > @@ -443,7 +444,7 @@ static void evdev_hangup(struct evdev *evdev) > kill_fasync(&client->fasync, SIGIO, POLL_HUP); > spin_unlock(&evdev->client_lock); > > - wake_up_interruptible(&evdev->wait); > + wake_up_interruptible_poll(&evdev->wait, EPOLLHUP | EPOLLERR); > } > > static int evdev_release(struct inode *inode, struct file *file) > @@ -958,7 +959,7 @@ static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, > client->revoked = true; > evdev_ungrab(evdev, client); > input_flush_device(&evdev->handle, file); > - wake_up_interruptible(&evdev->wait); > + wake_up_interruptible_poll(&evdev->wait, EPOLLHUP | EPOLLERR); > > return 0; > } > -- > 2.26.0 >
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index d7dd6fcf2db0..f54d3d31f61d 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -282,7 +282,8 @@ static void evdev_pass_values(struct evdev_client *client, spin_unlock(&client->buffer_lock); if (wakeup) - wake_up_interruptible(&evdev->wait); + wake_up_interruptible_poll(&evdev->wait, + EPOLLIN | EPOLLOUT | EPOLLRDNORM | EPOLLWRNORM); } /* @@ -443,7 +444,7 @@ static void evdev_hangup(struct evdev *evdev) kill_fasync(&client->fasync, SIGIO, POLL_HUP); spin_unlock(&evdev->client_lock); - wake_up_interruptible(&evdev->wait); + wake_up_interruptible_poll(&evdev->wait, EPOLLHUP | EPOLLERR); } static int evdev_release(struct inode *inode, struct file *file) @@ -958,7 +959,7 @@ static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, client->revoked = true; evdev_ungrab(evdev, client); input_flush_device(&evdev->handle, file); - wake_up_interruptible(&evdev->wait); + wake_up_interruptible_poll(&evdev->wait, EPOLLHUP | EPOLLERR); return 0; }
Some processes, such as systemd, are only polling for EPOLLERR|EPOLLHUP. As evdev uses unkeyed wakeups, such a poll receives many spurious wakeups from uninteresting events. Use keyed wakeups to allow the wakeup target to more efficiently discard these uninteresting events. Signed-off-by: Kenny Levinsen <kl@kl.wtf> --- drivers/input/evdev.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)