PM: Add pm_trace switch
Subsystems (2)
RFC PATCH 1/1 PM: Add pm_trace switch
Add the pm_trace attribute in /sys/power which has to be set to one so that the "PM tracing" functionality is really enabled.
--- include/linux/resume-trace.h | 24 ++++++++++++++---------- kernel/power/main.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-)
include/linux/resume-trace.h +14 -10
@@ -3,21 +3,25 @@#ifdef CONFIG_PM_TRACE +extern int pm_trace_enabled; +struct device ;extern void set_trace_device (struct device *);extern void generate_resume_trace (void *tracedata,unsigned int user);#define TRACE_DEVICE (dev) set_trace_device(dev) -#define TRACE_RESUME (user) do { \ - void *tracedata; \ - asm volatile("movl $1f,%0\n" \ - ".section .tracedata,\"a\"\n" \ - "1:\t.word %c1\n" \ - "\t.long %c2\n" \ - ".previous" \ - :"=r" (tracedata) \ - : "i" (__LINE__), "i" (__FILE__)); \ - generate_resume_trace(tracedata, user); \ +#define TRACE_RESUME (user) do { \ + if (pm_trace_enabled) { \ + void *tracedata; \ + asm volatile("movl $1f,%0\n" \ + ".section .tracedata,\"a\"\n" \ + "1:\t.word %c1\n" \ + "\t.long %c2\n" \ + ".previous" \ + :"=r" (tracedata) \ + : "i" (__LINE__), "i" (__FILE__)); \ + generate_resume_trace(tracedata, user); \ + } \ } while (0)#else
kernel/power/main.c +30 -0
@@ -17,6 +17,7 @@#include <linux/pm.h> #include <linux/console.h> #include <linux/cpu.h> +#include <linux/resume-trace.h> #include "power.h"
@@ -285,10 +286,39 @@ static ssize_t state_store(struct subsyspower_attr (state); +#ifdef CONFIG_PM_TRACE +int pm_trace_enabled; + +static ssize_t pm_trace_show (struct subsystem * subsys,char * buf) +{ +return sprintf (buf,"%d\n" , pm_trace_enabled); +} + +static ssize_t +pm_trace_store (struct subsystem * subsys,const char * buf,size_t n) +{ +int val; + +if (sscanf (buf,"%d" , &val) ==1 ) { + pm_trace_enabled = !!val; +return n; + } +return -EINVAL ; +} + +power_attr (pm_trace); + +static struct attribute * g[] = { + &state_attr.attr, + &pm_trace_attr.attr, +NULL , +}; +#else static struct attribute * g[] = { &state_attr.attr,NULL , }; +#endif /* CONFIG_PM_TRACE */ static struct attribute_group attr_group = { .attrs = g,
Quoted 4 lines · Rafael J. Wysocki
Add the
pm_traceattribute in/sys/powerwhich has to be set to one so that the "PM tracing" functionality is really enabled.Signed-off-by Rafael J. Wysocki <[email protected]>
ACK and thanks for patience.
Quoted 102 lines
--- include/linux/resume-trace.h | 24 ++++++++++++++---------- kernel/power/main.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-)Index:
linux-2.6.18-rc4-mm1/include/linux/resume-trace.h
===================================================================include/linux/resume-trace.h +14
-10@@ -3,21 +3,25 @@#ifdef CONFIG_PM_TRACE +extern int pm_trace_enabled; +struct device ;extern void set_trace_device (struct device *);extern void generate_resume_trace (void *tracedata,unsigned int user);#define TRACE_DEVICE (dev) set_trace_device(dev) -#define TRACE_RESUME (user) do { \ - void *tracedata; \ - asm volatile("movl $1f,%0\n" \ - ".section .tracedata,\"a\"\n" \ - "1:\t.word %c1\n" \ - "\t.long %c2\n" \ - ".previous" \ - :"=r" (tracedata) \ - : "i" (__LINE__), "i" (__FILE__)); \ - generate_resume_trace(tracedata, user); \ +#define TRACE_RESUME (user) do { \ + if (pm_trace_enabled) { \ + void *tracedata; \ + asm volatile("movl $1f,%0\n" \ + ".section .tracedata,\"a\"\n" \ + "1:\t.word %c1\n" \ + "\t.long %c2\n" \ + ".previous" \ + :"=r" (tracedata) \ + : "i" (__LINE__), "i" (__FILE__)); \ + generate_resume_trace(tracedata, user); \ + } \ } while (0)#else Index:
linux-2.6.18-rc4-mm1/kernel/power/main.c
===================================================================kernel/power/main.c +30
-1@@ -17,6 +17,7 @@#include <linux/pm.h> #include <linux/console.h> #include <linux/cpu.h> +#include <linux/resume-trace.h> #include "power.h" @@ -285,10 +286,39 @@ static ssize_t state_store(struct subsyspower_attr (state); +#ifdef CONFIG_PM_TRACE +int pm_trace_enabled; + +static ssize_t pm_trace_show (struct subsystem * subsys,char * buf) +{ +return sprintf (buf,"%d\n" , pm_trace_enabled); +} + +static ssize_t +pm_trace_store (struct subsystem * subsys,const char * buf,size_t n) +{ +int val; + +if (sscanf (buf,"%d" , &val) ==1 ) { + pm_trace_enabled = !!val; +return n; + } +return -EINVAL ; +} + +power_attr (pm_trace); + +static struct attribute * g[] = { + &state_attr.attr, + &pm_trace_attr.attr, +NULL , +}; +#else static struct attribute * g[] = { &state_attr.attr,NULL , }; +#endif /* CONFIG_PM_TRACE */ static struct attribute_group attr_group = { .attrs = g, -To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html