From patchwork Thu Nov 7 00:16:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Rafael J. Wysocki" X-Patchwork-Id: 3150071 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id A675E9F47C for ; Thu, 7 Nov 2013 00:04:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 82C0A20457 for ; Thu, 7 Nov 2013 00:04:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 831DF2044B for ; Thu, 7 Nov 2013 00:04:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752257Ab3KGAEU (ORCPT ); Wed, 6 Nov 2013 19:04:20 -0500 Received: from v094114.home.net.pl ([79.96.170.134]:61067 "HELO v094114.home.net.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1750813Ab3KGAEU (ORCPT ); Wed, 6 Nov 2013 19:04:20 -0500 Received: from aerm137.neoplus.adsl.tpnet.pl [79.191.194.137] (HELO vostro.rjw.lan) by serwer1319399.home.pl [79.96.170.134] with SMTP (IdeaSmtpServer v0.80) id c5b309b9b183d223; Thu, 7 Nov 2013 01:04:18 +0100 From: "Rafael J. Wysocki" To: Ulf Hansson , Greg Kroah-Hartman Cc: Alan Stern , Tomi Valkeinen , Kevin Hilman , Linus Walleij , Archit Taneja , linux-kernel , "linux-pm@vger.kernel.org" Subject: Re: Async runtime put in __device_release_driver() Date: Thu, 07 Nov 2013 01:16:40 +0100 Message-ID: <5303847.vEYmuQ7tHR@vostro.rjw.lan> User-Agent: KMail/4.10.5 (Linux/3.12.0-rc6+; KDE/4.10.5; x86_64; ; ) In-Reply-To: References: <1910973.CpzEs44S3m@vostro.rjw.lan> MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Wednesday, November 06, 2013 11:48:24 PM Ulf Hansson wrote: > > "Rafael J. Wysocki" skrev: > >On Wednesday, November 06, 2013 05:02:12 PM Alan Stern wrote: > >> On Wed, 6 Nov 2013, Rafael J. Wysocki wrote: > >> > >> > On Wednesday, November 06, 2013 09:51:42 AM Tomi Valkeinen wrote: > >> > > On 2013-11-05 23:29, Ulf Hansson wrote: > >> > > > On 23 October 2013 12:11, Tomi Valkeinen > > wrote: > >> > > >> Hi, > >> > > >> > >> > > >> I was debugging why clocks were left enabled after removing > >omapdss > >> > > >> driver, and I found this commit: > >> > > >> > >> > > >> fa180eb448fa263cf18dd930143b515d27d70d7b (PM / Runtime: Idle > >devices > >> > > >> asynchronously after probe|release) > >> > > >> > >> > > >> I don't understand how that is supposed to work. > >> > > >> > >> > > >> When a driver is removed, instead of using > >pm_runtime_put_sync() the > >> > > >> commit uses pm_runtime_put(), so the runtime_suspend call is > >queued. But > >> > > >> who is going to handle the queued suspend call, as the driver > >is already > >> > > >> removed? At least in my case, obviously nobody, as I only get > >> > > >> runtime_resume call in my driver, never the runtime_suspend. > >> > > >> > >> > > >> Is there something I need to add to my driver to make this > >work, or > >> > > >> should that part of the patch be reverted? > >> > > > > >> > > > I believe it is quite common that a device driver calls > >> > > > pm_runtime_get_sync as a part of it's remove callback, then it > >> > > > explicitly returns it's resources that has been fetched during > >probe. > >> > > > Like a clk_disable_unprepare for example. > >> > > > >> > > I guess you mean the driver calls pm_runtime_get_sync _and_ > >> > > pm_runtime_put_sync as part of its remove callback? > >> > > > >> > > Probably bus drivers need to do that, but for memory mapped > >devices in a > >> > > SoC, I don't think there's normally any need to do > >> > > pm_runtime_get/put_sync during the remove callback. > >> > > > >> > > > The idea behind the change in __device_release_driver, was to > >try to > >> > > > prevent devices from going active->idle->active and instead > >just > >> > > > remain active (if possible). > >> > > > > >> > > > In your case, which seems like a more modern way of > >implementing > >> > > > "remove", you shall call "pm_runtime_suspend" to make sure the > >> > > > runtime_suspend callbacks gets called. > >> > > > >> > > And as far as I understand, the change creates an explicit > >requirement > >> > > to do either pm_runtime_get/put_sync or pm_runtime_suspend inside > >> > > driver's remove callback. If so, that should be mentioned in big > >red > >> > > letters in the pm-runtime documentation. > >> > > > >> > > The runtime_pm.txt doc does mention something related to this > >(and btw, > >> > > the doc says pm_runtime_put_sync is being called, which is no > >longer > >> > > true), but nothing clear about how the driver remove callback > >must be > >> > > implemented. > >> > > >> > That's correct. > >> > > >> > > I tried grepping the kernel sources to find out if > >pm_runtime_suspend is > >> > > widely used to get SoC platform devices to suspend, but it > >doesn't seem > >> > > like it is. I didn't see pm_runtime_get/put_sync being used in > >remove > >> > > callbacks widely either, but that was more difficult one to grep. > >> > > >> > I think your observations are valid, which unfortunately means that > >we'll > >> > need to revert the commit in question, because it has changed the > >behavior > >> > that drivers are perfectly fine to expect given the existing > >documentation > >> > etc. It looks like the change was premature at least. > >> > > >> > Greg, I wonder if you can queue up a revert of fa180eb448fa for > >3.13, or > >> > do you want me to do that? > >> > >> Would it be better to leave the runtime-idle callbacks (invoked > >during > >> probe) async and revert only the change to __device_release_driver()? > >> > >> Having an async callback after probe shouldn't cause problems, > >because > >> the driver will then be bound (assuming the probe succeeded). > > > >Right. OK, I'll prepare a patch. > > That seems like a good way forward. There you go. Acked-by: Kevin Hilman Acked-by: Ulf Hansson --- From: Rafael J. Wysocki Subject: PM / runtime: Use pm_runtime_put_sync() in __device_release_driver() Commit fa180eb448fa (PM / Runtime: Idle devices asynchronously after probe|release) modified __device_release_driver() to call pm_runtime_put(dev) instead of pm_runtime_put_sync(dev) before detaching the driver from the device. However, that was a mistake, because pm_runtime_put(dev) causes rpm_idle() to be queued up and the driver may be gone already when that function is executed. That breaks the assumptions the drivers have the right to make about the core's behavior on the basis of the existing documentation and actually causes problems to happen, so revert that part of commit fa180eb448fa and restore the previous behavior of __device_release_driver(). Reported-by: Tomi Valkeinen Fixes: fa180eb448fa (PM / Runtime: Idle devices asynchronously after probe|release) Signed-off-by: Rafael J. Wysocki Cc: 3.10+ # 3.10+ --- drivers/base/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux-pm/drivers/base/dd.c =================================================================== --- linux-pm.orig/drivers/base/dd.c +++ linux-pm/drivers/base/dd.c @@ -499,7 +499,7 @@ static void __device_release_driver(stru BUS_NOTIFY_UNBIND_DRIVER, dev); - pm_runtime_put(dev); + pm_runtime_put_sync(dev); if (dev->bus && dev->bus->remove) dev->bus->remove(dev);