All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Hilman <khilman@ti.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: linux-pm@lists.linux-foundation.org
Subject: Re: use of pm_runtime_disable() from driver probe?
Date: Tue, 10 Jul 2012 14:04:12 -0700	[thread overview]
Message-ID: <871ukjnx9v.fsf@ti.com> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1207101615320.1308-100000@iolanthe.rowland.org> (Alan Stern's message of "Tue, 10 Jul 2012 16:17:06 -0400 (EDT)")

Alan Stern <stern@rowland.harvard.edu> writes:

> On Tue, 10 Jul 2012, Rafael J. Wysocki wrote:
>
>> > If .probe() enabled runtime PM and called pm_runtime_get_sync() (or _resume),
>> > it can't clean up properly in case of an error, because its
>> > pm_runtime_put_sync() (or _suspend) won't be effective and you're right that
>> > it has to call pm_runtime_disable().
>> > 
>> > So, we don't handle this particular case correctly.

Right, this is exactly the case I'm working on now.  The driver is
calling pm_runtime_enable() and _disable() in .probe().

>> > I'm not sure what the solution should be, though.  We could remove the
>> > runtime PM operations around really_probe(), but then there may be drivers
>> > assuming that the core will call pm_runtime_put_sync() after .probe()
>> > has returned.
>> 
>> I have an idea.
>> 
>> What about the following patch?  It shouldn't matter except for the cases when
>> .probe() attempts to suspend the device by itself.
>> 
>> ---
>>  drivers/base/dd.c |    7 ++-----
>>  1 file changed, 2 insertions(+), 5 deletions(-)
>> 
>> Index: linux/drivers/base/dd.c
>> ===================================================================
>> --- linux.orig/drivers/base/dd.c
>> +++ linux/drivers/base/dd.c
>> @@ -356,10 +356,8 @@ int driver_probe_device(struct device_dr
>>  	pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
>>  		 drv->bus->name, __func__, dev_name(dev), drv->name);
>>  
>> -	pm_runtime_get_noresume(dev);
>> -	pm_runtime_barrier(dev);
>>  	ret = really_probe(dev, drv);
>> -	pm_runtime_put_sync(dev);
>> +	pm_runtime_idle(dev);
>>  
>>  	return ret;
>>  }
>> @@ -406,9 +404,8 @@ int device_attach(struct device *dev)
>>  			ret = 0;
>>  		}
>>  	} else {
>> -		pm_runtime_get_noresume(dev);
>>  		ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
>> -		pm_runtime_put_sync(dev);
>> +		pm_runtime_idle(dev);
>>  	}
>>  out_unlock:
>>  	device_unlock(dev);
>
>
> This opens up the possibility of calling probe while a runtime resume
> or suspend is in progress.  (On the other hand, the existing code
> doesn't prevent a concurrent runtime resume.)  Maybe it would be best
> to leave the pm_runtime_barrier().
>
> Apart from that, I think it would solve the problem.

I just tested it and it definitely solves the problem.  I forgot exactly
why the get/put was added around probe in the first place, so am not
sure if this opens up other potential problems like Alan mentioned.

In any case, if you go forward with this patch, feel free to add:

Reviewed-by: Kevin Hilman <khilman@ti.com>
Tested-by: Kevin Hilman <khilman@ti.com>

Kevin

  reply	other threads:[~2012-07-10 21:04 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-06 22:29 use of pm_runtime_disable() from driver probe? Kevin Hilman
2012-07-07 19:25 ` Rafael J. Wysocki
2012-07-08  2:01   ` Alan Stern
2012-07-08 14:59     ` Rafael J. Wysocki
2012-07-10 18:11   ` Kevin Hilman
2012-07-10 18:31     ` Rafael J. Wysocki
2012-07-10 18:47       ` Alan Stern
2012-07-10 19:14         ` Rafael J. Wysocki
2012-07-10 19:41           ` Rafael J. Wysocki
2012-07-10 20:17             ` Alan Stern
2012-07-10 21:04               ` Kevin Hilman [this message]
2012-07-10 22:31               ` Rafael J. Wysocki
2012-07-11 14:20                 ` Alan Stern
2012-07-11 17:36                   ` Rafael J. Wysocki
2012-07-11 23:07                     ` Kevin Hilman
2012-07-11 23:16                       ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871ukjnx9v.fsf@ti.com \
    --to=khilman@ti.com \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=stern@rowland.harvard.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.