Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3719126pxv; Mon, 26 Jul 2021 10:10:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw8msTiOavjDFIbgi7Aa3B0x1Ilm/sZS4UA55LeaR5EeawwOUhKaVlKVOaMjWySPBAE0V5C X-Received: by 2002:ac8:5553:: with SMTP id o19mr15913493qtr.22.1627319422617; Mon, 26 Jul 2021 10:10:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627319422; cv=none; d=google.com; s=arc-20160816; b=MNz8oFRdZ34IwSxo7OTUprygbCgfycgpggqATkP8UH8HN0UrmNbfLjLFYAEw1YjS/8 iVQNStiPGnAcIAbOWzq/YrNSOBKa2BM4KfsLgL5h8J/NuFwjsTfOUXARc3QpUF2Ccc9a 55YPu3RB5cUYyIz2JotG1JAepn4hHDaNQHRBSX7zPAYLscBl8kh21C39VDgjYfjqkvB5 qoWSf1BVPWvgHl3TRAAX45d5JlemJinQChkrQEgHs16B2yNTFDdaQOWCm1a5jlMinmoM /35eOTyirzAZlRyz4l160SHhwXnti2AGf4VatzpuhgaKovhdX6pUmsMZc3pg9z0Nqcey QFxA== 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=brUiFvO5gzqzcPgx6n3GfYK63s6e0C9KsM2pWsn+J9g=; b=rwEnv5b4xbsHRaYwkkiZUoImbIsqkRWJ4t+0VcplJ08yrGccFsGMscUB0e82/F92+4 21aV8Th+CPPzgIigUvf2bnYQoFuJt3oRu2ghG1wDCE95i0SmezynU6NsZrUXfpgAa7av GnTv9zXItxPICoWtuWkKqNFvyXEj5IGOZbese244UTbbVfZmhburpB5aHorCcAMyLT5p VOYKVoB9ChUJjXB4qVGRsWao0A9Br1LllrYnu3yimH7nxwrruC3k/RaN8KY+q14Fzz8G Py7Vhg3RoCbfZcPW7simHT/JuEMIk6da+FWtNLfViMObbIBva9U3gIKCqHDGYiNQJxi8 7hDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=TRiJ4lFB; 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 jp6si258660qvb.107.2021.07.26.10.09.46; Mon, 26 Jul 2021 10:10:22 -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=TRiJ4lFB; 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 S238508AbhGZPnR (ORCPT + 99 others); Mon, 26 Jul 2021 11:43:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:39772 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237912AbhGZPYX (ORCPT ); Mon, 26 Jul 2021 11:24:23 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 59C7160EB2; Mon, 26 Jul 2021 16:04:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315490; bh=7jeLQY3uEFdBWW/3pMKNyz0vfUZYdysOoJw28M9PfaU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TRiJ4lFBbypaph2AezjBDZenFkfsrolxVV9UPK8NvzMrSjj2TQwwRHxjQBvNfj6z/ DzQwMGErL36qt180lGExjoyaKyOxUSE1A7wWcHwEl5y9lJ2/efI2gtGWY2ww2A9xox W4RdBRQyig4jmfuiCe4nuW+guJfDU8TU7L1UB0yQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mathias Nyman Subject: [PATCH 5.10 118/167] xhci: Fix lost USB 2 remote wake Date: Mon, 26 Jul 2021 17:39:11 +0200 Message-Id: <20210726153843.364980828@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153839.371771838@linuxfoundation.org> References: <20210726153839.371771838@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 @@ -1552,11 +1552,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);