Re: [RFC v3 1/3] PM/runtime: Add a new interface to get accounted time
From: Ulf Hansson <hidden>
Date: 2018-12-19 10:21:12
Also in:
dri-devel, intel-gfx, lkml
On Wed, 19 Dec 2018 at 11:11, Vincent Guittot [off-list ref] wrote:
On Wed, 19 Dec 2018 at 10:58, Ulf Hansson [off-list ref] wrote:quoted
On Tue, 18 Dec 2018 at 15:55, Vincent Guittot [off-list ref] wrote:quoted
Some drivers (like i915/drm) need to get the accounted suspended time. pm_runtime_accounted_time_get() will return the suspended or active accounted time until now.I suggest to leave the active accounted time out for now. At least until we have some users.This is needed to keep same feature level for i915/drm
I don't follow. According to the changes in the drm driver in patch2, we are only calling the new pm_runtime interface with RPM_SUSPENDED?
quoted
That said, perhaps rename the function to something along the lines of, pm_runtime_last_suspended_time(), to make it more clear.quoted
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> --- drivers/base/power/runtime.c | 26 ++++++++++++++++++++++++++ include/linux/pm_runtime.h | 2 ++ 2 files changed, 28 insertions(+)diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 7062469..6461469 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c@@ -88,6 +88,32 @@ static void __update_runtime_status(struct device *dev, enum rpm_status status) dev->power.runtime_status = status; } +u64 pm_runtime_accounted_time_get(struct device *dev, enum rpm_status status, bool update) +{ + u64 now = ktime_to_ns(ktime_get());I think you should stay on jiffies here - and then switch to ktime in patch 3.quoted
+ u64 delta = 0, time = 0; + unsigned long flags; + + spin_lock_irqsave(&dev->power.lock, flags); + + if (dev->power.disable_depth > 0) + goto unlock; + + /* Add ongoing state if requested */ + if (update && dev->power.runtime_status == status) + delta = now - dev->power.accounting_timestamp; +Hmm. Do we really need to update the accounting timestamp? I would rather avoid it if possible.i915/drm uses this to track ongoing suspended state. In fact they are mainly interested by this part
Again, sorry I don't follow. My suggested changes below, would do exactly that; track the ongoing suspended state. The user can call the function several times while the device remains RPM_SUSPENDED, and if needed the user could then compute the delta in-between the calls, for whatever reason that may be needed.
quoted
It seems like it should be sufficient to return the delta between "now" and the "dev->power.accounting_timestamp", when "dev->power.runtime_status == RPM_SUSPENDED". In other case, just return 0, because we are not in RPM_SUSPENDED state.only the RPM_SUSPENDED is used by i915/drm but wanted to provide a generic interface to get suspended or not suspend state
I see. Although, unless Rafael thinks different, I would rather try to keep this as simple as possible and expose only what is needed and nothing more.
quoted
quoted
+ if (status == RPM_SUSPENDED) + time = dev->power.suspended_time + delta; + else + time = dev->power.active_time + delta; + +unlock: + spin_unlock_irqrestore(&dev->power.lock, flags); + + return time; +} + /** * pm_runtime_deactivate_timer - Deactivate given device's suspend timer. * @dev: Device to handle.diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 54af4ee..86f21f9 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h@@ -113,6 +113,8 @@ static inline bool pm_runtime_is_irq_safe(struct device *dev) return dev->power.irq_safe; } +extern u64 pm_runtime_accounted_time_get(struct device *dev, enum rpm_status status, bool update); + #else /* !CONFIG_PM */ static inline bool queue_pm_work(struct work_struct *work) { return false; } --2.7.4Kind regards Uffe
Kind regards Uffe