Received: by 2002:a89:2c3:0:b0:1ed:23cc:44d1 with SMTP id d3csp588704lqs; Tue, 5 Mar 2024 10:15:09 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCWZ5hQGrEmUDiGBtT/4HJx79AQaEp7f9qFte0CAKXWE4IM8ldzp4ufFsQ1EIxIiPbYBNQeY83/4YBZQAwNoQf55CBn2CSqH7MZl0HxJ9A== X-Google-Smtp-Source: AGHT+IFlc/kmbD+7KzUtSFTX1JcatN+fHJ27sM4rhfxeAu3AU8IKyseRUdQmPdJBO7+Dwlrf6tjy X-Received: by 2002:a17:90a:948a:b0:29a:d01a:a32 with SMTP id s10-20020a17090a948a00b0029ad01a0a32mr11889353pjo.26.1709662508805; Tue, 05 Mar 2024 10:15:08 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709662508; cv=pass; d=google.com; s=arc-20160816; b=R9LtIiREvF1P3RCdaXZHdX9OE4pQ9NYYpeXnOx566+K+riUkD2kfr8/tyNRyl2tuM/ 3qoZH7pPLQGpq7vRm8zIkHSuHDv2sBcDOxjnuYoct8/bEavOY1ONd5/Ndmh6lLMQJOKe G19k5KkW/byl1VafvjVEkUjqcQbYmCv0yAP43isMwWFh8BGPGLknxtsOtF53w+7TR+l7 pi8i+4u8DzAoATes7w1dls8y3+BOb5miR8GpNmEcGNhyDs5DMC0wf8C4Dkvz4x8WS+9L bTChlxpGq3toC12Ml4ew7gMHgtmEbN3kQycEkTdGxsYzgdgrWvKkbKQnVdE5TJAVgjZC S/8g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:subject:cc:to:from :date:dkim-signature; bh=UEMgwmOOiz/Ij/RSzpGO3nF1ZNDpGw0hAPNdmvCkyvU=; fh=KPe7h+3nCepK8tW7iSXY/RcFjETFY5VgyuiP2uBcDho=; b=Zo9jIPMV4v1jLeI4JX3WRNiaZjODcUSK0QkRqh9vN0euVtbxApqLthxhzJcY5ZK8fs XETsmXq27/vWcqmBXYdKNOU7Gkc395Ok3NtAAjHIneOZNfzQM7EGlNdjb2fcA3ObFQMd woOcah/uO8Br2ofBLpBueNs2S9p6Twc+udq5Yi4aVUptPRtqfLb31ila+h6kdYHcCUsg h7ivUMPsyfQkyHxxM4i4kxAQ3QCqvMmsMl6m+mFQD6PG3N92Ro3kEMGKkSfsFx+EPLct xg0B58CtxqD1C9JegCCLYNy8II9aIaWsQS5inIaeW09gz3urfceTdWX6Eo6cG/Gv/por GXZw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=PIgPdnMI; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-92814-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-92814-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id lm12-20020a170903298c00b001dcb8e2ce21si10654349plb.610.2024.03.05.10.15.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Mar 2024 10:15:08 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-92814-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=PIgPdnMI; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-92814-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-92814-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id D1A1B289AA0 for ; Tue, 5 Mar 2024 18:14:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 16EA91AAC4; Tue, 5 Mar 2024 18:14:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PIgPdnMI" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 35B8017BD4; Tue, 5 Mar 2024 18:14:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709662467; cv=none; b=kiXeLYAhEXEw8sjiCOO5dRra2MgmBcs7Qb83DRRDlBFIV8jAzq6v2bO4bqZDITA5y2nUwD5BOuKj0zb+psGLa6OT9xXKAsrPoCLfKMzqUoThx0iyTdoDS+4RbwQLxCeiijrBICEccsJwGGUin9m6MqPQj68diuayQxxycjd5/S8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709662467; c=relaxed/simple; bh=mnwUYin+wWG/5bm2UhgbjUnJX5XJYCmfDtF0BnRjVFQ=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=LyanE5FAILFCUECoH6M+o/T08npHOFgrMneQzBEOvK2Qs1+1DaDQ12wAt9pzezVx9eLgmSuaLB3wkwklUuNzAN9+WOAE5FpwYfmcn1gcNqZkonYgh9hBlRBg3tH6pCzcBFcFPcft77NouHYUImZB7MZqTQ8vxHTHaABwsPWlr5o= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PIgPdnMI; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9E5B5C433F1; Tue, 5 Mar 2024 18:14:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709662466; bh=mnwUYin+wWG/5bm2UhgbjUnJX5XJYCmfDtF0BnRjVFQ=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=PIgPdnMIq+XljxNgkyHces7Cj6VHkEC9Q2shkEPwWWaHNM+2f+0AYrTWGi0dMKAv9 g8bAsC9RauqJJxtQWadwW2+Ev78wqIs/RnjP7cVwZfVxq26Zffs9NhmbARrCo1wRfQ 5dwWpxmw7sq51EnjeVhdTg9xEdxpKlA70wVNDLpin6ZuWqv3fkjWLokT7bRKp+aHy0 jG0q71N/pK+55qXcM2HiLZKJt9bHFeyptoKD8cloob6aYFbfWcWIgacQLQbXGGVBAk Jw4A9RxRlDBb2Odf32fTUUdyoGHiTb7ovWCcbphkXUIEcRDljf2QZIf/dYuJCYaHes RSd1W9LJhxJ6Q== Date: Tue, 5 Mar 2024 12:14:25 -0600 From: Bjorn Helgaas To: "Rafael J. Wysocki" Cc: Linux PCI , LKML , Linux PM , "Rafael J. Wysocki" , Greg Kroah-Hartman , Ricky Wu , Kai-Heng Feng Subject: Re: [PATCH v1] PM: runtime: PCI: Drain runtime-idle callbacks before driver removal Message-ID: <20240305181425.GA541296@bhelgaas> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5761426.DvuYhMxLoT@kreacher> On Tue, Mar 05, 2024 at 11:45:38AM +0100, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki > > A race condition between the .runtime_idle() callback and the .remove() > callback in the rtsx_pcr PCI driver leads to a kernel crash due to an > unhandled page fault [1]. > > The problem is that rtsx_pci_runtime_idle() is not expected to be > running after pm_runtime_get_sync() has been called, but the latter > doesn't really guarantee that. It only guarantees that the suspend > and resume callbacks will not be running when it returns. > > However, if a .runtime_idle() callback is already running when > pm_runtime_get_sync() is called, the latter will notice that the > runtime PM status of the device is RPM_ACTIVE and it will return right > away without waiting for the former to complete. In fact, it cannot > wait for .runtime_idle() to complete because it may be called from that > callback (it arguably does not make much sense to do that, but it is not > strictly prohibited). > > Thus in general, whoever is providing a .runtime_idle() callback, they > need to protect it from running in parallel with whatever code runs > after pm_runtime_get_sync(). [Note that .runtime_idle() will not start > after pm_runtime_get_sync() has returned, but it may continue running > then if it has started earlier already.] > > One way to address that race condition is to call pm_runtime_barrier() > after pm_runtime_get_sync() (not before it, because a nonzero value of > the runtime PM usage counter is necessary to prevent runtime PM > callbacks from being invoked) to wait for the runtime-idle callback to > complete should it be running at that point. A suitable place for > doing that is in pci_device_remove() which calls pm_runtime_get_sync() > before removing the driver, so it may as well call pm_runtime_barrier() > subsequently, which will prevent the race in question from occurring, > not just in the rtsx_pcr driver, but in any PCI drivers providing > runtime-idle callbacks. > > Link: https://lore.kernel.org/lkml/20240229062201.49500-1-kai.heng.feng@canonical.com/ # [1] > Reported-by: Kai-Heng Feng > Tested-by: Ricky Wu > Cc: All applicable > Signed-off-by: Rafael J. Wysocki Applied with Kai-Feng's ack to pci/pm for v6.9, thank you very much! > --- > drivers/pci/pci-driver.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > Index: linux-pm/drivers/pci/pci-driver.c > =================================================================== > --- linux-pm.orig/drivers/pci/pci-driver.c > +++ linux-pm/drivers/pci/pci-driver.c > @@ -473,6 +473,13 @@ static void pci_device_remove(struct dev > > if (drv->remove) { > pm_runtime_get_sync(dev); > + /* > + * If the driver provides a .runtime_idle() callback and it has > + * started to run already, it may continue to run in parallel > + * with the code below, so wait until all of the runtime PM > + * activity has completed. > + */ > + pm_runtime_barrier(dev); > drv->remove(pci_dev); > pm_runtime_put_noidle(dev); > } > > >