]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
HID: usbhid: fix deadlock in hid_post_reset()
authorOliver Neukum <oneukum@suse.com>
Tue, 24 Mar 2026 14:24:54 +0000 (15:24 +0100)
committerJiri Kosina <jkosina@suse.com>
Thu, 9 Apr 2026 15:48:05 +0000 (17:48 +0200)
You can build a USB device that includes a HID component
and a storage or UAS component. The components can be reset
only together. That means that hid_pre_reset() and hid_post_reset()
are in the block IO error handling. Hence no memory allocation
used in them may do block IO because the IO can deadlock
on the mutex held while resetting a device and calling the
interface drivers.
Use GFP_NOIO for all allocations in them.

Fixes: dc3c78e434690 ("HID: usbhid: Check HID report descriptor contents after device reset")
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/usbhid/hid-core.c

index 758eb21430cda0f64192496e831c60547c338f0b..df3cc89dfb37fb244bb744b007042db7ef58aa6d 100644 (file)
@@ -1552,7 +1552,7 @@ static int hid_post_reset(struct usb_interface *intf)
         * configuration descriptors passed, we already know that
         * the size of the HID report descriptor has not changed.
         */
-       rdesc = kmalloc(hid->dev_rsize, GFP_KERNEL);
+       rdesc = kmalloc(hid->dev_rsize, GFP_NOIO);
        if (!rdesc)
                return -ENOMEM;