android_kernel_xiaomi_sm8450/drivers/usb/core
Linus Torvalds 7bc80cd935 usbfs: fix deadlock on 'usbfs_mutex', clean up poll
The caller of usbfs_conn_disc_event() in some cases (but not always)
already holds usbfs_mutex, so trying to protect the event counter with
that lock causes nasty deadlocks.

The problem was introduced by commit 554f76962d ("USB: Remove BKL from
poll()") when the BLK protection was turned into using the mutex instead.

So fix this by using an atomic variable instead.  And while we're at it,
get rid of the atrocious naming of said variable and the waitqueue it is
associated with.

This also cleans up the unnecessary locking in the poll routine, since
the whole point of how the pollwait table works is that you can just add
yourself to the waiting list, and then check the condition you're
waiting for afterwards - avoiding all races.

It also gets rid of the unnecessary dynamic allocation of the device
status that just contained a single word.  We should use f_version for
this, as Dmitry Torokhov points out.  That simplifies everything
further.

Reported-and-tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Cc: Oliver Neukum <oliver@neukum.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-03-06 16:34:34 -08:00
..
buffer.c USB: pass mem_flags to dma_alloc_coherent 2009-04-23 14:15:28 -07:00
config.c USB: Fix SS endpoint companion descriptor parsing. 2009-09-23 06:46:18 -07:00
devices.c usbfs: fix deadlock on 'usbfs_mutex', clean up poll 2010-03-06 16:34:34 -08:00
devio.c USB: usbfs_snoop: add data logging back in 2010-03-02 14:54:37 -08:00
driver.c USB: remove debugging message for uevent constructions 2010-03-02 14:55:02 -08:00
endpoint.c PM: Allow USB devices to suspend/resume asynchronously 2010-02-26 20:39:12 +01:00
file.c USB: Push BKL on open down into the drivers 2010-03-02 14:54:23 -08:00
generic.c USB: Convert a dev_info to a dev_dbg 2009-12-11 11:55:13 -08:00
hcd-pci.c USB: implement non-tree resume ordering constraints for PCI host controllers 2010-02-26 20:39:12 +01:00
hcd.c USB: fix the idProduct value for USB-3.0 root hubs 2010-03-02 14:55:07 -08:00
hcd.h USB: Move hcd free_dev call into usb_disconnect to fix oops 2010-03-02 14:54:13 -08:00
hub.c USB hub: make USB device id constant 2010-03-02 14:54:17 -08:00
hub.h USB: fix the clear_tt_buffer interface 2009-07-12 15:16:38 -07:00
inode.c const: mark remaining super_operations const 2009-09-22 07:17:24 -07:00
Kconfig USB: convert to the runtime PM framework 2010-03-02 14:54:12 -08:00
Makefile USB: add the usbfs devices file to debugfs 2009-06-15 21:44:43 -07:00
message.c USB: don't read past config->interface[] if usb_control_msg() fails in usb_reset_configuration() 2010-03-02 14:55:10 -08:00
notify.c USB : correct comments in usb/core/notify.c 2008-02-01 14:34:44 -08:00
otg_whitelist.h USB: fix codingstyle issues in drivers/usb/core/*.h 2008-02-01 14:35:07 -08:00
quirks.c USB: change handling of negative autosuspend delays 2010-03-02 14:54:11 -08:00
sysfs.c USB: change handling of negative autosuspend delays 2010-03-02 14:54:11 -08:00
urb.c USB: rename USB_SPEED_VARIABLE to USB_SPEED_WIRELESS 2010-03-02 14:53:36 -08:00
usb.c USB: Move hcd free_dev call into usb_disconnect to fix oops 2010-03-02 14:54:13 -08:00
usb.h USB: convert to the runtime PM framework 2010-03-02 14:54:12 -08:00