On Fri, 28 Aug 2015, Roland Weber wrote:

> Hmm, looks like my last two mails didn't get sent to the list.
> So, with some delay...
> 
> > > If you want, you could try an even finer bisection.  The commit you 
> > > identified adds a mutex_lock and a mutex_unlock, and it also changes an 
> > > alloc_ordered_workqueue to alloc_workqueue.  You could leave the mutex 
> > > stuff out and just include the alloc_workqueue change, or vice versa.
> 
> I've tried both. The kernel with just the mutex change is good. The one
> which only changes alloc_ordered_workqueue to alloc_workqueue is bad.

Interesting.  It's possible (though unlikely) that your problem arises
from a bug in the workqueue code rather than in the USB stack.

> Does that mean I'll have to dig into hardware specs next, to see if
> there's some restriction on the order in which ports must be probed
> or reset on that specific USB hub?

No hubs have any restrictions of that sort.  Besides, changing
alloc_ordered_workqueue to alloc_workqueue could affect the order in
which different hubs are managed, but it can't affect the order in
which ports within a single hub are handled.

> Or maybe I can gather some more
> debug information about the initialization? As long as I'm the only one
> bitten by this change, I wouldn't ask to simply revert it.

You can try the debugging patch below.  It will tell us when the items
on the workqueue get executed, which could be a useful clue.  You
should test this from a VT console with the logging level set high
enough so that the log messages show up on the screen.  That way you'll
be able to see them even after a hang.

Alan Stern



Index: usb-4.2/drivers/usb/core/hub.c
===================================================================
--- usb-4.2.orig/drivers/usb/core/hub.c
+++ usb-4.2/drivers/usb/core/hub.c
@@ -4990,6 +4990,8 @@ static void hub_event(struct work_struct
        hub_dev = hub->intfdev;
        intf = to_usb_interface(hub_dev);
 
+       dev_info(hub_dev, "entry\n");
+
        dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n",
                        hdev->state, hdev->maxchild,
                        /* NOTE: expects max 15 ports... */
@@ -5093,6 +5095,8 @@ out_autopm:
 out_hdev_lock:
        usb_unlock_device(hdev);
 
+       dev_info(hub_dev, "exit\n");
+
        /* Balance the stuff in kick_hub_wq() and allow autosuspend */
        usb_autopm_put_interface(intf);
        kref_put(&hub->kref, hub_release);

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to