Re: Active URB submitted twice in pegasus driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 26 Mar 2013, Sarah Sharp wrote:

On Tue, Mar 26, 2013 at 05:22:07PM +0200, Petko Manolov wrote:
On Mon, 25 Mar 2013, Sarah Sharp wrote:

Hi Petko,

I'm testing a USB to ethernet adapter with Greg's usb-linus branch (based
on 3.9-rc4).  I'm seeing an odd behavior, and I'm suspicious that a
second behavior found by Stephen Hemminger may also be related:

http://marc.info/?l=linux-usb&m=136364625519235&w=2

When I load the pegasus driver for this adapter (without an ethernet
cable hooked to it), and this is on a cold system boot or a complete
unloading and reloading of the usbcore, I get the following warning:

Unfortunately the machine i ran my tests on does not have xHCI nor i
used Greg's tree.  I did not observe this warning on both 3.8.4 and
Linus' 3.9-rc4.  It looks like to me that the issue is outside the
driver code.

Or it could be a race condition that's only triggered by the xHCI driver
(or me having xHCI debugging turned on).  Control transfer completions
may be delayed when I have debug turned on.

They most likely are. However, considering the stuff below these delays may not be the real cause.

The only other USB to ethernet adapter I have is also an ADMteck device:

Bus 001 Device 008: ID 07a6:8513 ADMtek, Inc. AN8513 Ethernet

I've got another one, rtl8150 based adapter. The way things look i'll have to do some testing on my own.

What do you mean by an asynchronous call?  Do you mean that
xxx_set_multicast() could be called at any time?

Yep. The first call to pegasus_set_multicast() is done by the network layer upon device insertion and those often happen outside process context.

After taking a brief glance at the pegasus code, pegasus_set_multicast looks broken. It sets the control URB status to zero and calls ctrl_callback(), which does some stuff if the URB status is zero. It doesn't look like pegasus_set_multicast() is an URB callback function, so why in the world is it touching a control URB that could possibly be in flight else where?

Beats me, i've got nothing to do with this driver. :-P

Anyway, playing with the URB status looks rather stupid and is definitely a bug. I'll make a patch that fixes the problem.

It looks like the control URB is used to do things like get or set registers, so what's stopping the upper layers from calling get registers (which will submit the control URB and schedule a wait queue), and then pegasus_set_multicast(), which will go overwrite the active URB status? USB device drivers should not be writing or reading fields in a submitted URB until the completion handler's callback function is called.

Err, see my previous comment. It can't be me. Maybe i've been too drunk. Or stupid. Or both... :-)
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux