Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758482Ab0KAQWZ (ORCPT ); Mon, 1 Nov 2010 12:22:25 -0400 Received: from 74-93-104-97-Washington.hfc.comcastbusiness.net ([74.93.104.97]:60933 "EHLO sunset.davemloft.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755595Ab0KAQWX (ORCPT ); Mon, 1 Nov 2010 12:22:23 -0400 Date: Mon, 01 Nov 2010 09:22:46 -0700 (PDT) Message-Id: <20101101.092246.104046133.davem@davemloft.net> To: mirqus@gmail.com Cc: mad_soft@inbox.ru, linux-usb@vger.kernel.org, dbrownell@users.sourceforge.net, gregkh@suse.de, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, therbert@google.com Subject: Re: [PATCH] USB: gadget: fix ethernet gadget crash in gether_setup From: David Miller In-Reply-To: References: <1288253909-12084-1-git-send-email-mad_soft@inbox.ru> X-Mailer: Mew version 6.3 on Emacs 23.1 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Text/Plain; charset=utf-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id oA1GMeWo012562 Content-Length: 1804 Lines: 40 From: Michał Mirosław Date: Mon, 1 Nov 2010 17:16:39 +0100 > 2010/10/28 Dmitry Artamonow : >> 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 >> --- >>  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?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?