[PATCH 6/9] PM: suspend_block: Add debugfs file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Report active and inactive suspend blockers in/sys/kernel/debug/suspend_blockers.
Signed-off-by: Arve Hjønnevåg <arve@xxxxxxxxxxx>--- kernel/power/suspend_blocker.c |   45 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/kernel/power/suspend_blocker.c b/kernel/power/suspend_blocker.cindex 94832ca..da7248a 100644--- a/kernel/power/suspend_blocker.c+++ b/kernel/power/suspend_blocker.c@@ -18,6 +18,7 @@ #include <linux/suspend.h> #include <linux/suspend_blocker.h> #include <linux/sysdev.h>+#include <linux/debugfs.h> #include "power.h"  enum {@@ -42,6 +43,7 @@ struct workqueue_struct *suspend_work_queue; struct suspend_blocker main_suspend_blocker; static suspend_state_t requested_suspend_state = PM_SUSPEND_MEM; static bool enable_suspend_blockers;+static struct dentry *suspend_blocker_stats_dentry;  #define pr_info_time(fmt, args...) \ 	do { \@@ -55,6 +57,21 @@ static bool enable_suspend_blockers; 			tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec); \ 	} while (0); +static int suspend_blocker_stats_show(struct seq_file *m, void *unused)+{+	unsigned long irqflags;+	struct suspend_blocker *blocker;++	seq_puts(m, "name\tactive\n");+	spin_lock_irqsave(&list_lock, irqflags);+	list_for_each_entry(blocker, &inactive_blockers, link)+		seq_printf(m, "\"%s\"\t0\n", blocker->name);+	list_for_each_entry(blocker, &active_blockers, link)+		seq_printf(m, "\"%s\"\t1\n", blocker->name);+	spin_unlock_irqrestore(&list_lock, irqflags);+	return 0;+}+ static void print_active_blockers_locked(void) { 	struct suspend_blocker *blocker;@@ -128,8 +145,8 @@ static struct sys_device suspend_block_sysdev = { /**  * suspend_blocker_init() - Initialize a suspend blocker  * @blocker:	The suspend blocker to initialize.- * @name:	The name of the suspend blocker to show in debug messages.- *+ * @name:	The name of the suspend blocker to show in debug messages and+ *		/sys/kernel/debug/suspend_blockers.  * The suspend blocker struct and name must not be freed before calling  * suspend_blocker_destroy.  */@@ -257,6 +274,19 @@ void request_suspend_state(suspend_state_t state) 	spin_unlock_irqrestore(&state_lock, irqflags); } +static int suspend_blocker_stats_open(struct inode *inode, struct file *file)+{+	return single_open(file, suspend_blocker_stats_show, NULL);+}++static const struct file_operations suspend_blocker_stats_fops = {+	.owner = THIS_MODULE,+	.open = suspend_blocker_stats_open,+	.read = seq_read,+	.llseek = seq_lseek,+	.release = single_release,+};+ static int __init suspend_block_init(void) { 	int ret;@@ -292,8 +322,18 @@ err_sysdev_class_register: 	return ret; } +static int __init suspend_block_postcore_init(void)+{+	if (!suspend_work_queue)+		return 0;+	suspend_blocker_stats_dentry = debugfs_create_file("suspend_blockers",+			S_IRUGO, NULL, NULL, &suspend_blocker_stats_fops);+	return 0;+}+ static void  __exit suspend_block_exit(void) {+	debugfs_remove(suspend_blocker_stats_dentry); 	destroy_workqueue(suspend_work_queue); 	sysdev_unregister(&suspend_block_sysdev); 	sysdev_class_unregister(&suspend_block_sysclass);@@ -301,4 +341,5 @@ static void  __exit suspend_block_exit(void) }  core_initcall(suspend_block_init);+postcore_initcall(suspend_block_postcore_init); module_exit(suspend_block_exit);-- 1.6.1
_______________________________________________linux-pm mailing listlinux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx://lists.linux-foundation.org/mailman/listinfo/linux-pm


[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux