1. 26 4月, 2014 11 次提交
  2. 25 4月, 2014 4 次提交
    • J
      USB: serial: fix sysfs-attribute removal deadlock · 10164c2a
      Johan Hovold 提交于
      Fix driver new_id sysfs-attribute removal deadlock by making sure to
      not hold any locks that the attribute operations grab when removing the
      attribute.
      
      Specifically, usb_serial_deregister holds the table mutex when
      deregistering the driver, which includes removing the new_id attribute.
      This can lead to a deadlock as writing to new_id increments the
      attribute's active count before trying to grab the same mutex in
      usb_serial_probe.
      
      The deadlock can easily be triggered by inserting a sleep in
      usb_serial_deregister and writing the id of an unbound device to new_id
      during module unload.
      
      As the table mutex (in this case) is used to prevent subdriver unload
      during probe, it should be sufficient to only hold the lock while
      manipulating the usb-serial driver list during deregister. A racing
      probe will then either fail to find a matching subdriver or fail to get
      the corresponding module reference.
      
      Since v3.15-rc1 this also triggers the following lockdep warning:
      
      ======================================================
      [ INFO: possible circular locking dependency detected ]
      3.15.0-rc2 #123 Tainted: G        W
      -------------------------------------------------------
      modprobe/190 is trying to acquire lock:
       (s_active#4){++++.+}, at: [<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
      
      but task is already holding lock:
       (table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
      
      which lock already depends on the new lock.
      
      the existing dependency chain (in reverse order) is:
      
      -> #1 (table_lock){+.+.+.}:
             [<c0075f84>] __lock_acquire+0x1694/0x1ce4
             [<c0076de8>] lock_acquire+0xb4/0x154
             [<c03af3cc>] _raw_spin_lock+0x4c/0x5c
             [<c02bbc24>] usb_store_new_id+0x14c/0x1ac
             [<bf007eb4>] new_id_store+0x68/0x70 [usbserial]
             [<c025f568>] drv_attr_store+0x30/0x3c
             [<c01690e0>] sysfs_kf_write+0x5c/0x60
             [<c01682c0>] kernfs_fop_write+0xd4/0x194
             [<c010881c>] vfs_write+0xbc/0x198
             [<c0108e4c>] SyS_write+0x4c/0xa0
             [<c000f880>] ret_fast_syscall+0x0/0x48
      
      -> #0 (s_active#4){++++.+}:
             [<c03a7a28>] print_circular_bug+0x68/0x2f8
             [<c0076218>] __lock_acquire+0x1928/0x1ce4
             [<c0076de8>] lock_acquire+0xb4/0x154
             [<c0166b70>] __kernfs_remove+0x254/0x310
             [<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
             [<c0169fb8>] remove_files.isra.1+0x48/0x84
             [<c016a2fc>] sysfs_remove_group+0x58/0xac
             [<c016a414>] sysfs_remove_groups+0x34/0x44
             [<c02623b8>] driver_remove_groups+0x1c/0x20
             [<c0260e9c>] bus_remove_driver+0x3c/0xe4
             [<c026235c>] driver_unregister+0x38/0x58
             [<bf007fb4>] usb_serial_bus_deregister+0x84/0x88 [usbserial]
             [<bf004db4>] usb_serial_deregister+0x6c/0x78 [usbserial]
             [<bf005330>] usb_serial_deregister_drivers+0x2c/0x4c [usbserial]
             [<bf016618>] usb_serial_module_exit+0x14/0x1c [sierra]
             [<c009d6cc>] SyS_delete_module+0x184/0x210
             [<c000f880>] ret_fast_syscall+0x0/0x48
      
      other info that might help us debug this:
      
       Possible unsafe locking scenario:
      
             CPU0                    CPU1
             ----                    ----
        lock(table_lock);
                                     lock(s_active#4);
                                     lock(table_lock);
        lock(s_active#4);
      
       *** DEADLOCK ***
      
      1 lock held by modprobe/190:
       #0:  (table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
      
      stack backtrace:
      CPU: 0 PID: 190 Comm: modprobe Tainted: G        W     3.15.0-rc2 #123
      [<c0015e10>] (unwind_backtrace) from [<c0013728>] (show_stack+0x20/0x24)
      [<c0013728>] (show_stack) from [<c03a9a54>] (dump_stack+0x24/0x28)
      [<c03a9a54>] (dump_stack) from [<c03a7cac>] (print_circular_bug+0x2ec/0x2f8)
      [<c03a7cac>] (print_circular_bug) from [<c0076218>] (__lock_acquire+0x1928/0x1ce4)
      [<c0076218>] (__lock_acquire) from [<c0076de8>] (lock_acquire+0xb4/0x154)
      [<c0076de8>] (lock_acquire) from [<c0166b70>] (__kernfs_remove+0x254/0x310)
      [<c0166b70>] (__kernfs_remove) from [<c0167aa0>] (kernfs_remove_by_name_ns+0x4c/0x94)
      [<c0167aa0>] (kernfs_remove_by_name_ns) from [<c0169fb8>] (remove_files.isra.1+0x48/0x84)
      [<c0169fb8>] (remove_files.isra.1) from [<c016a2fc>] (sysfs_remove_group+0x58/0xac)
      [<c016a2fc>] (sysfs_remove_group) from [<c016a414>] (sysfs_remove_groups+0x34/0x44)
      [<c016a414>] (sysfs_remove_groups) from [<c02623b8>] (driver_remove_groups+0x1c/0x20)
      [<c02623b8>] (driver_remove_groups) from [<c0260e9c>] (bus_remove_driver+0x3c/0xe4)
      [<c0260e9c>] (bus_remove_driver) from [<c026235c>] (driver_unregister+0x38/0x58)
      [<c026235c>] (driver_unregister) from [<bf007fb4>] (usb_serial_bus_deregister+0x84/0x88 [usbserial])
      [<bf007fb4>] (usb_serial_bus_deregister [usbserial]) from [<bf004db4>] (usb_serial_deregister+0x6c/0x78 [usbserial])
      [<bf004db4>] (usb_serial_deregister [usbserial]) from [<bf005330>] (usb_serial_deregister_drivers+0x2c/0x4c [usbserial])
      [<bf005330>] (usb_serial_deregister_drivers [usbserial]) from [<bf016618>] (usb_serial_module_exit+0x14/0x1c [sierra])
      [<bf016618>] (usb_serial_module_exit [sierra]) from [<c009d6cc>] (SyS_delete_module+0x184/0x210)
      [<c009d6cc>] (SyS_delete_module) from [<c000f880>] (ret_fast_syscall+0x0/0x48)
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      10164c2a
    • T
      usb: wusbcore: fix panic in wusbhc_chid_set · bd130ada
      Thomas Pugliese 提交于
      If no valid CHID value has previously been set on an HWA, writing a
      value of all zeros will cause a kernel panic in uwb_radio_stop because
      wusbhc->uwb_rc has not been set.  This patch skips the call to
      uwb_radio_stop if wusbhc->uwb_rc has not been initialized.
      Signed-off-by: NThomas Pugliese <thomas.pugliese@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bd130ada
    • T
      usb: wusbcore: convert nested lock to use spin_lock instead of spin_lock_irq · 7584f2eb
      Thomas Pugliese 提交于
      Nesting a spin_lock_irq/unlock_irq inside a lock that has already
      disabled interrupts will enable interrupts before we are ready when
      spin_unlock_irq is called.  This patch converts the inner lock to use
      spin_lock and spin_unlock instead.
      Signed-off-by: NThomas Pugliese <thomas.pugliese@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7584f2eb
    • P
      usb: chipidea: coordinate usb phy initialization for different phy type · cd84f009
      Peter Chen 提交于
      For internal PHY (like UTMI), the phy clock may from internal pll,
      it is on/off on the fly, the access PORTSC.PTS will hang without
      phy clock. So, the usb_phy_init which will open phy clock needs to
      be called before hw_phymode_configure.
      See: http://marc.info/?l=linux-arm-kernel&m=139350618732108&w=2
      
      For external PHY (like ulpi), it needs to configure portsc.pts before
      visit viewport, or the viewport can't be visited. so phy_phymode_configure
      needs to be called before usb_phy_init.
      See: cd0b42c2
      
      It may not the best solution, but it can work for all situations.
      
      Cc: Sascha Hauer <s.hauer@pengutronix.de>
      Cc: Chris Ruehl <chris.ruehl@gtsys.com.hk>
      Cc: shc_work@mail.ru
      Cc: denis@eukrea.com
      Cc: festevam@gmail.com
      Cc: stable <stable@vger.kernel.org> # 3.14
      Signed-off-by: NPeter Chen <peter.chen@freescale.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      cd84f009
  3. 21 4月, 2014 3 次提交
    • D
      usb: phy: am335x-control: wait 1ms after power-up transitions · a31a942a
      Daniel Mack 提交于
      Tests have shown that when a power-up transition is followed by other
      PHY operations too quickly, the USB port appears dead. Waiting 1ms fixes
      this problem.
      Signed-off-by: NDaniel Mack <zonque@gmail.com>
      Cc: stable@vger.kernel.org [3.14]
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      a31a942a
    • M
      usb: gadget: f_rndis: reduce NETTX irq caused by free skb header · 2656c9e2
      Macpaul Lin 提交于
      This patch reduce unecessary NETTX softirq call caused by
      free skb header. You will see this softirq comes twice while
      there is only one TX packet to be transmitted.
      
      So using dev_kfree_skb() instead of dev_kfree_skb_any() to
      avoid this problem.
      
      Cc: David S. Miller <davem@davemloft.net>
      Cc: Stephen Hemminger <shemminger@vyatta.com>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NMacpaul Lin <macpaul@gmail.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      2656c9e2
    • F
      Revert "usb: gadget: u_ether: move hardware transmit to RX NAPI" · 9189a330
      Felipe Balbi 提交于
      This reverts commit 716fb91d.
      
      That commit caused a regression which would end up in a kernel
      BUG() as below:
      
      [  101.554300] g_ether gadget: full-speed config #1: CDC Subset/SAFE
      [  101.585186] ------------[ cut here ]------------
      [  101.600587] kernel BUG at include/linux/netdevice.h:495!
      [  101.615850] Internal error: Oops - BUG: 0 [#1] PREEMPT ARM
      [  101.645539] Modules linked in:
      [  101.660483] CPU: 0 PID: 0 Comm: swapper Not tainted 3.15.0-rc1+ #104
      [  101.690175] task: c05dc5c8 ti: c05d2000 task.ti: c05d2000
      [  101.705579] PC is at eth_start+0x64/0x8c
      [  101.720981] LR is at __netif_schedule+0x7c/0x90
      [  101.736455] pc : [<c0299174>]    lr : [<c036a134>]    psr: 60000093
      [  101.736455] sp : c05d3d18  ip : c05d3cf8  fp : c05d3d2c
      [  101.782340] r10: 00000000  r9 : c196c1f0  r8 : c196c1a0
      [  101.797823] r7 : 00000000  r6 : 00000002  r5 : c1976400  r4 : c1976400
      [  101.828058] r3 : 00000000  r2 : c05d3ce8  r1 : 00000001  r0 : 00000002
      [  101.858722] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM Segment kernel
      Reported-by: NRobert Jarzmik <robert.jarzmik@free.fr>
      Signed-of-by: NFelipe Balbi <balbi@ti.com>
      9189a330
  4. 17 4月, 2014 19 次提交
  5. 16 4月, 2014 3 次提交