All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH] usb: hub: Fix locking issues with address0_mutex
@ 2021-12-30  6:33 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-12-30  6:33 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 22120 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
References: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
TO: Mathias Nyman <mathias.nyman@linux.intel.com>

Hi Mathias,

I love your patch! Perhaps something to improve:

[auto build test WARNING on next-20211123]
[cannot apply to usb/usb-testing v5.16-rc2 v5.16-rc1 v5.15 v5.16-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Mathias-Nyman/usb-hub-Fix-locking-issues-with-address0_mutex/20211123-181633
base:    aacdecce8147c20b01f865b4e214bb8dbe8c4af1
:::::: branch date: 5 weeks ago
:::::: commit date: 5 weeks ago
config: x86_64-randconfig-c002-20211123 (https://download.01.org/0day-ci/archive/20211230/202112301433.c5uiNFlK-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@lip6.fr>


cocci warnings: (new ones prefixed by >>)
>> drivers/usb/core/hub.c:5250:2-12: second lock on line 5250

vim +5250 drivers/usb/core/hub.c

a4f55d8b8c146f David Heinzelmann         2019-10-09  5179  
af376a461cf075 Dan Williams              2014-05-20  5180  static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
af376a461cf075 Dan Williams              2014-05-20  5181  		u16 portchange)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5182  {
94c43b9897abf4 Alan Stern                2017-08-01  5183  	int status = -ENODEV;
94c43b9897abf4 Alan Stern                2017-08-01  5184  	int i;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5185  	unsigned unit_load;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5186  	struct usb_device *hdev = hub->hdev;
90da096ee46b68 Balaji Rao                2007-11-22  5187  	struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
d99f6b41308779 Dan Williams              2014-05-20  5188  	struct usb_port *port_dev = hub->ports[port1 - 1];
af376a461cf075 Dan Williams              2014-05-20  5189  	struct usb_device *udev = port_dev->child;
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5190  	static int unreliable_port = -1;
0e162125abbf80 Mathias Nyman             2021-11-23  5191  	bool retry_locked;
8808f00c7adfc8 Alan Stern                2008-04-28  5192  
24618b0cd42f93 Alan Stern                2008-04-28  5193  	/* Disconnect any existing devices under this port */
b76baa8154335a Peter Chen                2012-11-09  5194  	if (udev) {
b2108f1e519e98 Peter Chen                2014-11-04  5195  		if (hcd->usb_phy && !hdev->parent)
3d46e73dfdb840 Antoine Tenart            2014-09-24  5196  			usb_phy_notify_disconnect(hcd->usb_phy, udev->speed);
d99f6b41308779 Dan Williams              2014-05-20  5197  		usb_disconnect(&port_dev->child);
b76baa8154335a Peter Chen                2012-11-09  5198  	}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5199  
253e05724f9230 Alan Stern                2009-10-27  5200  	/* We can forget about a "removed" device when there's a physical
253e05724f9230 Alan Stern                2009-10-27  5201  	 * disconnect or the connect status changes.
253e05724f9230 Alan Stern                2009-10-27  5202  	 */
253e05724f9230 Alan Stern                2009-10-27  5203  	if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern                2009-10-27  5204  			(portchange & USB_PORT_STAT_C_CONNECTION))
253e05724f9230 Alan Stern                2009-10-27  5205  		clear_bit(port1, hub->removed_bits);
253e05724f9230 Alan Stern                2009-10-27  5206  
5257d97a219e17 Alan Stern                2008-09-22  5207  	if (portchange & (USB_PORT_STAT_C_CONNECTION |
5257d97a219e17 Alan Stern                2008-09-22  5208  				USB_PORT_STAT_C_ENABLE)) {
ad493e5e580546 Lan Tianyu                2013-01-23  5209  		status = hub_port_debounce_be_stable(hub, port1);
5257d97a219e17 Alan Stern                2008-09-22  5210  		if (status < 0) {
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5211  			if (status != -ENODEV &&
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5212  				port1 != unreliable_port &&
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5213  				printk_ratelimit())
dd5f5006d10355 Takashi Iwai              2014-08-19  5214  				dev_err(&port_dev->dev, "connect-debounce failed\n");
5257d97a219e17 Alan Stern                2008-09-22  5215  			portstatus &= ~USB_PORT_STAT_CONNECTION;
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5216  			unreliable_port = port1;
5257d97a219e17 Alan Stern                2008-09-22  5217  		} else {
5257d97a219e17 Alan Stern                2008-09-22  5218  			portstatus = status;
5257d97a219e17 Alan Stern                2008-09-22  5219  		}
5257d97a219e17 Alan Stern                2008-09-22  5220  	}
5257d97a219e17 Alan Stern                2008-09-22  5221  
253e05724f9230 Alan Stern                2009-10-27  5222  	/* Return now if debouncing failed or nothing is connected or
253e05724f9230 Alan Stern                2009-10-27  5223  	 * the device was "removed".
253e05724f9230 Alan Stern                2009-10-27  5224  	 */
253e05724f9230 Alan Stern                2009-10-27  5225  	if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern                2009-10-27  5226  			test_bit(port1, hub->removed_bits)) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5227  
fbaecff06a7db4 Deepak Das                2015-01-21  5228  		/*
fbaecff06a7db4 Deepak Das                2015-01-21  5229  		 * maybe switch power back on (e.g. root hub was reset)
fbaecff06a7db4 Deepak Das                2015-01-21  5230  		 * but only if the port isn't owned by someone else.
fbaecff06a7db4 Deepak Das                2015-01-21  5231  		 */
9262c19d14c433 Dan Williams              2014-05-20  5232  		if (hub_is_port_power_switchable(hub)
fbaecff06a7db4 Deepak Das                2015-01-21  5233  				&& !port_is_power_on(hub, portstatus)
fbaecff06a7db4 Deepak Das                2015-01-21  5234  				&& !port_dev->port_owner)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5235  			set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5236  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5237  		if (portstatus & USB_PORT_STAT_ENABLE)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5238  			goto done;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5239  		return;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5240  	}
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5241  	if (hub_is_superspeed(hub->hdev))
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5242  		unit_load = 150;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5243  	else
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5244  		unit_load = 100;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5245  
e9e88fb7bca9f5 Alan Stern                2013-03-27  5246  	status = 0;
6ae6dc22d2d1ce Mathias Nyman             2021-11-16  5247  
19502e6911e4ef Alan Stern                2020-09-28  5248  	for (i = 0; i < PORT_INIT_TRIES; i++) {
0e162125abbf80 Mathias Nyman             2021-11-23  5249  		usb_lock_port(port_dev);
0e162125abbf80 Mathias Nyman             2021-11-23 @5250  		mutex_lock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5251  		retry_locked = true;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5252  		/* reallocate for each attempt, since references
^1da177e4c3f41 Linus Torvalds            2005-04-16  5253  		 * to the previous one can escape in various ways
^1da177e4c3f41 Linus Torvalds            2005-04-16  5254  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5255  		udev = usb_alloc_dev(hdev, hdev->bus, port1);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5256  		if (!udev) {
d99f6b41308779 Dan Williams              2014-05-20  5257  			dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams              2014-05-20  5258  					"couldn't allocate usb_device\n");
0e162125abbf80 Mathias Nyman             2021-11-23  5259  			mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5260  			usb_unlock_port(port_dev);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5261  			goto done;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5262  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5263  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5264  		usb_set_device_state(udev, USB_STATE_POWERED);
55c527187c9d78 Alan Stern                2005-11-23  5265  		udev->bus_mA = hub->mA_per_port;
b6956ffa595db9 Alan Stern                2006-08-30  5266  		udev->level = hdev->level + 1;
8af548dc8e36f8 Inaky Perez-Gonzalez      2008-04-08  5267  		udev->wusb = hub_is_wusb(hub);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5268  
8a1b2725a60d32 Mathias Nyman             2015-12-10  5269  		/* Devices connected to SuperSpeed hubs are USB 3.0 or later */
131dec344d5e41 Sarah Sharp               2010-12-06  5270  		if (hub_is_superspeed(hub->hdev))
e7b7717247f61e Sarah Sharp               2009-04-27  5271  			udev->speed = USB_SPEED_SUPER;
e7b7717247f61e Sarah Sharp               2009-04-27  5272  		else
e7b7717247f61e Sarah Sharp               2009-04-27  5273  			udev->speed = USB_SPEED_UNKNOWN;
e7b7717247f61e Sarah Sharp               2009-04-27  5274  
3b29b68b162778 Alan Stern                2011-02-22  5275  		choose_devnum(udev);
c6515272b85874 Sarah Sharp               2009-04-27  5276  		if (udev->devnum <= 0) {
c6515272b85874 Sarah Sharp               2009-04-27  5277  			status = -ENOTCONN;	/* Don't retry */
c6515272b85874 Sarah Sharp               2009-04-27  5278  			goto loop;
c6515272b85874 Sarah Sharp               2009-04-27  5279  		}
c6515272b85874 Sarah Sharp               2009-04-27  5280  
e7b7717247f61e Sarah Sharp               2009-04-27  5281  		/* reset (non-USB 3.0 devices) and get descriptor */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5282  		status = hub_port_init(hub, udev, port1, i);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5283  		if (status < 0)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5284  			goto loop;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5285  
6ae6dc22d2d1ce Mathias Nyman             2021-11-16  5286  		mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5287  		usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman             2021-11-23  5288  		retry_locked = false;
6ae6dc22d2d1ce Mathias Nyman             2021-11-16  5289  
93362a875fc698 Phil Dibowitz             2010-07-22  5290  		if (udev->quirks & USB_QUIRK_DELAY_INIT)
b2a542bbb3081d Dmitry Fleytman           2017-09-05  5291  			msleep(2000);
93362a875fc698 Phil Dibowitz             2010-07-22  5292  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5293  		/* consecutive bus-powered hubs aren't reliable; they can
^1da177e4c3f41 Linus Torvalds            2005-04-16  5294  		 * violate the voltage drop budget.  if the new child has
^1da177e4c3f41 Linus Torvalds            2005-04-16  5295  		 * a "powered" LED, users should notice we didn't enable it
^1da177e4c3f41 Linus Torvalds            2005-04-16  5296  		 * (without reading syslog), even without per-port LEDs
^1da177e4c3f41 Linus Torvalds            2005-04-16  5297  		 * on the parent.
^1da177e4c3f41 Linus Torvalds            2005-04-16  5298  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5299  		if (udev->descriptor.bDeviceClass == USB_CLASS_HUB
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5300  				&& udev->bus_mA <= unit_load) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5301  			u16	devstat;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5302  
d9e1e1484ade39 Felipe Balbi              2017-11-02  5303  			status = usb_get_std_status(udev, USB_RECIP_DEVICE, 0,
^1da177e4c3f41 Linus Torvalds            2005-04-16  5304  					&devstat);
15b7336e02d998 Alan Stern                2013-07-30  5305  			if (status) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5306  				dev_dbg(&udev->dev, "get status %d ?\n", status);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5307  				goto loop_disable;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5308  			}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5309  			if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5310  				dev_err(&udev->dev,
^1da177e4c3f41 Linus Torvalds            2005-04-16  5311  					"can't connect bus-powered hub "
^1da177e4c3f41 Linus Torvalds            2005-04-16  5312  					"to this port\n");
^1da177e4c3f41 Linus Torvalds            2005-04-16  5313  				if (hub->has_indicators) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5314  					hub->indicator[port1-1] =
^1da177e4c3f41 Linus Torvalds            2005-04-16  5315  						INDICATOR_AMBER_BLINK;
22f6a0f0e3549b Shaibal Dutta             2014-02-01  5316  					queue_delayed_work(
22f6a0f0e3549b Shaibal Dutta             2014-02-01  5317  						system_power_efficient_wq,
22f6a0f0e3549b Shaibal Dutta             2014-02-01  5318  						&hub->leds, 0);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5319  				}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5320  				status = -ENOTCONN;	/* Don't retry */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5321  				goto loop_disable;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5322  			}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5323  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5324  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5325  		/* check for devices running slower than they could */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5326  		if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0200
^1da177e4c3f41 Linus Torvalds            2005-04-16  5327  				&& udev->speed == USB_SPEED_FULL
^1da177e4c3f41 Linus Torvalds            2005-04-16  5328  				&& highspeed_hubs != 0)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5329  			check_highspeed(hub, udev, port1);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5330  
fa286188ce0fce Greg Kroah-Hartman        2012-05-14  5331  		/* Store the parent's children[] pointer.  At this point
^1da177e4c3f41 Linus Torvalds            2005-04-16  5332  		 * udev becomes globally accessible, although presumably
^1da177e4c3f41 Linus Torvalds            2005-04-16  5333  		 * no one will look at it until hdev is unlocked.
^1da177e4c3f41 Linus Torvalds            2005-04-16  5334  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5335  		status = 0;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5336  
d8521afe35862f Dan Williams              2014-05-20  5337  		mutex_lock(&usb_port_peer_mutex);
d8521afe35862f Dan Williams              2014-05-20  5338  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5339  		/* We mustn't add new devices if the parent hub has
^1da177e4c3f41 Linus Torvalds            2005-04-16  5340  		 * been disconnected; we would race with the
^1da177e4c3f41 Linus Torvalds            2005-04-16  5341  		 * recursively_mark_NOTATTACHED() routine.
^1da177e4c3f41 Linus Torvalds            2005-04-16  5342  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5343  		spin_lock_irq(&device_state_lock);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5344  		if (hdev->state == USB_STATE_NOTATTACHED)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5345  			status = -ENOTCONN;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5346  		else
d99f6b41308779 Dan Williams              2014-05-20  5347  			port_dev->child = udev;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5348  		spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams              2014-05-20  5349  		mutex_unlock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5350  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5351  		/* Run it through the hoops (find a driver, etc) */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5352  		if (!status) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5353  			status = usb_new_device(udev);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5354  			if (status) {
d8521afe35862f Dan Williams              2014-05-20  5355  				mutex_lock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5356  				spin_lock_irq(&device_state_lock);
d99f6b41308779 Dan Williams              2014-05-20  5357  				port_dev->child = NULL;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5358  				spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams              2014-05-20  5359  				mutex_unlock(&usb_port_peer_mutex);
01ed67dc70834d Tony Zheng                2014-10-17  5360  			} else {
01ed67dc70834d Tony Zheng                2014-10-17  5361  				if (hcd->usb_phy && !hdev->parent)
01ed67dc70834d Tony Zheng                2014-10-17  5362  					usb_phy_notify_connect(hcd->usb_phy,
01ed67dc70834d Tony Zheng                2014-10-17  5363  							udev->speed);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5364  			}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5365  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5366  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5367  		if (status)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5368  			goto loop_disable;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5369  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5370  		status = hub_power_remaining(hub);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5371  		if (status)
d99f6b41308779 Dan Williams              2014-05-20  5372  			dev_dbg(hub->intfdev, "%dmA power budget left\n", status);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5373  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5374  		return;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5375  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5376  loop_disable:
^1da177e4c3f41 Linus Torvalds            2005-04-16  5377  		hub_port_disable(hub, port1, 1);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5378  loop:
fc721f5194dc98 Inaky Perez-Gonzalez      2008-04-08  5379  		usb_ep0_reinit(udev);
3b29b68b162778 Alan Stern                2011-02-22  5380  		release_devnum(udev);
f7410ced7f931b Herbert Xu                2010-01-10  5381  		hub_free_dev(udev);
0e162125abbf80 Mathias Nyman             2021-11-23  5382  		if (retry_locked) {
0e162125abbf80 Mathias Nyman             2021-11-23  5383  			mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5384  			usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman             2021-11-23  5385  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5386  		usb_put_dev(udev);
ffcdc18d64d73e Vikram Pandita            2007-05-25  5387  		if ((status == -ENOTCONN) || (status == -ENOTSUPP))
^1da177e4c3f41 Linus Torvalds            2005-04-16  5388  			break;
973593a960ddac Mike Looijmans            2017-11-09  5389  
973593a960ddac Mike Looijmans            2017-11-09  5390  		/* When halfway through our retry count, power-cycle the port */
19502e6911e4ef Alan Stern                2020-09-28  5391  		if (i == (PORT_INIT_TRIES - 1) / 2) {
973593a960ddac Mike Looijmans            2017-11-09  5392  			dev_info(&port_dev->dev, "attempt power cycle\n");
973593a960ddac Mike Looijmans            2017-11-09  5393  			usb_hub_set_port_power(hdev, hub, port1, false);
973593a960ddac Mike Looijmans            2017-11-09  5394  			msleep(2 * hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans            2017-11-09  5395  			usb_hub_set_port_power(hdev, hub, port1, true);
973593a960ddac Mike Looijmans            2017-11-09  5396  			msleep(hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans            2017-11-09  5397  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5398  	}
3a31155cfff093 Alan Stern                2008-05-20  5399  	if (hub->hdev->parent ||
3a31155cfff093 Alan Stern                2008-05-20  5400  			!hcd->driver->port_handed_over ||
e9e88fb7bca9f5 Alan Stern                2013-03-27  5401  			!(hcd->driver->port_handed_over)(hcd, port1)) {
e9e88fb7bca9f5 Alan Stern                2013-03-27  5402  		if (status != -ENOTCONN && status != -ENODEV)
d99f6b41308779 Dan Williams              2014-05-20  5403  			dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams              2014-05-20  5404  					"unable to enumerate USB device\n");
e9e88fb7bca9f5 Alan Stern                2013-03-27  5405  	}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5406  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5407  done:
^1da177e4c3f41 Linus Torvalds            2005-04-16  5408  	hub_port_disable(hub, port1, 1);
94c43b9897abf4 Alan Stern                2017-08-01  5409  	if (hcd->driver->relinquish_port && !hub->hdev->parent) {
94c43b9897abf4 Alan Stern                2017-08-01  5410  		if (status != -ENOTCONN && status != -ENODEV)
90da096ee46b68 Balaji Rao                2007-11-22  5411  			hcd->driver->relinquish_port(hcd, port1);
94c43b9897abf4 Alan Stern                2017-08-01  5412  	}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5413  }
^1da177e4c3f41 Linus Torvalds            2005-04-16  5414  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 3+ messages in thread
* Re: [PATCH] usb: hub: Fix locking issues with address0_mutex
@ 2021-11-23 19:56 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-11-23 19:56 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 22125 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
References: <20211123101656.1113518-1-mathias.nyman@linux.intel.com>
TO: Mathias Nyman <mathias.nyman@linux.intel.com>

Hi Mathias,

I love your patch! Perhaps something to improve:

[auto build test WARNING on next-20211123]
[cannot apply to usb/usb-testing v5.16-rc2 v5.16-rc1 v5.15 v5.16-rc2]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Mathias-Nyman/usb-hub-Fix-locking-issues-with-address0_mutex/20211123-181633
base:    aacdecce8147c20b01f865b4e214bb8dbe8c4af1
:::::: branch date: 10 hours ago
:::::: commit date: 10 hours ago
config: x86_64-randconfig-c002-20211123 (https://download.01.org/0day-ci/archive/20211124/202111240336.DQZAobmU-lkp(a)intel.com/config.gz)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@lip6.fr>


cocci warnings: (new ones prefixed by >>)
>> drivers/usb/core/hub.c:5250:2-12: second lock on line 5250

vim +5250 drivers/usb/core/hub.c

a4f55d8b8c146f David Heinzelmann         2019-10-09  5179  
af376a461cf075 Dan Williams              2014-05-20  5180  static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
af376a461cf075 Dan Williams              2014-05-20  5181  		u16 portchange)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5182  {
94c43b9897abf4 Alan Stern                2017-08-01  5183  	int status = -ENODEV;
94c43b9897abf4 Alan Stern                2017-08-01  5184  	int i;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5185  	unsigned unit_load;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5186  	struct usb_device *hdev = hub->hdev;
90da096ee46b68 Balaji Rao                2007-11-22  5187  	struct usb_hcd *hcd = bus_to_hcd(hdev->bus);
d99f6b41308779 Dan Williams              2014-05-20  5188  	struct usb_port *port_dev = hub->ports[port1 - 1];
af376a461cf075 Dan Williams              2014-05-20  5189  	struct usb_device *udev = port_dev->child;
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5190  	static int unreliable_port = -1;
0e162125abbf80 Mathias Nyman             2021-11-23  5191  	bool retry_locked;
8808f00c7adfc8 Alan Stern                2008-04-28  5192  
24618b0cd42f93 Alan Stern                2008-04-28  5193  	/* Disconnect any existing devices under this port */
b76baa8154335a Peter Chen                2012-11-09  5194  	if (udev) {
b2108f1e519e98 Peter Chen                2014-11-04  5195  		if (hcd->usb_phy && !hdev->parent)
3d46e73dfdb840 Antoine Tenart            2014-09-24  5196  			usb_phy_notify_disconnect(hcd->usb_phy, udev->speed);
d99f6b41308779 Dan Williams              2014-05-20  5197  		usb_disconnect(&port_dev->child);
b76baa8154335a Peter Chen                2012-11-09  5198  	}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5199  
253e05724f9230 Alan Stern                2009-10-27  5200  	/* We can forget about a "removed" device when there's a physical
253e05724f9230 Alan Stern                2009-10-27  5201  	 * disconnect or the connect status changes.
253e05724f9230 Alan Stern                2009-10-27  5202  	 */
253e05724f9230 Alan Stern                2009-10-27  5203  	if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern                2009-10-27  5204  			(portchange & USB_PORT_STAT_C_CONNECTION))
253e05724f9230 Alan Stern                2009-10-27  5205  		clear_bit(port1, hub->removed_bits);
253e05724f9230 Alan Stern                2009-10-27  5206  
5257d97a219e17 Alan Stern                2008-09-22  5207  	if (portchange & (USB_PORT_STAT_C_CONNECTION |
5257d97a219e17 Alan Stern                2008-09-22  5208  				USB_PORT_STAT_C_ENABLE)) {
ad493e5e580546 Lan Tianyu                2013-01-23  5209  		status = hub_port_debounce_be_stable(hub, port1);
5257d97a219e17 Alan Stern                2008-09-22  5210  		if (status < 0) {
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5211  			if (status != -ENODEV &&
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5212  				port1 != unreliable_port &&
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5213  				printk_ratelimit())
dd5f5006d10355 Takashi Iwai              2014-08-19  5214  				dev_err(&port_dev->dev, "connect-debounce failed\n");
5257d97a219e17 Alan Stern                2008-09-22  5215  			portstatus &= ~USB_PORT_STAT_CONNECTION;
5ee0f803cc3a07 Oliver Neukum             2014-07-14  5216  			unreliable_port = port1;
5257d97a219e17 Alan Stern                2008-09-22  5217  		} else {
5257d97a219e17 Alan Stern                2008-09-22  5218  			portstatus = status;
5257d97a219e17 Alan Stern                2008-09-22  5219  		}
5257d97a219e17 Alan Stern                2008-09-22  5220  	}
5257d97a219e17 Alan Stern                2008-09-22  5221  
253e05724f9230 Alan Stern                2009-10-27  5222  	/* Return now if debouncing failed or nothing is connected or
253e05724f9230 Alan Stern                2009-10-27  5223  	 * the device was "removed".
253e05724f9230 Alan Stern                2009-10-27  5224  	 */
253e05724f9230 Alan Stern                2009-10-27  5225  	if (!(portstatus & USB_PORT_STAT_CONNECTION) ||
253e05724f9230 Alan Stern                2009-10-27  5226  			test_bit(port1, hub->removed_bits)) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5227  
fbaecff06a7db4 Deepak Das                2015-01-21  5228  		/*
fbaecff06a7db4 Deepak Das                2015-01-21  5229  		 * maybe switch power back on (e.g. root hub was reset)
fbaecff06a7db4 Deepak Das                2015-01-21  5230  		 * but only if the port isn't owned by someone else.
fbaecff06a7db4 Deepak Das                2015-01-21  5231  		 */
9262c19d14c433 Dan Williams              2014-05-20  5232  		if (hub_is_port_power_switchable(hub)
fbaecff06a7db4 Deepak Das                2015-01-21  5233  				&& !port_is_power_on(hub, portstatus)
fbaecff06a7db4 Deepak Das                2015-01-21  5234  				&& !port_dev->port_owner)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5235  			set_port_feature(hdev, port1, USB_PORT_FEAT_POWER);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5236  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5237  		if (portstatus & USB_PORT_STAT_ENABLE)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5238  			goto done;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5239  		return;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5240  	}
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5241  	if (hub_is_superspeed(hub->hdev))
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5242  		unit_load = 150;
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5243  	else
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5244  		unit_load = 100;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5245  
e9e88fb7bca9f5 Alan Stern                2013-03-27  5246  	status = 0;
6ae6dc22d2d1ce Mathias Nyman             2021-11-16  5247  
19502e6911e4ef Alan Stern                2020-09-28  5248  	for (i = 0; i < PORT_INIT_TRIES; i++) {
0e162125abbf80 Mathias Nyman             2021-11-23  5249  		usb_lock_port(port_dev);
0e162125abbf80 Mathias Nyman             2021-11-23 @5250  		mutex_lock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5251  		retry_locked = true;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5252  		/* reallocate for each attempt, since references
^1da177e4c3f41 Linus Torvalds            2005-04-16  5253  		 * to the previous one can escape in various ways
^1da177e4c3f41 Linus Torvalds            2005-04-16  5254  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5255  		udev = usb_alloc_dev(hdev, hdev->bus, port1);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5256  		if (!udev) {
d99f6b41308779 Dan Williams              2014-05-20  5257  			dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams              2014-05-20  5258  					"couldn't allocate usb_device\n");
0e162125abbf80 Mathias Nyman             2021-11-23  5259  			mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5260  			usb_unlock_port(port_dev);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5261  			goto done;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5262  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5263  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5264  		usb_set_device_state(udev, USB_STATE_POWERED);
55c527187c9d78 Alan Stern                2005-11-23  5265  		udev->bus_mA = hub->mA_per_port;
b6956ffa595db9 Alan Stern                2006-08-30  5266  		udev->level = hdev->level + 1;
8af548dc8e36f8 Inaky Perez-Gonzalez      2008-04-08  5267  		udev->wusb = hub_is_wusb(hub);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5268  
8a1b2725a60d32 Mathias Nyman             2015-12-10  5269  		/* Devices connected to SuperSpeed hubs are USB 3.0 or later */
131dec344d5e41 Sarah Sharp               2010-12-06  5270  		if (hub_is_superspeed(hub->hdev))
e7b7717247f61e Sarah Sharp               2009-04-27  5271  			udev->speed = USB_SPEED_SUPER;
e7b7717247f61e Sarah Sharp               2009-04-27  5272  		else
e7b7717247f61e Sarah Sharp               2009-04-27  5273  			udev->speed = USB_SPEED_UNKNOWN;
e7b7717247f61e Sarah Sharp               2009-04-27  5274  
3b29b68b162778 Alan Stern                2011-02-22  5275  		choose_devnum(udev);
c6515272b85874 Sarah Sharp               2009-04-27  5276  		if (udev->devnum <= 0) {
c6515272b85874 Sarah Sharp               2009-04-27  5277  			status = -ENOTCONN;	/* Don't retry */
c6515272b85874 Sarah Sharp               2009-04-27  5278  			goto loop;
c6515272b85874 Sarah Sharp               2009-04-27  5279  		}
c6515272b85874 Sarah Sharp               2009-04-27  5280  
e7b7717247f61e Sarah Sharp               2009-04-27  5281  		/* reset (non-USB 3.0 devices) and get descriptor */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5282  		status = hub_port_init(hub, udev, port1, i);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5283  		if (status < 0)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5284  			goto loop;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5285  
6ae6dc22d2d1ce Mathias Nyman             2021-11-16  5286  		mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5287  		usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman             2021-11-23  5288  		retry_locked = false;
6ae6dc22d2d1ce Mathias Nyman             2021-11-16  5289  
93362a875fc698 Phil Dibowitz             2010-07-22  5290  		if (udev->quirks & USB_QUIRK_DELAY_INIT)
b2a542bbb3081d Dmitry Fleytman           2017-09-05  5291  			msleep(2000);
93362a875fc698 Phil Dibowitz             2010-07-22  5292  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5293  		/* consecutive bus-powered hubs aren't reliable; they can
^1da177e4c3f41 Linus Torvalds            2005-04-16  5294  		 * violate the voltage drop budget.  if the new child has
^1da177e4c3f41 Linus Torvalds            2005-04-16  5295  		 * a "powered" LED, users should notice we didn't enable it
^1da177e4c3f41 Linus Torvalds            2005-04-16  5296  		 * (without reading syslog), even without per-port LEDs
^1da177e4c3f41 Linus Torvalds            2005-04-16  5297  		 * on the parent.
^1da177e4c3f41 Linus Torvalds            2005-04-16  5298  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5299  		if (udev->descriptor.bDeviceClass == USB_CLASS_HUB
430ee58e03f1ed Sebastian Andrzej Siewior 2012-12-18  5300  				&& udev->bus_mA <= unit_load) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5301  			u16	devstat;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5302  
d9e1e1484ade39 Felipe Balbi              2017-11-02  5303  			status = usb_get_std_status(udev, USB_RECIP_DEVICE, 0,
^1da177e4c3f41 Linus Torvalds            2005-04-16  5304  					&devstat);
15b7336e02d998 Alan Stern                2013-07-30  5305  			if (status) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5306  				dev_dbg(&udev->dev, "get status %d ?\n", status);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5307  				goto loop_disable;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5308  			}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5309  			if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5310  				dev_err(&udev->dev,
^1da177e4c3f41 Linus Torvalds            2005-04-16  5311  					"can't connect bus-powered hub "
^1da177e4c3f41 Linus Torvalds            2005-04-16  5312  					"to this port\n");
^1da177e4c3f41 Linus Torvalds            2005-04-16  5313  				if (hub->has_indicators) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5314  					hub->indicator[port1-1] =
^1da177e4c3f41 Linus Torvalds            2005-04-16  5315  						INDICATOR_AMBER_BLINK;
22f6a0f0e3549b Shaibal Dutta             2014-02-01  5316  					queue_delayed_work(
22f6a0f0e3549b Shaibal Dutta             2014-02-01  5317  						system_power_efficient_wq,
22f6a0f0e3549b Shaibal Dutta             2014-02-01  5318  						&hub->leds, 0);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5319  				}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5320  				status = -ENOTCONN;	/* Don't retry */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5321  				goto loop_disable;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5322  			}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5323  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5324  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5325  		/* check for devices running slower than they could */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5326  		if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0200
^1da177e4c3f41 Linus Torvalds            2005-04-16  5327  				&& udev->speed == USB_SPEED_FULL
^1da177e4c3f41 Linus Torvalds            2005-04-16  5328  				&& highspeed_hubs != 0)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5329  			check_highspeed(hub, udev, port1);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5330  
fa286188ce0fce Greg Kroah-Hartman        2012-05-14  5331  		/* Store the parent's children[] pointer.  At this point
^1da177e4c3f41 Linus Torvalds            2005-04-16  5332  		 * udev becomes globally accessible, although presumably
^1da177e4c3f41 Linus Torvalds            2005-04-16  5333  		 * no one will look at it until hdev is unlocked.
^1da177e4c3f41 Linus Torvalds            2005-04-16  5334  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5335  		status = 0;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5336  
d8521afe35862f Dan Williams              2014-05-20  5337  		mutex_lock(&usb_port_peer_mutex);
d8521afe35862f Dan Williams              2014-05-20  5338  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5339  		/* We mustn't add new devices if the parent hub has
^1da177e4c3f41 Linus Torvalds            2005-04-16  5340  		 * been disconnected; we would race with the
^1da177e4c3f41 Linus Torvalds            2005-04-16  5341  		 * recursively_mark_NOTATTACHED() routine.
^1da177e4c3f41 Linus Torvalds            2005-04-16  5342  		 */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5343  		spin_lock_irq(&device_state_lock);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5344  		if (hdev->state == USB_STATE_NOTATTACHED)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5345  			status = -ENOTCONN;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5346  		else
d99f6b41308779 Dan Williams              2014-05-20  5347  			port_dev->child = udev;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5348  		spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams              2014-05-20  5349  		mutex_unlock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5350  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5351  		/* Run it through the hoops (find a driver, etc) */
^1da177e4c3f41 Linus Torvalds            2005-04-16  5352  		if (!status) {
^1da177e4c3f41 Linus Torvalds            2005-04-16  5353  			status = usb_new_device(udev);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5354  			if (status) {
d8521afe35862f Dan Williams              2014-05-20  5355  				mutex_lock(&usb_port_peer_mutex);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5356  				spin_lock_irq(&device_state_lock);
d99f6b41308779 Dan Williams              2014-05-20  5357  				port_dev->child = NULL;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5358  				spin_unlock_irq(&device_state_lock);
d8521afe35862f Dan Williams              2014-05-20  5359  				mutex_unlock(&usb_port_peer_mutex);
01ed67dc70834d Tony Zheng                2014-10-17  5360  			} else {
01ed67dc70834d Tony Zheng                2014-10-17  5361  				if (hcd->usb_phy && !hdev->parent)
01ed67dc70834d Tony Zheng                2014-10-17  5362  					usb_phy_notify_connect(hcd->usb_phy,
01ed67dc70834d Tony Zheng                2014-10-17  5363  							udev->speed);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5364  			}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5365  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5366  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5367  		if (status)
^1da177e4c3f41 Linus Torvalds            2005-04-16  5368  			goto loop_disable;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5369  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5370  		status = hub_power_remaining(hub);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5371  		if (status)
d99f6b41308779 Dan Williams              2014-05-20  5372  			dev_dbg(hub->intfdev, "%dmA power budget left\n", status);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5373  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5374  		return;
^1da177e4c3f41 Linus Torvalds            2005-04-16  5375  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5376  loop_disable:
^1da177e4c3f41 Linus Torvalds            2005-04-16  5377  		hub_port_disable(hub, port1, 1);
^1da177e4c3f41 Linus Torvalds            2005-04-16  5378  loop:
fc721f5194dc98 Inaky Perez-Gonzalez      2008-04-08  5379  		usb_ep0_reinit(udev);
3b29b68b162778 Alan Stern                2011-02-22  5380  		release_devnum(udev);
f7410ced7f931b Herbert Xu                2010-01-10  5381  		hub_free_dev(udev);
0e162125abbf80 Mathias Nyman             2021-11-23  5382  		if (retry_locked) {
0e162125abbf80 Mathias Nyman             2021-11-23  5383  			mutex_unlock(hcd->address0_mutex);
0e162125abbf80 Mathias Nyman             2021-11-23  5384  			usb_unlock_port(port_dev);
0e162125abbf80 Mathias Nyman             2021-11-23  5385  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5386  		usb_put_dev(udev);
ffcdc18d64d73e Vikram Pandita            2007-05-25  5387  		if ((status == -ENOTCONN) || (status == -ENOTSUPP))
^1da177e4c3f41 Linus Torvalds            2005-04-16  5388  			break;
973593a960ddac Mike Looijmans            2017-11-09  5389  
973593a960ddac Mike Looijmans            2017-11-09  5390  		/* When halfway through our retry count, power-cycle the port */
19502e6911e4ef Alan Stern                2020-09-28  5391  		if (i == (PORT_INIT_TRIES - 1) / 2) {
973593a960ddac Mike Looijmans            2017-11-09  5392  			dev_info(&port_dev->dev, "attempt power cycle\n");
973593a960ddac Mike Looijmans            2017-11-09  5393  			usb_hub_set_port_power(hdev, hub, port1, false);
973593a960ddac Mike Looijmans            2017-11-09  5394  			msleep(2 * hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans            2017-11-09  5395  			usb_hub_set_port_power(hdev, hub, port1, true);
973593a960ddac Mike Looijmans            2017-11-09  5396  			msleep(hub_power_on_good_delay(hub));
973593a960ddac Mike Looijmans            2017-11-09  5397  		}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5398  	}
3a31155cfff093 Alan Stern                2008-05-20  5399  	if (hub->hdev->parent ||
3a31155cfff093 Alan Stern                2008-05-20  5400  			!hcd->driver->port_handed_over ||
e9e88fb7bca9f5 Alan Stern                2013-03-27  5401  			!(hcd->driver->port_handed_over)(hcd, port1)) {
e9e88fb7bca9f5 Alan Stern                2013-03-27  5402  		if (status != -ENOTCONN && status != -ENODEV)
d99f6b41308779 Dan Williams              2014-05-20  5403  			dev_err(&port_dev->dev,
d99f6b41308779 Dan Williams              2014-05-20  5404  					"unable to enumerate USB device\n");
e9e88fb7bca9f5 Alan Stern                2013-03-27  5405  	}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5406  
^1da177e4c3f41 Linus Torvalds            2005-04-16  5407  done:
^1da177e4c3f41 Linus Torvalds            2005-04-16  5408  	hub_port_disable(hub, port1, 1);
94c43b9897abf4 Alan Stern                2017-08-01  5409  	if (hcd->driver->relinquish_port && !hub->hdev->parent) {
94c43b9897abf4 Alan Stern                2017-08-01  5410  		if (status != -ENOTCONN && status != -ENODEV)
90da096ee46b68 Balaji Rao                2007-11-22  5411  			hcd->driver->relinquish_port(hcd, port1);
94c43b9897abf4 Alan Stern                2017-08-01  5412  	}
^1da177e4c3f41 Linus Torvalds            2005-04-16  5413  }
^1da177e4c3f41 Linus Torvalds            2005-04-16  5414  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 3+ messages in thread
* [PATCH] usb: hub: Fix locking issues with address0_mutex
@ 2021-11-23 10:16 Mathias Nyman
  0 siblings, 0 replies; 3+ messages in thread
From: Mathias Nyman @ 2021-11-23 10:16 UTC (permalink / raw)
  To: gregkh
  Cc: m.szyprowski, stern, kishon, hdegoede, chris.chiu, linux-usb,
	Mathias Nyman, stable

Fix the circular lock dependency and unbalanced unlock of addess0_mutex
introduced when fixing an address0_mutex enumeration retry race in commit
ae6dc22d2d1 ("usb: hub: Fix usb enumeration issue due to address0 race")

Make sure locking order between port_dev->status_lock and address0_mutex
is correct, and that address0_mutex is not unlocked in hub_port_connect
"done:" codepath which may be reached without locking address0_mutex

Fixes: 6ae6dc22d2d1 ("usb: hub: Fix usb enumeration issue due to address0 race")
Cc: <stable@vger.kernel.org>
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
 drivers/usb/core/hub.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 9f0d1af8be6f..e907dfa0ca6d 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -5190,6 +5190,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 	struct usb_port *port_dev = hub->ports[port1 - 1];
 	struct usb_device *udev = port_dev->child;
 	static int unreliable_port = -1;
+	bool retry_locked;
 
 	/* Disconnect any existing devices under this port */
 	if (udev) {
@@ -5246,10 +5247,10 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 
 	status = 0;
 
-	mutex_lock(hcd->address0_mutex);
-
 	for (i = 0; i < PORT_INIT_TRIES; i++) {
-
+		usb_lock_port(port_dev);
+		mutex_lock(hcd->address0_mutex);
+		retry_locked = true;
 		/* reallocate for each attempt, since references
 		 * to the previous one can escape in various ways
 		 */
@@ -5257,6 +5258,8 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		if (!udev) {
 			dev_err(&port_dev->dev,
 					"couldn't allocate usb_device\n");
+			mutex_unlock(hcd->address0_mutex);
+			usb_unlock_port(port_dev);
 			goto done;
 		}
 
@@ -5278,13 +5281,13 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		}
 
 		/* reset (non-USB 3.0 devices) and get descriptor */
-		usb_lock_port(port_dev);
 		status = hub_port_init(hub, udev, port1, i);
-		usb_unlock_port(port_dev);
 		if (status < 0)
 			goto loop;
 
 		mutex_unlock(hcd->address0_mutex);
+		usb_unlock_port(port_dev);
+		retry_locked = false;
 
 		if (udev->quirks & USB_QUIRK_DELAY_INIT)
 			msleep(2000);
@@ -5374,11 +5377,14 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 
 loop_disable:
 		hub_port_disable(hub, port1, 1);
-		mutex_lock(hcd->address0_mutex);
 loop:
 		usb_ep0_reinit(udev);
 		release_devnum(udev);
 		hub_free_dev(udev);
+		if (retry_locked) {
+			mutex_unlock(hcd->address0_mutex);
+			usb_unlock_port(port_dev);
+		}
 		usb_put_dev(udev);
 		if ((status == -ENOTCONN) || (status == -ENOTSUPP))
 			break;
@@ -5401,8 +5407,6 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 	}
 
 done:
-	mutex_unlock(hcd->address0_mutex);
-
 	hub_port_disable(hub, port1, 1);
 	if (hcd->driver->relinquish_port && !hub->hdev->parent) {
 		if (status != -ENOTCONN && status != -ENODEV)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-12-30  6:33 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-12-30  6:33 [PATCH] usb: hub: Fix locking issues with address0_mutex kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2021-11-23 19:56 kernel test robot
2021-11-23 10:16 Mathias Nyman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.