From 5ef2488947aacf30ce897230b8bf20be543e7447 Mon Sep 17 00:00:00 2001 From: Vladimir Kondratyev Date: Sat, 27 Oct 2018 21:04:34 +0000 Subject: evdev: disable evdev if it is invoked from KDB or panic context This allow to prevent deadlock on entering KDB if one of evdev locks is already taken by userspace process. Also this change discards all but LED console events produced by KDB as unrelated to userspace. Tested by: dumbbell (as part of D15070) Objected by: bde (as 'KDB lock an already locked mutex' problem solution) MFC after: 1 month --- sys/dev/evdev/cdev.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'sys/dev/evdev/cdev.c') diff --git a/sys/dev/evdev/cdev.c b/sys/dev/evdev/cdev.c index 433444973779..615a70bafc79 100644 --- a/sys/dev/evdev/cdev.c +++ b/sys/dev/evdev/cdev.c @@ -349,6 +349,19 @@ evdev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, if (client->ec_revoked || evdev == NULL) return (ENODEV); + /* + * Fix evdev state corrupted with discarding of kdb events. + * EVIOCGKEY and EVIOCGLED ioctls can suffer from this. + */ + if (evdev->ev_kdb_active) { + EVDEV_LOCK(evdev); + if (evdev->ev_kdb_active) { + evdev->ev_kdb_active = false; + evdev_restore_after_kdb(evdev); + } + EVDEV_UNLOCK(evdev); + } + /* file I/O ioctl handling */ switch (cmd) { case FIOSETOWN: -- cgit v1.3