From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Sarah Sharp <sarah.a.sharp@linux.intel.com>,
ablay@codeaurora.org, Alan Stern <stern@rowland.harvard.edu>
Subject: [041/107] USB: Free bandwidth when usb_disable_device is called.
Date: Thu, 07 Jul 2011 17:16:13 -0700 [thread overview]
Message-ID: <20110708001656.695034229@clark.kroah.org> (raw)
In-Reply-To: <20110708001740.GA14031@kroah.com>
2.6.39-stable review patch. If anyone has any objections, please let us know.
------------------
From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
commit fccf4e86200b8f5edd9a65da26f150e32ba79808 upstream.
Tanya ran into an issue when trying to switch a UAS device from the BOT
configuration to the UAS configuration via the bConfigurationValue sysfs
file. Before installing the UAS configuration, set_bConfigurationValue()
calls usb_disable_device(). That function is supposed to remove all host
controller resources associated with that device, but it leaves some state
in the xHCI host controller.
Commit 0791971ba8fbc44e4f476079f856335ed45e6324
usb: allow drivers to use allocated bandwidth until unbound
added a call to usb_disable_device() in usb_set_configuration(), before
the xHCI bandwidth functions were invoked. That commit fixed a bug, but
also introduced a bug that is triggered when a configured device is
switched to a new configuration.
usb_disable_device() goes through all the motions of unbinding the drivers
attached to active interfaces and removing the USB core structures
associated with those interfaces, but it doesn't actually remove the
endpoints from the internal xHCI host controller bandwidth structures.
When usb_disable_device() calls usb_disable_endpoint() with reset_hardware
set to true, the entries in udev->ep_out and udev->ep_in will be set to
NULL. Usually, when the USB core installs a new configuration,
usb_hcd_alloc_bandwidth() will drop all non-NULL endpoints in udev->ep_out
and udev->ep_in before adding any new endpoints. However, when the new
UAS configuration was added, all those entries were null, so none of the
old endpoints in the BOT configuration were dropped.
The xHCI driver blindly added the UAS configuration endpoints, and some of
the endpoint addresses overlapped with the old BOT configuration
endpoints. This caused the xHCI host to reject the Configure Endpoint
command. Now that the xHCI driver code is cleaned up to reject a
double-add of active endpoints, we need to fix the USB core to properly
drop old endpoints in usb_disable_device().
If the host controller driver needs bandwidth checking support, make
usb_disable_device() call usb_disable_endpoint() with
reset_hardware set to false, drop the endpoints from the xHCI host
controller, and then call usb_disable_endpoint() again with
reset_hardware set to true.
The first call to usb_disable_endpoint() will cancel any pending URBs and
wait on them to be freed in usb_hcd_disable_endpoint(), but will keep the
pointers in udev->ep_out and udev->ep in intact. Then
usb_hcd_alloc_bandwidth() will use those pointers to know which endpoints
to drop.
The final call to usb_disable_endpoint() will do two things:
1. It will call usb_hcd_disable_endpoint() again, which should be harmless
since the ep->urb_list should be empty after the first call to
usb_disable_endpoint() returns.
2. It will set the entries in udev->ep_out and udev->ep in to NULL, and call
usb_hcd_disable_endpoint(). That call will have no effect, since the xHCI
driver doesn't set the endpoint_disable function pointer.
Note that usb_disable_device() will now need to be called with
hcd->bandwidth_mutex held.
This should be backported to kernels as old as 2.6.32.
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Reported-by: Tanya Brokhman <tlinder@codeaurora.org>
Cc: ablay@codeaurora.org
Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/usb/core/hub.c | 3 +++
drivers/usb/core/message.c | 15 ++++++++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1643,6 +1643,7 @@ void usb_disconnect(struct usb_device **
{
struct usb_device *udev = *pdev;
int i;
+ struct usb_hcd *hcd = bus_to_hcd(udev->bus);
if (!udev) {
pr_debug ("%s nodev\n", __func__);
@@ -1670,7 +1671,9 @@ void usb_disconnect(struct usb_device **
* so that the hardware is now fully quiesced.
*/
dev_dbg (&udev->dev, "unregistering device\n");
+ mutex_lock(hcd->bandwidth_mutex);
usb_disable_device(udev, 0);
+ mutex_unlock(hcd->bandwidth_mutex);
usb_hcd_synchronize_unlinks(udev);
usb_remove_ep_devs(&udev->ep0);
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1135,10 +1135,13 @@ void usb_disable_interface(struct usb_de
* Deallocates hcd/hardware state for the endpoints (nuking all or most
* pending urbs) and usbcore state for the interfaces, so that usbcore
* must usb_set_configuration() before any interfaces could be used.
+ *
+ * Must be called with hcd->bandwidth_mutex held.
*/
void usb_disable_device(struct usb_device *dev, int skip_ep0)
{
int i;
+ struct usb_hcd *hcd = bus_to_hcd(dev->bus);
/* getting rid of interfaces will disconnect
* any drivers bound to them (a key side effect)
@@ -1172,6 +1175,16 @@ void usb_disable_device(struct usb_devic
dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
skip_ep0 ? "non-ep0" : "all");
+ if (hcd->driver->check_bandwidth) {
+ /* First pass: Cancel URBs, leave endpoint pointers intact. */
+ for (i = skip_ep0; i < 16; ++i) {
+ usb_disable_endpoint(dev, i, false);
+ usb_disable_endpoint(dev, i + USB_DIR_IN, false);
+ }
+ /* Remove endpoints from the host controller internal state */
+ usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
+ /* Second pass: remove endpoint pointers */
+ }
for (i = skip_ep0; i < 16; ++i) {
usb_disable_endpoint(dev, i, true);
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
@@ -1727,6 +1740,7 @@ free_interfaces:
/* if it's already configured, clear out old state first.
* getting rid of old interfaces means unbinding their drivers.
*/
+ mutex_lock(hcd->bandwidth_mutex);
if (dev->state != USB_STATE_ADDRESS)
usb_disable_device(dev, 1); /* Skip ep0 */
@@ -1739,7 +1753,6 @@ free_interfaces:
* host controller will not allow submissions to dropped endpoints. If
* this call fails, the device state is unchanged.
*/
- mutex_lock(hcd->bandwidth_mutex);
ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL);
if (ret < 0) {
mutex_unlock(hcd->bandwidth_mutex);
next prev parent reply other threads:[~2011-07-08 5:02 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-08 0:17 [000/107] 2.6.39.3 review Greg KH
2011-07-08 0:15 ` [001/107] netfilter: ipset: Use proper timeout value to jiffies conversion Greg KH
2011-07-08 0:15 ` [002/107] net: fix ETHTOOL_SFEATURES compatibility with old ethtool_ops.set_flags Greg KH
2011-07-08 0:15 ` [003/107] netfilter: ipset: remove unused variable from type_pf_tdel() Greg KH
2011-07-08 0:15 ` [004/107] netfilter: ipset: fix ip_set_flush return code Greg KH
2011-07-08 0:15 ` [005/107] bug.h: Add WARN_RATELIMIT Greg KH
2011-07-08 0:15 ` [006/107] net: filter: Use WARN_RATELIMIT Greg KH
2011-07-08 0:15 ` [007/107] bug.h: Fix build with CONFIG_PRINTK disabled Greg KH
2011-07-08 0:15 ` [008/107] bug.h: Move ratelimit warn interfaces to ratelimit.h Greg KH
2011-07-08 0:15 ` [009/107] IPVS: bug in ip_vs_ftp, same list heaad used in all netns Greg KH
2011-07-08 0:15 ` [010/107] inetpeer: fix race in unused_list manipulations Greg KH
2011-07-08 0:15 ` [011/107] bridge: provide a cow_metrics method for fake_ops Greg KH
2011-07-08 0:15 ` [012/107] af_packet: prevent information leak Greg KH
2011-07-08 0:15 ` [013/107] inet_diag: fix inet_diag_bc_audit() Greg KH
2011-07-08 0:15 ` [014/107] net/ipv4: Check for mistakenly passed in non-IPv4 address Greg KH
2011-07-08 0:15 ` [015/107] ipv6/udp: Use the correct variable to determine non-blocking condition Greg KH
2011-07-08 0:15 ` [016/107] udp/recvmsg: Clear MSG_TRUNC flag when starting over for a new packet Greg KH
2011-07-08 0:15 ` [017/107] ksm: fix NULL pointer dereference in scan_get_next_rmap_item() Greg KH
2011-07-08 0:15 ` [018/107] drivers/tty/serial/pch_uart.c: dont oops if dmi_get_system_info returns NULL Greg KH
2011-07-08 0:15 ` [019/107] migrate: dont account swapcache as shmem Greg KH
2011-07-08 0:15 ` [020/107] hwmon: (ibmaem) Initialize sysfs attributes Greg KH
2011-07-08 0:15 ` [021/107] hwmon: (s3c) " Greg KH
2011-07-08 0:15 ` [022/107] hwmon: (ibmpex) " Greg KH
2011-07-08 0:15 ` [023/107] Revert "drm/i915: Enable GMBUS for post-gen2 chipsets" Greg KH
2011-07-08 0:15 ` [024/107] drm/radeon/kms/atom: fix duallink on some early DCE3.2 cards Greg KH
2011-07-08 0:15 ` [025/107] drm/radeon/kms: Fix chremap setup on RV770 CE Greg KH
2011-07-08 0:15 ` [026/107] drm/i915: Fix gen6 (SNB) missed BLT ring interrupts Greg KH
2011-07-08 6:13 ` Keith Packard
2011-07-08 14:45 ` Greg KH
2011-07-08 0:15 ` [027/107] drm: populate irq_by_busid-member for pci Greg KH
2011-07-08 0:16 ` [028/107] xen: support CONFIG_MAXSMP Greg KH
2011-07-08 0:16 ` [029/107] xen: partially revert "xen: set max_pfn_mapped to the last pfn mapped" Greg KH
2011-07-08 0:16 ` [030/107] xen/pci: Use the INT_SRC_OVR IRQ (instead of GSI) to preset the ACPI SCI IRQ Greg KH
2011-07-08 0:16 ` [031/107] xen/mmu: Fix for linker errors when CONFIG_SMP is not defined Greg KH
2011-07-08 0:16 ` [032/107] xen/pci: Move check for acpi_sci_override_gsi to xen_setup_acpi_sci Greg KH
2011-07-08 0:16 ` [033/107] clocksource: Make watchdog robust vs. interruption Greg KH
2011-07-08 0:16 ` [034/107] ARM: SAMSUNG: serial: Fix on handling of one clock source for UART Greg KH
2011-07-08 0:16 ` [035/107] TTY: ldisc, do not close until there are readers Greg KH
2011-07-08 0:16 ` [036/107] Connector: Set the CN_NETLINK_USERS correctly Greg KH
2011-07-08 0:16 ` [037/107] Connector: Correctly set the error code in case of success when dispatching receive callbacks Greg KH
2011-07-08 0:16 ` [038/107] xhci: Reject double add of active endpoints Greg KH
2011-07-08 0:16 ` [039/107] xhci: Add reset on resume quirk for asrock p67 host Greg KH
2011-07-08 0:16 ` [040/107] xhci: Always set urb->status to zero for isoc endpoints Greg KH
2011-07-08 0:16 ` Greg KH [this message]
2011-07-08 0:16 ` [042/107] USB: Add new FT232H chip to drivers/usb/serial/ftdi_sio.c Greg KH
2011-07-08 0:16 ` [043/107] mm/memory-failure.c: fix page isolated count mismatch Greg KH
2011-07-08 0:16 ` [044/107] PM: Free memory bitmaps if opening /dev/snapshot fails Greg KH
2011-07-08 0:16 ` [045/107] ath5k: fix memory leak when fewer than N_PD_CURVES are in use Greg KH
2011-07-08 0:16 ` [046/107] ath5k: Disable fast channel switching by default Greg KH
2011-07-08 0:16 ` [047/107] pxa168_eth: fix race in transmit path Greg KH
2011-07-08 6:20 ` Sachin Sanap
2011-07-08 14:43 ` Greg KH
2011-07-08 0:16 ` [048/107] ath9k: Fix suspend/resume when no interface is UP Greg KH
2011-07-08 0:16 ` [049/107] x86, suspend: Restore MISC_ENABLE MSR in realmode wakeup Greg KH
2011-07-08 0:16 ` [050/107] oprofile, x86: Fix race in nmi handler while starting counters Greg KH
2011-07-08 0:16 ` [051/107] mmc: tmio: fix regression in TMIO_MMC_WRPROTECT_DISABLE handling Greg KH
2011-07-08 0:16 ` [052/107] mmc: Add PCI fixup quirks for Ricoh 1180:e823 reader Greg KH
2011-07-08 0:16 ` [053/107] mm: fix negative commitlimit when gigantic hugepages are allocated Greg KH
2011-07-08 0:16 ` [054/107] block: add REQ_SECURE to REQ_COMMON_MASK Greg KH
2011-07-08 0:16 ` [055/107] NFS41: do not update isize if inode needs layoutcommit Greg KH
2011-07-08 0:16 ` [056/107] mm, hotplug: fix error handling in mem_online_node() Greg KH
2011-07-08 0:16 ` [057/107] ALSA: HDA: Remove quirk for an HP device Greg KH
2011-07-08 0:16 ` [058/107] ALSA: HDA: Add a new Conexant codec ID (506c) Greg KH
2011-07-08 0:16 ` [059/107] [media] rc: fix ghost keypresses with certain hw Greg KH
2011-07-08 0:16 ` [060/107] [media] lirc_zilog: fix spinning rx thread Greg KH
2011-07-08 0:16 ` [061/107] [media] keymaps: fix table for pinnacle pctv hd devices Greg KH
2011-07-08 0:16 ` [062/107] [media] uvcvideo: Remove buffers from the queues when freeing Greg KH
2011-07-08 0:16 ` [063/107] [media] ite-cir: 8709 needs to use pnp resource 2 Greg KH
2011-07-08 0:16 ` [064/107] watchdog: mtx1-wdt: request gpio before using it Greg KH
2011-07-08 0:16 ` [065/107] nfsd: v4 support requires CRYPTO Greg KH
2011-07-08 0:16 ` [066/107] nfsd: fix dependency of nfsd on auth_rpcgss Greg KH
2011-07-08 0:16 ` [067/107] nfsd: link returns nfserr_delay when breaking lease Greg KH
2011-07-08 0:16 ` [068/107] nfsd4: fix break_lease flags on nfsd open Greg KH
2011-07-08 0:16 ` [069/107] NFSv4.1: allow nfs_fhget to succeed with mounted on fileid Greg KH
2011-07-08 0:16 ` [070/107] NFSv4.1: allow zero fh array in filelayout decode layout Greg KH
2011-07-08 0:16 ` [071/107] NFSv4: Fix a readdir regression Greg KH
2011-07-08 0:16 ` [072/107] Input: properly assign return value of clamp() macro Greg KH
2011-07-08 0:16 ` [073/107] debugobjects: Fix boot crash when kmemleak and debugobjects enabled Greg KH
2011-07-08 0:16 ` [074/107] cfq-iosched: fix locking around ioc->ioc_data assignment Greg KH
2011-07-08 0:16 ` [075/107] cfq-iosched: fix a rcu warning Greg KH
2011-07-08 0:16 ` [076/107] cfq-iosched: make code consistent Greg KH
2011-07-08 0:16 ` [077/107] block: use the passed in @bdev when claiming if partno is zero Greg KH
2011-07-08 0:16 ` [078/107] PCI / PM: Block races between runtime PM and system sleep Greg KH
2011-07-08 0:16 ` [079/107] PM: Rename dev_pm_info.in_suspend to is_prepared Greg KH
2011-07-08 0:16 ` [080/107] PM: Fix async resume following suspend failure Greg KH
2011-07-08 0:16 ` [081/107] PM / Hibernate: Fix free_unnecessary_pages() Greg KH
2011-07-08 0:16 ` [082/107] KEYS: Fix error handling in construct_key_and_link() Greg KH
2011-07-08 0:16 ` [083/107] i2c-taos-evm: Fix log messages Greg KH
2011-07-08 0:16 ` [084/107] i2c/pca954x: Initialize the mux to disconnected state Greg KH
2011-07-08 0:16 ` [085/107] hfsplus: add missing call to bio_put() Greg KH
2011-07-08 0:16 ` [086/107] md: avoid endless recovery loop when waiting for fail device to complete Greg KH
2011-07-08 0:16 ` [087/107] SUNRPC: Ensure the RPC client only quits on fatal signals Greg KH
2011-07-08 0:17 ` [088/107] ASoC: pxa-ssp: Correct check for stream presence Greg KH
2011-07-08 0:17 ` [089/107] drivers/base/platform.c: dont mark platform_device_register_resndata() as __init_or_module Greg KH
2011-07-08 6:47 ` Uwe Kleine-König
2011-07-08 14:43 ` Greg KH
2011-07-08 0:17 ` [090/107] fs: fix lock initialization Greg KH
2011-07-08 0:17 ` [091/107] FS-Cache: Add a helper to bulk uncache pages on an inode Greg KH
2011-07-08 0:17 ` [092/107] 6pack,mkiss: fix lock inconsistency Greg KH
2011-07-08 0:17 ` [093/107] iwlagn: fix change_interface for P2P types Greg KH
2011-07-08 0:17 ` [094/107] drivers/misc/lkdtm.c: fix race when crashpoint is hit multiple times before checking count Greg KH
2011-07-08 0:17 ` [095/107] taskstats: dont allow duplicate entries in listener mode Greg KH
2011-07-08 0:17 ` [096/107] Fix CPU spinlock lockups on secondary CPU bringup Greg KH
2011-07-08 0:17 ` [097/107] NLM: Dont hang forever on NLM unlock requests Greg KH
2011-07-08 0:17 ` [098/107] USB: dont let errors prevent system sleep Greg KH
2011-07-08 0:17 ` [099/107] USB: dont let the hub driver " Greg KH
2011-07-08 0:17 ` [100/107] USB: fix regression occurring during device removal Greg KH
2011-07-08 0:17 ` [101/107] ipv4: fix multicast losses Greg KH
2011-07-08 0:17 ` [102/107] netfilter: Fix ip_route_me_harder triggering ip_rt_bug Greg KH
2011-07-08 0:17 ` [103/107] vlan: fix typo in vlan_dev_hard_start_xmit() Greg KH
2011-07-08 0:17 ` [104/107] xfrm: Fix off by one in the replay advance functions Greg KH
2011-07-08 0:17 ` [105/107] Revert "KVM: Save/restore state of assigned PCI device" Greg KH
2011-07-08 0:17 ` [106/107] KVM: Fix register corruption in pvclock_scale_delta Greg KH
2011-07-08 0:17 ` [107/107] IPVS netns exit causes crash in conntrack Greg KH
2011-07-08 2:06 ` [000/107] 2.6.39.3 review Stefan Lippers-Hollmann
2011-07-08 2:49 ` Greg KH
2011-07-08 2:53 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110708001656.695034229@clark.kroah.org \
--to=gregkh@suse.de \
--cc=ablay@codeaurora.org \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=sarah.a.sharp@linux.intel.com \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=stern@rowland.harvard.edu \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®