All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
To: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
	barebox@lists.infradead.org
Subject: Re: [PATCH 1/6] USB: Fix stale usb devices in usb_device_list
Date: Thu, 24 Jul 2014 20:51:15 +0200	[thread overview]
Message-ID: <53D155A3.7030306@gmail.com> (raw)
In-Reply-To: <53D12FA0.70507@gmail.com>

On 07/24/2014 06:09 PM, Sebastian Hesselbarth wrote:
> On 07/24/2014 03:28 PM, Sebastian Hesselbarth wrote:
>> New usb devices are added to a list of usb devices, but when removing
>> the corresponding usb_device it was not removed from that list. Fix it
>> by deleting it properly from the usb_device_list.
>>
>> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
>> ---
>> To: Sascha Hauer <s.hauer@pengutronix.de>
>> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
>> Cc: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
>> Cc: barebox@lists.infradead.org
>> ---
>>   drivers/usb/core/usb.c | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
>> index 351e783b6536..2cc338465539 100644
>> --- a/drivers/usb/core/usb.c
>> +++ b/drivers/usb/core/usb.c
>> @@ -472,6 +472,7 @@ void usb_remove_device(struct usb_device *usbdev)
>>           dev_err(&usbdev->dev, "failed to unregister\n");
>>
>>       usbdev->parent->children[usbdev->portnr - 1] = NULL;
>> +    list_del(&usbdev->list);
> 
> Unfortunately, this breaks usb_remove_device when called on a
> device that has not yet gone through usb_new_device().
> 
> I'll have a closer look at it.

Ok, this patch is fine as is.

The issue comes from  usb_hub_port_connect_change():

/* Disconnect any existing devices under this port */
if (((!(portstatus & USB_PORT_STAT_CONNECTION)) &&
     (!(portstatus & USB_PORT_STAT_ENABLE))) || (dev->children[port])) {
	dev_dbg(&dev->dev, "usb_disconnect(&hub->children[port]);\n");
	usb_remove_device(dev->children[port]);
	/* Return now if nothing is connected */
	if (!(portstatus & USB_PORT_STAT_CONNECTION))
	return;
}

Above will call usb_remove_device() if CONNECTION _and_ ENABLE is not
set *or* dev->children[port] is set.

Although very unlikely we encounter a device removal without having
successfully detected the device (and set dev->children[port]) before,
we should never call usb_remove_device() with NULL.

To me it looks like somebody tried to invert above checks at some
point and failed.

Replacing the check with something more readable solves the issue
I have been suffering (ok, it was during testing USB3.0 stuff):

if (dev->children[port] && !(portstatus & USB_PORT_STAT_CONNECTION)) {
	dev_dbg(&dev->dev, "disconnect detected on port %d\n", port + 1);
	usb_remove_device(dev->children[port]);
	return;
}

/* Deallocate disabled but connected devices */
if (dev->children[port] && !(portstatus & USB_PORT_STAT_ENABLE))
	usb_remove_device(dev->children[port]);

Also, a check for usbdev == NULL in usb_remove_device() to make
sure it never happens again.

I'll send a v2 of xHCI anyway, so I'll add a patch on top.

Sebastian

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2014-07-24 18:51 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-24 13:28 [PATCH 0/6] Minor USB fixes and xHCI driver Sebastian Hesselbarth
2014-07-24 13:28 ` [PATCH 1/6] USB: Fix stale usb devices in usb_device_list Sebastian Hesselbarth
2014-07-24 16:09   ` Sebastian Hesselbarth
2014-07-24 18:51     ` Sebastian Hesselbarth [this message]
2014-07-24 13:28 ` [PATCH 2/6] USB: Count detected USB devices independent of dev_index Sebastian Hesselbarth
2014-07-24 13:28 ` [PATCH 3/6] USB: EHCI: use min3 from Linux Sebastian Hesselbarth
2014-07-24 13:28 ` [PATCH 4/6] include: import {lower,upper}_32_bits helpers Sebastian Hesselbarth
2014-07-24 13:28 ` [PATCH 5/6] USB: host: add xHCI HCD, Hub, and platform driver Sebastian Hesselbarth
2014-07-24 13:46   ` Sebastian Hesselbarth
2014-07-24 13:28 ` [PATCH 6/6] USB: host: add xHCI PCI driver Sebastian Hesselbarth
2014-07-24 19:11 ` [PATCH 0/6] Minor USB fixes and xHCI driver Sebastian Hesselbarth
2014-07-25  7:32 ` Sascha Hauer
2014-07-25 14:40   ` Sebastian Hesselbarth
2014-07-25 15:34     ` Sebastian Hesselbarth

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=53D155A3.7030306@gmail.com \
    --to=sebastian.hesselbarth@gmail.com \
    --cc=barebox@lists.infradead.org \
    --cc=s.hauer@pengutronix.de \
    --cc=thomas.petazzoni@free-electrons.com \
    /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 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.