Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp126858rdf; Mon, 20 Nov 2023 19:24:22 -0800 (PST) X-Google-Smtp-Source: AGHT+IEsbeg4K931aXnPype8EqXOWMqxInu08NJX904LQScgzgBJeW674cf3cXXX5YhTt6NHCc2E X-Received: by 2002:a81:b2c5:0:b0:5ca:eca:700b with SMTP id q188-20020a81b2c5000000b005ca0eca700bmr3455499ywh.52.1700537061931; Mon, 20 Nov 2023 19:24:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700537061; cv=none; d=google.com; s=arc-20160816; b=MEXh8ZNpQg3FtgLOf8aI1dQ9m6+4MZkO728ai4xjTSD1Ct9xXt4xO+4BmRcQ1YDPAp 4FmGfTaWUbNgygD+usT1CWO2wWHA7r8ceBMCXCIHuNfvsG9+SmSn/WLwmQC/PBZIaJ03 Lesa6usrE2SQu4Edq5kr9lnWZdX7LGXnP9pUjigkTUmEUSw+e/MvQ0Ft7V5Opd+AlkPx MiMPN9vHJc/cYbKOeQjSMFKDYgkB9QkNlxoLDf/ZUHYe1Vs9myDGsu3K6VH6zAxUAf++ KqKupC+LG8lKFm0KDzUoTIkshUXJY6bR5J2kJUMnAKWqf/kl+WFPxTE2JSzOQgtXbROx Nh1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=XDrr9bM3PHykVHLDjRjYj0TBVb7iFAC/0d9okuu8lkw=; fh=3GGISRxhtXt3uLW6/2Q1kaUywk8vWaHkw/jSHeUbM4g=; b=VvcL4Td7AxUxUDB2qQni0XM3HkoSUl/OHF2hiUlARNDWmh5DZ3Deb0jUPlZZG276jV u0W2LFL8kg8nFTOFIu6xDxDxByv4xBhxrcZJmSoy+yJvoM54noqDPef4ox8fGH2CBY6Q /VptVpXoOYO8McsMnn56m36uzKMXzVNG9xcopjqaNoKfLF5IdSLpxGZ+gdk0rVYB+nlL rNvC/dTZuISysRKFA0nkqWDR+lhOhEHYKPW/zz+UHM6IeuWD2B3NooTqNiiPmz/JfEb/ 0IaZ8HCyMSqsUj93YT85emDHhEej2T33fTqX9t8Gy2whdv4WUG0Pa4jyjYsFBsRM6sZp i+tQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=JJyuaxJD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id f22-20020a631016000000b005a9b2800a08si9493468pgl.783.2023.11.20.19.24.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Nov 2023 19:24:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=JJyuaxJD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id C7E0780D6E7D; Mon, 20 Nov 2023 19:24:20 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233186AbjKUDYN (ORCPT + 99 others); Mon, 20 Nov 2023 22:24:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229539AbjKUDYM (ORCPT ); Mon, 20 Nov 2023 22:24:12 -0500 Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E7334C1 for ; Mon, 20 Nov 2023 19:24:08 -0800 (PST) Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1ce5b72e743so67265ad.1 for ; Mon, 20 Nov 2023 19:24:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1700537048; x=1701141848; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=XDrr9bM3PHykVHLDjRjYj0TBVb7iFAC/0d9okuu8lkw=; b=JJyuaxJDla0W/AjZ56GX5FUTJVItRL9szlqSURr9FCJyhNCO5G6Ivb17YZKUla4ZCJ sXTpFOn5CXpCHX040+aEoeVqnk/DBP0ySbWPdFmG9a7W0iisV68VhJlvTZi4gocLJO9y 4x1/QWKY+ChXF0h2Y2D4TA8oMIHOGecy3pIjk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700537048; x=1701141848; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XDrr9bM3PHykVHLDjRjYj0TBVb7iFAC/0d9okuu8lkw=; b=MLfWnj0L35/CR29LlnQ6Q6EzjbiTMV7fBnp3IQxMTP7mulJ0Lkn/crGRtsoqss8xlU mmcCII28CCL75PaoVOx0zY/i5JKwEoHgCV1mzemSnvteqN+5voAA0oAl7Dc6APwq77vv wt3uUN+rkM3nC8H+98ikNKBERTfOIbyVbTzFdpWvBm7rUpv3VBQMXUAr4TD0l13qUeCg bzSkWvtotiVDP5aCQpDlZKs5FJeWes3qIqU25LK5vAI9yKr7CjmPQfmUNYx7I+L9pGCd IsQyAeDKibocVUv2ChJTBJHUFd0d7Q9FvpzkyNwuzah+/QlTVN2KPoaK0wH9NDs3M+NA MdVQ== X-Gm-Message-State: AOJu0YwL/uf+QT8jN3r9YuroB5xEppb0bKo98mowitCNrkkDwcS3b8G+ PGhNn/7wszJQ4V1gp6FszokAL8LNOJef4eReR240Ug== X-Received: by 2002:a17:902:ceca:b0:1cf:669b:6176 with SMTP id d10-20020a170902ceca00b001cf669b6176mr286868plg.16.1700537048028; Mon, 20 Nov 2023 19:24:08 -0800 (PST) MIME-Version: 1.0 References: <20231117130836.1.I77097aa9ec01aeca1b3c75fde4ba5007a17fdf76@changeid> In-Reply-To: <20231117130836.1.I77097aa9ec01aeca1b3c75fde4ba5007a17fdf76@changeid> From: Grant Grundler Date: Mon, 20 Nov 2023 19:23:56 -0800 Message-ID: Subject: Re: [PATCH 1/2] r8152: Hold the rtnl_lock for all of reset To: Douglas Anderson Cc: Jakub Kicinski , Hayes Wang , "David S . Miller" , Grant Grundler , Simon Horman , Edward Hill , linux-usb@vger.kernel.org, Laura Nao , Alan Stern , =?UTF-8?Q?Bj=C3=B8rn_Mork?= , Eric Dumazet , Paolo Abeni , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_SPF_WL autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 20 Nov 2023 19:24:21 -0800 (PST) On Fri, Nov 17, 2023 at 1:10=E2=80=AFPM Douglas Anderson wrote: > > As of commit d9962b0d4202 ("r8152: Block future register access if > register access fails") there is a race condition that can happen > between the USB device reset thread and napi_enable() (not) getting > called during rtl8152_open(). Specifically: > * While rtl8152_open() is running we get a register access error > that's _not_ -ENODEV and queue up a USB reset. > * rtl8152_open() exits before calling napi_enable() due to any reason > (including usb_submit_urb() returning an error). > > In that case: > * Since the USB reset is perform in a separate thread asynchronously, > it can run at anytime USB device lock is not held - even before > rtl8152_open() has exited with an error and caused __dev_open() to > clear the __LINK_STATE_START bit. > * The rtl8152_pre_reset() will notice that the netif_running() returns > true (since __LINK_STATE_START wasn't cleared) so it won't exit > early. > * rtl8152_pre_reset() will then hang in napi_disable() because > napi_enable() was never called. > > We can fix the race by making sure that the r8152 reset routines don't > run at the same time as we're opening the device. Specifically we need > the reset routines in their entirety rely on the return value of > netif_running(). The only way to reliably depend on that is for them > to hold the rntl_lock() mutex for the duration of reset. > > Grabbing the rntl_lock() mutex for the duration of reset seems like a > long time, but reset is not expected to be common and the rtnl_lock() > mutex is already held for long durations since the core grabs it > around the open/close calls. > > Fixes: d9962b0d4202 ("r8152: Block future register access if register acc= ess fails") > Signed-off-by: Douglas Anderson Reviewed-by: Grant Grundler BTW, for ChromeOS systems, the outcome of hang in napi_disable() is a "hung task" panic after 120 seconds. Fortunately, the stack trace made it relatively easy (compared to other hung tasks I've looked at) to unravel. Doug gets all the credit for figuring out this solution (using rtnl_lock())= . cheers, grant > --- > > drivers/net/usb/r8152.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c > index 2c5c1e91ded6..d6edf0254599 100644 > --- a/drivers/net/usb/r8152.c > +++ b/drivers/net/usb/r8152.c > @@ -8397,6 +8397,8 @@ static int rtl8152_pre_reset(struct usb_interface *= intf) > struct r8152 *tp =3D usb_get_intfdata(intf); > struct net_device *netdev; > > + rtnl_lock(); > + > if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) > return 0; > > @@ -8428,20 +8430,17 @@ static int rtl8152_post_reset(struct usb_interfac= e *intf) > struct sockaddr sa; > > if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) > - return 0; > + goto exit; > > rtl_set_accessible(tp); > > /* reset the MAC address in case of policy change */ > - if (determine_ethernet_addr(tp, &sa) >=3D 0) { > - rtnl_lock(); > + if (determine_ethernet_addr(tp, &sa) >=3D 0) > dev_set_mac_address (tp->netdev, &sa, NULL); > - rtnl_unlock(); > - } > > netdev =3D tp->netdev; > if (!netif_running(netdev)) > - return 0; > + goto exit; > > set_bit(WORK_ENABLE, &tp->flags); > if (netif_carrier_ok(netdev)) { > @@ -8460,6 +8459,8 @@ static int rtl8152_post_reset(struct usb_interface = *intf) > if (!list_empty(&tp->rx_done)) > napi_schedule(&tp->napi); > > +exit: > + rtnl_unlock(); > return 0; > } > > -- > 2.43.0.rc0.421.g78406f8d94-goog >