]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PM: runtime: Mark last busy stamp in pm_runtime_put_autosuspend()
authorSakari Ailus <sakari.ailus@linux.intel.com>
Mon, 16 Jun 2025 06:12:08 +0000 (09:12 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 18 Jun 2025 19:41:08 +0000 (21:41 +0200)
Set device's last busy timestamp to current time in
pm_runtime_put_autosuspend(). Callers wishing not to do that will need to
use __pm_runtime_put_autosuspend().

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patch.msgid.link/20250616061212.2286741-3-sakari.ailus@linux.intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/power/runtime_pm.rst
include/linux/pm_runtime.h

index 63344bea8393612407a827beed2bd0e4554d2b7d..e7bbdc66d64cc0958f532745531309cc83b12f3a 100644 (file)
@@ -411,8 +411,9 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
       pm_request_idle(dev) and return its result
 
   `int pm_runtime_put_autosuspend(struct device *dev);`
-    - does the same as __pm_runtime_put_autosuspend() for now, but in the
-      future, will also call pm_runtime_mark_last_busy() as well, DO NOT USE!
+    - set the power.last_busy field to the current time and decrement the
+      device's usage counter; if the result is 0 then run
+      pm_request_autosuspend(dev) and return its result
 
   `int __pm_runtime_put_autosuspend(struct device *dev);`
     - decrement the device's usage counter; if the result is 0 then run
@@ -870,11 +871,9 @@ device is automatically suspended (the subsystem or driver still has to call
 the appropriate PM routines); rather it means that runtime suspends will
 automatically be delayed until the desired period of inactivity has elapsed.
 
-Inactivity is determined based on the power.last_busy field.  Drivers should
-call pm_runtime_mark_last_busy() to update this field after carrying out I/O,
-typically just before calling __pm_runtime_put_autosuspend().  The desired
-length of the inactivity period is a matter of policy.  Subsystems can set this
-length initially by calling pm_runtime_set_autosuspend_delay(), but after device
+Inactivity is determined based on the power.last_busy field. The desired length
+of the inactivity period is a matter of policy.  Subsystems can set this length
+initially by calling pm_runtime_set_autosuspend_delay(), but after device
 registration the length should be controlled by user space, using the
 /sys/devices/.../power/autosuspend_delay_ms attribute.
 
@@ -885,7 +884,7 @@ instead of the non-autosuspend counterparts::
 
        Instead of: pm_runtime_suspend    use: pm_runtime_autosuspend;
        Instead of: pm_schedule_suspend   use: pm_request_autosuspend;
-       Instead of: pm_runtime_put        use: __pm_runtime_put_autosuspend;
+       Instead of: pm_runtime_put        use: pm_runtime_put_autosuspend;
        Instead of: pm_runtime_put_sync   use: pm_runtime_put_sync_autosuspend.
 
 Drivers may also continue to use the non-autosuspend helper functions; they
@@ -922,12 +921,10 @@ Here is a schematic pseudo-code example::
        foo_io_completion(struct foo_priv *foo, void *req)
        {
                lock(&foo->private_lock);
-               if (--foo->num_pending_requests == 0) {
-                       pm_runtime_mark_last_busy(&foo->dev);
-                       __pm_runtime_put_autosuspend(&foo->dev);
-               } else {
+               if (--foo->num_pending_requests == 0)
+                       pm_runtime_put_autosuspend(&foo->dev);
+               else
                        foo_process_next_request(foo);
-               }
                unlock(&foo->private_lock);
                /* Send req result back to the user ... */
        }
index 9dd2e4031a27ba4826c516605c099c746b12a4eb..14ca7be96686cd061463e81e081605b4e4997c0d 100644 (file)
@@ -568,11 +568,13 @@ static inline int __pm_runtime_put_autosuspend(struct device *dev)
 }
 
 /**
- * pm_runtime_put_autosuspend - Drop device usage counter and queue autosuspend if 0.
+ * pm_runtime_put_autosuspend - Update the last access time of a device, drop
+ * its usage counter and queue autosuspend if the usage counter becomes 0.
  * @dev: Target device.
  *
- * Decrement the runtime PM usage counter of @dev and if it turns out to be
- * equal to 0, queue up a work item for @dev like in pm_request_autosuspend().
+ * Update the last access time of @dev, decrement runtime PM usage counter of
+ * @dev and if it turns out to be equal to 0, queue up a work item for @dev like
+ * in pm_request_autosuspend().
  *
  * Return:
  * * 0: Success.
@@ -587,8 +589,8 @@ static inline int __pm_runtime_put_autosuspend(struct device *dev)
  */
 static inline int pm_runtime_put_autosuspend(struct device *dev)
 {
-       return __pm_runtime_suspend(dev,
-           RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
+       pm_runtime_mark_last_busy(dev);
+       return __pm_runtime_put_autosuspend(dev);
 }
 
 /**