linux/drivers/input
Dmitry Torokhov e8b95728f7 Input: uinput - avoid FF flush when destroying device
Normally, when input device supporting force feedback effects is being
destroyed, we try to "flush" currently playing effects, so that the
physical device does not continue vibrating (or executing other effects).
Unfortunately this does not work well for uinput as flushing of the effects
deadlocks with the destroy action:

- if device is being destroyed because the file descriptor is being closed,
  then there is noone to even service FF requests;

- if device is being destroyed because userspace sent UI_DEV_DESTROY,
  while theoretically it could be possible to service FF requests,
  userspace is unlikely to do so (they'd need to make sure FF handling
  happens on a separate thread) even if kernel solves the issue with FF
  ioctls deadlocking with UI_DEV_DESTROY ioctl on udev->mutex.

To avoid lockups like the one below, let's install a custom input device
flush handler, and avoid trying to flush force feedback effects when we
destroying the device, and instead rely on uinput to shut off the device
properly.

NMI watchdog: Watchdog detected hard LOCKUP on cpu 3
...
 <<EOE>>  [<ffffffff817a0307>] _raw_spin_lock_irqsave+0x37/0x40
 [<ffffffff810e633d>] complete+0x1d/0x50
 [<ffffffffa00ba08c>] uinput_request_done+0x3c/0x40 [uinput]
 [<ffffffffa00ba587>] uinput_request_submit.part.7+0x47/0xb0 [uinput]
 [<ffffffffa00bb62b>] uinput_dev_erase_effect+0x5b/0x76 [uinput]
 [<ffffffff815d91ad>] erase_effect+0xad/0xf0
 [<ffffffff815d929d>] flush_effects+0x4d/0x90
 [<ffffffff815d4cc0>] input_flush_device+0x40/0x60
 [<ffffffff815daf1c>] evdev_cleanup+0xac/0xc0
 [<ffffffff815daf5b>] evdev_disconnect+0x2b/0x60
 [<ffffffff815d74ac>] __input_unregister_device+0xac/0x150
 [<ffffffff815d75f7>] input_unregister_device+0x47/0x70
 [<ffffffffa00bac45>] uinput_destroy_device+0xb5/0xc0 [uinput]
 [<ffffffffa00bb2de>] uinput_ioctl_handler.isra.9+0x65e/0x740 [uinput]
 [<ffffffff811231ab>] ? do_futex+0x12b/0xad0
 [<ffffffffa00bb3f8>] uinput_ioctl+0x18/0x20 [uinput]
 [<ffffffff81241248>] do_vfs_ioctl+0x298/0x480
 [<ffffffff81337553>] ? security_file_ioctl+0x43/0x60
 [<ffffffff812414a9>] SyS_ioctl+0x79/0x90
 [<ffffffff817a04ee>] entry_SYSCALL_64_fastpath+0x12/0x71

Reported-by: Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
Reported-by: Clément VUCHENER <clement.vuchener@gmail.com>
Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=193741
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
2017-09-21 16:31:22 -07:00
..
gameport Input: gameport - use setup_timer 2017-04-10 20:41:39 -07:00
joystick Merge branch 'next' into for-linus 2017-09-15 09:52:21 -07:00
keyboard Input: pxa27x_keypad - handle return value of clk_prepare_enable 2017-08-31 11:57:35 -07:00
misc Input: uinput - avoid FF flush when destroying device 2017-09-21 16:31:22 -07:00
mouse Merge branch 'next' into for-linus 2017-09-15 09:52:21 -07:00
rmi4 Merge branch 'bind_unbind' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core into next 2017-07-24 16:51:18 -07:00
serio Input: i8042 - add Gigabyte P57 to the keyboard reset table 2017-09-15 09:51:22 -07:00
tablet Input: wacom_serial4 - constify serio_device_id 2017-08-18 17:15:09 -07:00
touchscreen Input: ucb1400_ts - fix suspend and resume handling 2017-09-11 14:23:56 -07:00
apm-power.c
evbug.c
evdev.c input: utilize new cdev_device_add helper function 2017-03-21 06:44:32 +01:00
ff-core.c Input: uinput - avoid FF flush when destroying device 2017-09-21 16:31:22 -07:00
ff-memless.c [media] fixp-arith: replace sin/cos table by a better precision one 2015-03-02 14:50:06 -03:00
input-compat.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
input-compat.h drivers/input: eliminate INPUT_COMPAT_TEST macro 2016-03-25 16:37:42 -07:00
input-leds.c Input: LEDs - skip unnamed LEDs 2015-07-24 09:11:01 -07:00
input-mt.c Input: update input_mt_report_pointer_emulation to support hovering 2016-06-01 14:21:10 -07:00
input-polldev.c
input.c Input: constify attribute_group structures 2017-07-12 14:18:26 -07:00
joydev.c input: utilize new cdev_device_add helper function 2017-03-21 06:44:32 +01:00
Kconfig Input: mousedev - stop offering PS/2 to userspace by default 2017-01-31 11:31:49 -08:00
Makefile Input: synaptics-rmi4 - add support for Synaptics RMI4 devices 2016-03-10 16:02:39 -08:00
matrix-keymap.c Input: matrix-keypad - switch to using generic device properties 2017-01-31 11:31:48 -08:00
mousedev.c Input: mousedev - fix implicit conversion warning 2017-07-25 13:54:31 -07:00
sparse-keymap.c Input: sparse-keymap - remove sparse_keymap_free() 2017-05-29 20:02:01 -07:00