From: Joshua Crofts <crofts@kernel.org>
To: "Rafael J. Wysocki" <rafael@kernel.org>,
Len Brown <lenb@kernel.org>, Pavel Machek <pavel@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Danilo Krummrich <dakr@kernel.org>,
Johan Hovold <johan@kernel.org>
Cc: linux-pm@vger.kernel.org, driver-core@lists.linux.dev,
linux-kernel@vger.kernel.org, Joshua Crofts <crofts@kernel.org>
Subject: [PATCH 3/3] PM: runtime: add debugfs entry for pm_runtime_summary
Date: Tue, 10 Nov 2026 11:43:22 +0100 [thread overview]
Message-ID: <20261110-pm-runtime-summary-v1-3-12ebf283db78@kernel.org> (raw)
In-Reply-To: <20261110-pm-runtime-summary-v1-0-12ebf283db78@kernel.org>
Add a debugfs entry for showing the runtime statistics for devices with
PM runtime enabled.
Signed-off-by: Joshua Crofts <crofts@kernel.org>
---
drivers/base/power/runtime.c | 86 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 5087a52f1784f7b4493896bce147ebcb0424d17c..f5ea6ba6d20fc4a9a3088e1fcb20b70cd5ebe476 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -14,6 +14,8 @@
#include <linux/pm_runtime.h>
#include <linux/pm_wakeirq.h>
#include <linux/rculist.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
#include <trace/events/rpm.h>
#include "../base.h"
@@ -2193,3 +2195,87 @@ bool pm_runtime_need_not_resume(struct device *dev)
}
#endif /* CONFIG_PM_SLEEP */
+
+#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_PM_SLEEP)
+static void rpm_summary_show_dev(struct device *dev, void *data)
+{
+ struct seq_file *s = data;
+ unsigned long flags;
+ u64 active_time, suspended_time;
+ u64 last_sleep, min_sleep, max_sleep;
+ u64 resumes, suspends;
+ const char *status_str;
+ bool enabled;
+
+ spin_lock_irqsave(&dev->power.lock, flags);
+
+ enabled = pm_runtime_enabled(dev);
+ if (!enabled && !dev->power.resume_count && !dev->power.suspend_count) {
+ spin_unlock_irqrestore(&dev->power.lock, flags);
+ return;
+ }
+
+ update_pm_runtime_accounting(dev);
+
+ switch (dev->power.runtime_status) {
+ case RPM_ACTIVE:
+ status_str = "active";
+ break;
+ case RPM_SUSPENDED:
+ status_str = "suspended";
+ break;
+ case RPM_SUSPENDING:
+ status_str = "suspending";
+ break;
+ case RPM_RESUMING:
+ status_str = "resuming";
+ break;
+ default:
+ status_str = "unknown";
+ break;
+ }
+
+ active_time = dev->power.active_time;
+ suspended_time = dev->power.suspended_time;
+ resumes = dev->power.resume_count;
+ suspends = dev->power.suspend_count;
+ last_sleep = dev->power.last_suspended_time;
+ min_sleep = dev->power.min_suspended_time;
+ max_sleep = dev->power.max_suspended_time;
+
+ spin_unlock_irqrestore(&dev->power.lock, flags);
+
+ do_div(active_time, NSEC_PER_MSEC);
+ do_div(suspended_time, NSEC_PER_MSEC);
+ do_div(last_sleep, NSEC_PER_MSEC);
+ do_div(min_sleep, NSEC_PER_MSEC);
+ do_div(max_sleep, NSEC_PER_MSEC);
+
+ seq_printf(s, "%-32s %-12s %8llu %8llu %12llu %12llu %10llu %10llu %10llu\n",
+ dev_name(dev), enabled ? status_str : "disabled",
+ resumes, suspends, active_time, suspended_time,
+ last_sleep, min_sleep, max_sleep);
+}
+
+static int pm_runtime_summary_show(struct seq_file *s, void *unused)
+{
+ seq_printf(s, "%-32s %-12s %8s %8s %12s %12s %10s %10s %10s\n",
+ "Device", "Status", "Resumes", "Suspends",
+ "Active(ms)", "Suspend(ms)", "Last(ms)", "Min(ms)", "Max(ms)");
+ seq_puts(s, "--------------------------------------------------------------------------------------------------------------------------\n");
+
+ dpm_for_each_dev(s, rpm_summary_show_dev);
+
+ return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(pm_runtime_summary);
+
+static int __init pm_runtime_debugfs_init(void)
+{
+ debugfs_create_file("pm_runtime_summary", 0444, NULL, NULL,
+ &pm_runtime_summary_fops);
+
+ return 0;
+}
+late_initcall(pm_runtime_debugfs_init);
+#endif /* defined(CONFIG_DEBUG_FS) && defined(CONFIG_PM_SLEEP) */
--
2.47.3
prev parent reply other threads:[~2026-11-10 10:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 10:43 [PATCH 0/3] PM: runtime: add new runtime metrics and summary Joshua Crofts
2026-11-10 10:43 ` [PATCH 1/3] PM: runtime: add additional suspend/resume metrics Joshua Crofts
2026-11-10 10:43 ` [PATCH 2/3] PM: add sysfs attributes for " Joshua Crofts
2026-11-10 10:43 ` Joshua Crofts [this message]
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=20261110-pm-runtime-summary-v1-3-12ebf283db78@kernel.org \
--to=crofts@kernel.org \
--cc=dakr@kernel.org \
--cc=driver-core@lists.linux.dev \
--cc=gregkh@linuxfoundation.org \
--cc=johan@kernel.org \
--cc=lenb@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=pavel@kernel.org \
--cc=rafael@kernel.org \
/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 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®