Re: [PATCH] USB: gadget: fix ethernet gadget crash in gether_setup

From: David Miller
Date: Mon Nov 01 2010 - 12:22:29 EST


From: MichaÅ MirosÅaw <mirqus@xxxxxxxxx>
Date: Mon, 1 Nov 2010 17:16:39 +0100

> 2010/10/28 Dmitry Artamonow <mad_soft@xxxxxxxx>:
>> Crash is triggered by commit e6484930d7 ("net: allocate tx queues in
>> register_netdevice"), which moved tx netqueue creation into register_netdev.
>> So now calling netif_stop_queue() before register_netdev causes an oops.
>> Move netif_stop_queue() after net device registration to fix crash.
>>
>> Signed-off-by: Dmitry Artamonow <mad_soft@xxxxxxxx>
>> ---
>> Âdrivers/usb/gadget/u_ether.c | Â Â2 +-
>> Â1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
>> index 6bb876d..cb23355 100644
>> --- a/drivers/usb/gadget/u_ether.c
>> +++ b/drivers/usb/gadget/u_ether.c
>> @@ -797,7 +797,6 @@ int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN])
>> Â Â Â Â * Â- iff DATA transfer is active, carrier is "on"
>> Â Â Â Â * Â- tx queueing enabled if open *and* carrier is "on"
>> Â Â Â Â */
>> - Â Â Â netif_stop_queue(net);
>> Â Â Â Ânetif_carrier_off(net);
>>
>> Â Â Â Âdev->gadget = g;
>> @@ -812,6 +811,7 @@ int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN])
>> Â Â Â Â Â Â Â ÂINFO(dev, "MAC %pM\n", net->dev_addr);
>> Â Â Â Â Â Â Â ÂINFO(dev, "HOST MAC %pM\n", dev->host_mac);
>>
>> + Â Â Â Â Â Â Â netif_stop_queue(net);
>> Â Â Â Â Â Â Â Âthe_dev = dev;
>> Â Â Â Â}
>>
>
> What about a race between register_netdev() -> open() -> rest of
> gether_setup() ? What is this netif_stop_queue() here needed for?

Nothing, it should be completely removed.
N‹§²æìr¸›yúèšØb²X¬¶ÇvØ^–)Þ{.nÇ+‰·¥Š{±‘êçzX§¶›¡Ü}©ž²ÆzÚ&j:+v‰¨¾«‘êçzZ+€Ê+zf£¢·hšˆ§~†­†Ûiÿûàz¹®w¥¢¸?™¨è­Ú&¢)ßf”ù^jÇy§m…á@A«a¶Úÿ 0¶ìh®å’i