Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d779768 authored by Oliver Neukum's avatar Oliver Neukum Committed by Jiri Kosina
Browse files

HID: autosuspend -- fix lockup of hid on reset



This fixes a use of flush_scheduled_work() in USB HID's reset logic that can
deadlock.

Tested-by: default avatarValdis Kletniks <Valdis.Kletnieks@vt.edu>
Signed-off-by: default avatarOliver Neukum <oliver@neukum.name>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent ae2f0074
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1207,7 +1207,6 @@ static void hid_cease_io(struct usbhid_device *usbhid)
	usb_kill_urb(usbhid->urbin);
	usb_kill_urb(usbhid->urbctrl);
	usb_kill_urb(usbhid->urbout);
	flush_scheduled_work();
}

/* Treat USB reset pretty much the same as suspend/resume */
@@ -1219,6 +1218,7 @@ static int hid_pre_reset(struct usb_interface *intf)
	spin_lock_irq(&usbhid->lock);
	set_bit(HID_RESET_PENDING, &usbhid->iofl);
	spin_unlock_irq(&usbhid->lock);
	cancel_work_sync(&usbhid->restart_work);
	hid_cease_io(usbhid);

	return 0;