Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3678055pxv; Mon, 26 Jul 2021 09:13:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz25VkteS4GW31waQWdeOEeaIBo6dncoAPeymVXYuEDARCBmQRrd6+PzjyPfY6/DIEo8Cgy X-Received: by 2002:a17:906:f104:: with SMTP id gv4mr17884409ejb.193.1627316009760; Mon, 26 Jul 2021 09:13:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627316009; cv=none; d=google.com; s=arc-20160816; b=RLDX+cN9r7rTvmS5Cm2N//K3peMTuLttYzYdXYO+v+hvGb93ROwb10yTb41MWQQN57 fP4CeoWWQU8pb38QuWR+tqRBUIDF63WwikFWbf0ZccqChBVgWlWgZGYmjemq4P4xIcaX exzVbVMG93OIBvIVP2BKLR7JGQgv0XRNbOHHuO+/rxm6SoZnbv3lY58n4hit6/WDSoKu aV2NaNS9T0wkPHIGa4ZmwM74tBHYPkq7W9qBHAgsKkYv7hcP8TDcA6C2Uy8XevNLRQyC cK4/gkR0Wlq99tXylOt8pXhR7HbhFjh9fD4b2lCm8Z1gIZqhNCJrxDx5a5f99bvuJv+v k7Ig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Y2Cj3H9r+J6Ww1HuoYJBYXXFE4w5iFubKHfJDOzDt7Q=; b=jPTrTn5/db04CDvbeyEdvUauyme0tmVmZSkncBFuwSqAN74EVoBJqYO7VhpGMvJrc2 G5LiH2upjTuh65zse93LhkFlIupACDprDUcW14EaOtmqVvVFNGTUO6GG3uJ3G3Bkn2FQ q3eAiScYSa9Sy+BjtEYPszTkggnLMzmK0VQTtV3DaQ8zqhJ7X/GuoneP7fepfsfLuTQP 0KXLonK+f4gh3cC6QHKpRApqFSgtYG6yOU0mdqQtigMJB5ZNrSLKzZ0eYaYj0mdJtcMI 7IRAKDeErAe+dhKFyNYoa6+wcicagcuwd1m/9OWEXxe1sJ6HDkDYggWEFOxRspu96p6i iivg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Iz2abEeF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u15si346035edt.211.2021.07.26.09.13.00; Mon, 26 Jul 2021 09:13:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Iz2abEeF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233010AbhGZPay (ORCPT + 99 others); Mon, 26 Jul 2021 11:30:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:57962 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236830AbhGZPRp (ORCPT ); Mon, 26 Jul 2021 11:17:45 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 353BF60F42; Mon, 26 Jul 2021 15:58:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315090; bh=QpC5Ld/zp5CDaOVMzyDbllIAwSbCdnC2DMlrdzNzE0M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Iz2abEeFY3m8Sp6BSyyELgg5DnaWVR8k2NTMs75XW3NKT/mAbqIOhGrGzICq6ENVK B65iWKvVEbiFULbRMeUIAlknJ+erlmS4CyuAYnV2haY5TX07TMjY269WzuEM5kbIjV 9dGExXNjdnsX5I7KD0qjFycarZ34J5I7P9dRd11U= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mathias Nyman Subject: [PATCH 5.4 076/108] xhci: Fix lost USB 2 remote wake Date: Mon, 26 Jul 2021 17:39:17 +0200 Message-Id: <20210726153834.118781979@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153831.696295003@linuxfoundation.org> References: <20210726153831.696295003@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mathias Nyman commit 72f68bf5c756f5ce1139b31daae2684501383ad5 upstream. There's a small window where a USB 2 remote wake may be left unhandled due to a race between hub thread and xhci port event interrupt handler. When the resume event is detected in the xhci interrupt handler it kicks the hub timer, which should move the port from resume to U0 once resume has been signalled for long enough. To keep the hub "thread" running we set a bus_state->resuming_ports flag. This flag makes sure hub timer function kicks itself. checking this flag was not properly protected by the spinlock. Flag was copied to a local variable before lock was taken. The local variable was then checked later with spinlock held. If interrupt is handled right after copying the flag to the local variable we end up stopping the hub thread before it can handle the USB 2 resume. CPU0 CPU1 (hub thread) (xhci event handler) xhci_hub_status_data() status = bus_state->resuming_ports; handle_port_status() spin_lock() bus_state->resuming_ports = 1 set_flag(HCD_FLAG_POLL_RH) spin_unlock() spin_lock() if (!status) clear_flag(HCD_FLAG_POLL_RH) spin_unlock() Fix this by taking the lock a bit earlier so that it covers the resuming_ports flag copy in the hub thread Cc: Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20210715150651.1996099-2-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-hub.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1546,11 +1546,12 @@ int xhci_hub_status_data(struct usb_hcd * Inform the usbcore about resume-in-progress by returning * a non-zero value even if there are no status changes. */ + spin_lock_irqsave(&xhci->lock, flags); + status = bus_state->resuming_ports; mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC | PORT_CEC; - spin_lock_irqsave(&xhci->lock, flags); /* For each port, did anything change? If so, set that bit in buf. */ for (i = 0; i < max_ports; i++) { temp = readl(ports[i]->addr);