Input: evdev - use keyed wakeups
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> Link: https://lore.kernel.org/r/20200410233557.3892-1-kl@kl.wtf Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
ec4ba6c35b
commit
81b4d1d22c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue