* [PATCH 0/2] PM / Runtime: Clean-up and documentation @ 2010-01-27 23:09 Rafael J. Wysocki 2010-01-27 23:11 ` [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() Rafael J. Wysocki 2010-01-27 23:11 ` [PATCH 2/2] PM / Runtime: Document power.runtime_auto and related functions Rafael J. Wysocki 0 siblings, 2 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2010-01-27 23:09 UTC (permalink / raw) To: pm list; +Cc: LKML, Alan Stern Hi, The following two patches are on top of the linux-next branch of my suspend-2.6 tree: [1/2] - Clean up pm_runtime_disable() [2/2] - Document new runtime PM helper functions as appropriate. Thanks, Rafael ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-27 23:09 [PATCH 0/2] PM / Runtime: Clean-up and documentation Rafael J. Wysocki @ 2010-01-27 23:11 ` Rafael J. Wysocki 2010-01-28 15:37 ` Alan Stern 2010-01-27 23:11 ` [PATCH 2/2] PM / Runtime: Document power.runtime_auto and related functions Rafael J. Wysocki 1 sibling, 1 reply; 9+ messages in thread From: Rafael J. Wysocki @ 2010-01-27 23:11 UTC (permalink / raw) To: pm list; +Cc: LKML, Alan Stern From: Rafael J. Wysocki <rjw@sisk.pl> Remove the second argument of __pm_runtime_disable(), which is not necessary any more, and rename this funtion to pm_runtime_disable(). Accordingly, drop the static inline definition of pm_runtime_disable() using __pm_runtime_disable() and export pm_runtime_disable() as appropriate. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> --- drivers/base/power/runtime.c | 31 ++++--------------------------- include/linux/pm_runtime.h | 9 ++------- 2 files changed, 6 insertions(+), 34 deletions(-) Index: linux-2.6/drivers/base/power/runtime.c =================================================================== --- linux-2.6.orig/drivers/base/power/runtime.c +++ linux-2.6/drivers/base/power/runtime.c @@ -943,20 +943,15 @@ int pm_runtime_barrier(struct device *de EXPORT_SYMBOL_GPL(pm_runtime_barrier); /** - * __pm_runtime_disable - Disable run-time PM of a device. + * pm_runtime_disable - Disable run-time PM of a device. * @dev: Device to handle. - * @check_resume: If set, check if there's a resume request for the device. * * Increment power.disable_depth for the device and if was zero previously, * cancel all pending run-time PM requests for the device and wait for all * operations in progress to complete. The device can be either active or * suspended after its run-time PM has been disabled. - * - * If @check_resume is set and there's a resume request pending when - * __pm_runtime_disable() is called and power.disable_depth is zero, the - * function will wake up the device before disabling its run-time PM. */ -void __pm_runtime_disable(struct device *dev, bool check_resume) +void pm_runtime_disable(struct device *dev) { spin_lock_irq(&dev->power.lock); @@ -965,31 +960,13 @@ void __pm_runtime_disable(struct device goto out; } - /* - * Wake up the device if there's a resume request pending, because that - * means there probably is some I/O to process and disabling run-time PM - * shouldn't prevent the device from processing the I/O. - */ - if (check_resume && dev->power.request_pending - && dev->power.request == RPM_REQ_RESUME) { - /* - * Prevent suspends and idle notifications from being carried - * out after we have woken up the device. - */ - pm_runtime_get_noresume(dev); - - __pm_runtime_resume(dev, false); - - pm_runtime_put_noidle(dev); - } - if (!dev->power.disable_depth++) __pm_runtime_barrier(dev); out: spin_unlock_irq(&dev->power.lock); } -EXPORT_SYMBOL_GPL(__pm_runtime_disable); +EXPORT_SYMBOL_GPL(pm_runtime_disable); /** * pm_runtime_enable - Enable run-time PM of a device. @@ -1092,7 +1069,7 @@ void pm_runtime_init(struct device *dev) */ void pm_runtime_remove(struct device *dev) { - __pm_runtime_disable(dev, false); + pm_runtime_disable(dev); /* Change the status back to 'suspended' to match the initial status. */ if (dev->power.runtime_status == RPM_ACTIVE) Index: linux-2.6/include/linux/pm_runtime.h =================================================================== --- linux-2.6.orig/include/linux/pm_runtime.h +++ linux-2.6/include/linux/pm_runtime.h @@ -27,7 +27,7 @@ extern int __pm_runtime_put(struct devic extern int __pm_runtime_set_status(struct device *dev, unsigned int status); extern int pm_runtime_barrier(struct device *dev); extern void pm_runtime_enable(struct device *dev); -extern void __pm_runtime_disable(struct device *dev, bool check_resume); +extern void pm_runtime_disable(struct device *dev); extern void pm_runtime_allow(struct device *dev); extern void pm_runtime_forbid(struct device *dev); @@ -79,7 +79,7 @@ static inline int __pm_runtime_set_statu unsigned int status) { return 0; } static inline int pm_runtime_barrier(struct device *dev) { return 0; } static inline void pm_runtime_enable(struct device *dev) {} -static inline void __pm_runtime_disable(struct device *dev, bool c) {} +static inline void pm_runtime_disable(struct device *dev) {} static inline void pm_runtime_allow(struct device *dev) {} static inline void pm_runtime_forbid(struct device *dev) {} @@ -122,9 +122,4 @@ static inline void pm_runtime_set_suspen __pm_runtime_set_status(dev, RPM_SUSPENDED); } -static inline void pm_runtime_disable(struct device *dev) -{ - __pm_runtime_disable(dev, true); -} - #endif ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-27 23:11 ` [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() Rafael J. Wysocki @ 2010-01-28 15:37 ` Alan Stern 2010-01-28 20:12 ` Rafael J. Wysocki 0 siblings, 1 reply; 9+ messages in thread From: Alan Stern @ 2010-01-28 15:37 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: pm list, LKML On Thu, 28 Jan 2010, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rjw@sisk.pl> > > Remove the second argument of __pm_runtime_disable(), which is not > necessary any more, and rename this funtion to pm_runtime_disable(). > Accordingly, drop the static inline definition of > pm_runtime_disable() using __pm_runtime_disable() and export > pm_runtime_disable() as appropriate. > > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> > --- > drivers/base/power/runtime.c | 31 ++++--------------------------- > include/linux/pm_runtime.h | 9 ++------- > 2 files changed, 6 insertions(+), 34 deletions(-) > > Index: linux-2.6/drivers/base/power/runtime.c > =================================================================== > --- linux-2.6.orig/drivers/base/power/runtime.c > +++ linux-2.6/drivers/base/power/runtime.c > @@ -943,20 +943,15 @@ int pm_runtime_barrier(struct device *de > EXPORT_SYMBOL_GPL(pm_runtime_barrier); > > /** > - * __pm_runtime_disable - Disable run-time PM of a device. > + * pm_runtime_disable - Disable run-time PM of a device. > * @dev: Device to handle. > - * @check_resume: If set, check if there's a resume request for the device. > * > * Increment power.disable_depth for the device and if was zero previously, > * cancel all pending run-time PM requests for the device and wait for all > * operations in progress to complete. The device can be either active or > * suspended after its run-time PM has been disabled. > - * > - * If @check_resume is set and there's a resume request pending when > - * __pm_runtime_disable() is called and power.disable_depth is zero, the > - * function will wake up the device before disabling its run-time PM. > */ > -void __pm_runtime_disable(struct device *dev, bool check_resume) > +void pm_runtime_disable(struct device *dev) > { Why did you decide to remove the check_resume argument? That decision should be explained in the patch description. Alan Stern ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-28 15:37 ` Alan Stern @ 2010-01-28 20:12 ` Rafael J. Wysocki 2010-01-29 2:30 ` Alan Stern 0 siblings, 1 reply; 9+ messages in thread From: Rafael J. Wysocki @ 2010-01-28 20:12 UTC (permalink / raw) To: Alan Stern; +Cc: pm list, LKML On Thursday 28 January 2010, Alan Stern wrote: > On Thu, 28 Jan 2010, Rafael J. Wysocki wrote: > > > From: Rafael J. Wysocki <rjw@sisk.pl> > > > > Remove the second argument of __pm_runtime_disable(), which is not > > necessary any more, and rename this funtion to pm_runtime_disable(). > > Accordingly, drop the static inline definition of > > pm_runtime_disable() using __pm_runtime_disable() and export > > pm_runtime_disable() as appropriate. > > > > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> > > --- > > drivers/base/power/runtime.c | 31 ++++--------------------------- > > include/linux/pm_runtime.h | 9 ++------- > > 2 files changed, 6 insertions(+), 34 deletions(-) > > > > Index: linux-2.6/drivers/base/power/runtime.c > > =================================================================== > > --- linux-2.6.orig/drivers/base/power/runtime.c > > +++ linux-2.6/drivers/base/power/runtime.c > > @@ -943,20 +943,15 @@ int pm_runtime_barrier(struct device *de > > EXPORT_SYMBOL_GPL(pm_runtime_barrier); > > > > /** > > - * __pm_runtime_disable - Disable run-time PM of a device. > > + * pm_runtime_disable - Disable run-time PM of a device. > > * @dev: Device to handle. > > - * @check_resume: If set, check if there's a resume request for the device. > > * > > * Increment power.disable_depth for the device and if was zero previously, > > * cancel all pending run-time PM requests for the device and wait for all > > * operations in progress to complete. The device can be either active or > > * suspended after its run-time PM has been disabled. > > - * > > - * If @check_resume is set and there's a resume request pending when > > - * __pm_runtime_disable() is called and power.disable_depth is zero, the > > - * function will wake up the device before disabling its run-time PM. > > */ > > -void __pm_runtime_disable(struct device *dev, bool check_resume) > > +void pm_runtime_disable(struct device *dev) > > { > > Why did you decide to remove the check_resume argument? That decision > should be explained in the patch description. Well, I thought the "which is not necessary any more" would be a sufficient explanation ... Rafael ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-28 20:12 ` Rafael J. Wysocki @ 2010-01-29 2:30 ` Alan Stern 2010-01-29 15:01 ` Rafael J. Wysocki 0 siblings, 1 reply; 9+ messages in thread From: Alan Stern @ 2010-01-29 2:30 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: pm list, LKML On Thu, 28 Jan 2010, Rafael J. Wysocki wrote: > > > - * If @check_resume is set and there's a resume request pending when > > > - * __pm_runtime_disable() is called and power.disable_depth is zero, the > > > - * function will wake up the device before disabling its run-time PM. > > > */ > > > -void __pm_runtime_disable(struct device *dev, bool check_resume) > > > +void pm_runtime_disable(struct device *dev) > > > { > > > > Why did you decide to remove the check_resume argument? That decision > > should be explained in the patch description. > > Well, I thought the "which is not necessary any more" would be a sufficient > explanation ... But why is it not necessary now, given that apparently it was necessary before? What has changed to make it unnecessary? Alan Stern ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-29 2:30 ` Alan Stern @ 2010-01-29 15:01 ` Rafael J. Wysocki 2010-01-29 19:43 ` Alan Stern 0 siblings, 1 reply; 9+ messages in thread From: Rafael J. Wysocki @ 2010-01-29 15:01 UTC (permalink / raw) To: Alan Stern; +Cc: pm list, LKML On Friday 29 January 2010, Alan Stern wrote: > On Thu, 28 Jan 2010, Rafael J. Wysocki wrote: > > > > > - * If @check_resume is set and there's a resume request pending when > > > > - * __pm_runtime_disable() is called and power.disable_depth is zero, the > > > > - * function will wake up the device before disabling its run-time PM. > > > > */ > > > > -void __pm_runtime_disable(struct device *dev, bool check_resume) > > > > +void pm_runtime_disable(struct device *dev) > > > > { > > > > > > Why did you decide to remove the check_resume argument? That decision > > > should be explained in the patch description. > > > > Well, I thought the "which is not necessary any more" would be a sufficient > > explanation ... > > But why is it not necessary now, Well, all of the existing callers use only one value of it, which is 'false' (perhaps I should write that in the changelog). > given that apparently it was necessary before? What has changed to make > it unnecessary? It was used in the system suspend code path in main.c (in dpm_prepare()) IIRC, but it was replaced by the current code. I don't really think it's useful to try to recall why it was used at one point. It's not used now and I don't have a usage case for it. If no one else knows it will be necessary, removing it is the right thing to do. Rafael ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-29 15:01 ` Rafael J. Wysocki @ 2010-01-29 19:43 ` Alan Stern 2010-01-29 20:01 ` Rafael J. Wysocki 0 siblings, 1 reply; 9+ messages in thread From: Alan Stern @ 2010-01-29 19:43 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: pm list, LKML On Fri, 29 Jan 2010, Rafael J. Wysocki wrote: > On Friday 29 January 2010, Alan Stern wrote: > > On Thu, 28 Jan 2010, Rafael J. Wysocki wrote: > > > > > > > - * If @check_resume is set and there's a resume request pending when > > > > > - * __pm_runtime_disable() is called and power.disable_depth is zero, the > > > > > - * function will wake up the device before disabling its run-time PM. > > > > > */ > > > > > -void __pm_runtime_disable(struct device *dev, bool check_resume) > > > > > +void pm_runtime_disable(struct device *dev) > > > > > { > > > > > > > > Why did you decide to remove the check_resume argument? That decision > > > > should be explained in the patch description. > > > > > > Well, I thought the "which is not necessary any more" would be a sufficient > > > explanation ... > > > > But why is it not necessary now, > > Well, all of the existing callers use only one value of it, which is 'false' > (perhaps I should write that in the changelog). I don't understand. Isn't the existing version of pm_runtime_disable() a caller which sets check_resume to 'true'? There certainly are places that call pm_runtime_disable(). > > given that apparently it was necessary before? What has changed to make > > it unnecessary? > > It was used in the system suspend code path in main.c (in dpm_prepare()) IIRC, > but it was replaced by the current code. > > I don't really think it's useful to try to recall why it was used at one point. > It's not used now and I don't have a usage case for it. If no one else knows > it will be necessary, removing it is the right thing to do. A particularly important usage case for pm_runtime_disable() is when a bus subsystem or driver does when resuming from system sleep and the device was already runtime-suspended when the sleep began. However in this case (and all the other cases I'm aware of) there's no need to check whether a resume request is pending before doing the runtime_disable. I wasn't saying that the patch is wrong, just asking the reason for it. Alan Stern ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() 2010-01-29 19:43 ` Alan Stern @ 2010-01-29 20:01 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2010-01-29 20:01 UTC (permalink / raw) To: Alan Stern; +Cc: pm list, LKML On Friday 29 January 2010, Alan Stern wrote: > On Fri, 29 Jan 2010, Rafael J. Wysocki wrote: > > > On Friday 29 January 2010, Alan Stern wrote: > > > On Thu, 28 Jan 2010, Rafael J. Wysocki wrote: > > > > > > > > > - * If @check_resume is set and there's a resume request pending when > > > > > > - * __pm_runtime_disable() is called and power.disable_depth is zero, the > > > > > > - * function will wake up the device before disabling its run-time PM. > > > > > > */ > > > > > > -void __pm_runtime_disable(struct device *dev, bool check_resume) > > > > > > +void pm_runtime_disable(struct device *dev) > > > > > > { > > > > > > > > > > Why did you decide to remove the check_resume argument? That decision > > > > > should be explained in the patch description. > > > > > > > > Well, I thought the "which is not necessary any more" would be a sufficient > > > > explanation ... > > > > > > But why is it not necessary now, > > > > Well, all of the existing callers use only one value of it, which is 'false' > > (perhaps I should write that in the changelog). > > I don't understand. Isn't the existing version of pm_runtime_disable() > a caller which sets check_resume to 'true'? There certainly are places > that call pm_runtime_disable(). Sorry, you're absolutely right, so the patch is wrong. Rafael ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] PM / Runtime: Document power.runtime_auto and related functions 2010-01-27 23:09 [PATCH 0/2] PM / Runtime: Clean-up and documentation Rafael J. Wysocki 2010-01-27 23:11 ` [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() Rafael J. Wysocki @ 2010-01-27 23:11 ` Rafael J. Wysocki 1 sibling, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2010-01-27 23:11 UTC (permalink / raw) To: pm list; +Cc: LKML, Alan Stern From: Rafael J. Wysocki <rjw@sisk.pl> The power.runtime_auto device flag and the helper functions pm_runtime_allow() and pm_runtime_forbid() used to modify it are a part of the run-time power management framework and therefore they should be described in Documentation/power/runtime_pm.txt. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> --- Documentation/power/runtime_pm.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) Index: linux-2.6/Documentation/power/runtime_pm.txt =================================================================== --- linux-2.6.orig/Documentation/power/runtime_pm.txt +++ linux-2.6/Documentation/power/runtime_pm.txt @@ -224,6 +224,12 @@ defined in include/linux/pm.h: RPM_SUSPENDED, which means that each device is initially regarded by the PM core as 'suspended', regardless of its real hardware status + unsigned int runtime_auto; + - if set, indicates that the user space has allowed the device driver to + power manage the device at run time via the /sys/devices/.../power/control + interface; it may only be modified with the help of the pm_runtime_allow() + and pm_runtime_forbid() helper functions + All of the above fields are members of the 'power' member of 'struct device'. 4. Run-time PM Device Helper Functions @@ -329,6 +335,16 @@ drivers/base/power/runtime.c and include 'power.runtime_error' is set or 'power.disable_depth' is greater than zero) + void pm_runtime_allow(struct device *dev); + - set the power.runtime_auto flag for the device and decrease its usage + counter (used by the /sys/devices/.../power/control interface to + effectively allow the device to be power managed at run time) + + void pm_runtime_forbid(struct device *dev); + - unset the power.runtime_auto flag for the device and increase its usage + counter (used by the /sys/devices/.../power/control interface to + effectively prevent the device from being power managed at run time) + It is safe to execute the following helper functions from interrupt context: pm_request_idle() @@ -382,6 +398,18 @@ may be desirable to suspend the device a finished, so the PM core uses pm_runtime_idle_sync() to invoke the subsystem-level idle callback for the device at that time. +The user space can effectively disallow the driver of the device to power manage +it at run time by changing the value of its /sys/devices/.../power/control +attribute to "on", which causes pm_runtime_forbid() to be called. In principle, +this mechanism may also be used by the driver to effectively turn off the +run-time power management of the device until the user space turns it on. +Namely, during the initialization the driver can make sure that the run-time PM +status of the device is 'active' and call pm_runtime_forbid(). It should be +noted, however, that if the user space has already intentionally changed the +value of /sys/devices/.../power/control to "auto" to allow the driver to power +manage the device at run time, the driver may confuse it by using +pm_runtime_forbid() this way. + 6. Run-time PM and System Sleep Run-time PM and system sleep (i.e., system suspend and hibernation, also known ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-01-29 20:01 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-01-27 23:09 [PATCH 0/2] PM / Runtime: Clean-up and documentation Rafael J. Wysocki 2010-01-27 23:11 ` [PATCH 1/2] PM / Runtime: Clean up pm_runtime_disable() Rafael J. Wysocki 2010-01-28 15:37 ` Alan Stern 2010-01-28 20:12 ` Rafael J. Wysocki 2010-01-29 2:30 ` Alan Stern 2010-01-29 15:01 ` Rafael J. Wysocki 2010-01-29 19:43 ` Alan Stern 2010-01-29 20:01 ` Rafael J. Wysocki 2010-01-27 23:11 ` [PATCH 2/2] PM / Runtime: Document power.runtime_auto and related functions Rafael J. Wysocki
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®