linux_dsm_epyc7002/drivers/input
David Herrmann 483180281f Input: evdev - flush queues during EVIOCGKEY-like ioctls
If userspace requests current KEY-state, they very likely assume that no
such events are pending in the output queue of the evdev device.
Otherwise, they will parse events which they already handled via
EVIOCGKEY(). For XKB applications this can cause irreversible keyboard
states if a modifier is locked multiple times because a CTRL-DOWN event is
handled once via EVIOCGKEY() and once from the queue via read(), even
though it should handle it only once.

Therefore, lets do the only logical thing and flush the evdev queue
atomically during this ioctl. We only flush events that are affected by
the given ioctl.

This only affects boolean events like KEY, SND, SW and LED. ABS, REL and
others are not affected as duplicate events can be handled gracefully by
user-space.

Note: This actually breaks semantics of the evdev ABI. However,
investigations showed that userspace already expects the new semantics and
we end up fixing at least all XKB applications.
All applications that are aware of this race-condition mirror the KEY
state for each open-file and detect/drop duplicate events. Hence, they do
not care whether duplicates are posted or not and work fine with this fix.

Also note that we need proper locking to guarantee atomicity and avoid
dead-locks. event_lock must be locked before queue_lock (see input-core).
However, we can safely release event_lock while flushing the queue. This
allows the input-core to proceed with pending events and only stop if it
needs our queue_lock to post new events.
This should guarantee that we don't block event-dispatching for too long
while flushing a single event queue.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
2013-06-09 22:35:05 -07:00
..
gameport Input: remove use of __devexit 2012-11-24 00:05:38 -08:00
joystick Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2013-02-20 11:00:43 -08:00
keyboard Input: add TI-Nspire keypad support 2013-06-04 09:17:25 -07:00
misc Input: sirfsoc_pwrc - add onkey input driver for CSR SiRFprimaII PWRC 2013-06-02 23:49:12 -07:00
mouse Input: navpoint - pass correct pointer to free_irq() 2013-05-23 09:38:41 -07:00
serio Input: xilinx_ps2 - remove redundant platform_set_drvdata() 2013-05-28 00:57:48 -07:00
tablet Input: wacom - add support for 0x10d 2013-03-09 15:39:26 -08:00
touchscreen Input: atmel_tsadcc - fix error handing with missing platform data 2013-06-05 22:48:52 -07:00
apm-power.c Input: random formatting fixes 2012-08-21 22:29:49 -07:00
evbug.c Input: use pr_fmt and pr_<level> 2010-11-30 23:10:26 -08:00
evdev.c Input: evdev - flush queues during EVIOCGKEY-like ioctls 2013-06-09 22:35:05 -07:00
ff-core.c Input: random formatting fixes 2012-08-21 22:29:49 -07:00
ff-memless.c Input: random formatting fixes 2012-08-21 22:29:49 -07:00
input-compat.c compat: Use COMPAT_USE_64BIT_TIME in the input subsystem 2012-02-20 12:48:47 -08:00
input-compat.h compat: Use COMPAT_USE_64BIT_TIME in the input subsystem 2012-02-20 12:48:47 -08:00
input-mt.c Input: MT - handle semi-mt devices in core 2013-04-07 21:02:32 -07:00
input-polldev.c Merge commit 'v3.2-rc3' into next 2011-11-29 01:51:07 -08:00
input.c Input: document that unregistering managed devices is not necessary 2013-01-09 09:07:56 -08:00
joydev.c Input: fix use-after-free introduced with dynamic minor changes 2012-10-22 08:50:37 +03:00
Kconfig Input: add couple of missing GENERIC_HARDIRQS dependencies 2013-02-13 20:21:07 -08:00
Makefile Input: matrix-keymap - uninline and prepare for device tree support 2012-05-10 22:38:47 -07:00
matrix-keymap.c Merge branch 'next' into for-linus 2012-12-16 22:04:14 -08:00
mousedev.c Input: mousedev - move /dev/input/mice to the correct minor 2012-11-18 23:15:16 -08:00
sparse-keymap.c Input: random formatting fixes 2012-08-21 22:29:49 -07:00