Mailing List Archive

[PATCH -mm] PM: Add pm_trace switch
Add the pm_trace attribute in /sys/power which has to be explicitly set to one
to really enable the "PM tracing" code compiled in when CONFIG_PM_TRACE is
set (which modifies the machine's CMOS clock in unpredictable ways).

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
---
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
===================================================================
--- linux-2.6.18-rc4-mm1.orig/include/linux/resume-trace.h 2006-08-13 14:54:42.000000000 +0200
+++ linux-2.6.18-rc4-mm1/include/linux/resume-trace.h 2006-08-17 12:27:34.000000000 +0200
@@ -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
===================================================================
--- linux-2.6.18-rc4-mm1.orig/kernel/power/main.c 2006-08-14 20:51:47.000000000 +0200
+++ linux-2.6.18-rc4-mm1/kernel/power/main.c 2006-08-17 12:34:23.000000000 +0200
@@ -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 subsys

power_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 majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH -mm] PM: Add pm_trace switch [ In reply to ]
On Tue, 29 Aug 2006 13:09:57 +0200
"Rafael J. Wysocki" <rjw@sisk.pl> wrote:

> +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);

<grumbles about documentation>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH -mm] PM: Add pm_trace switch [ In reply to ]
On Tuesday 29 August 2006 22:46, Andrew Morton wrote:
> On Tue, 29 Aug 2006 13:09:57 +0200
> "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
>
> > +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);
>
> <grumbles about documentation>

Well, this is the most difficult part. ;-)

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
Documentation/power/interface.txt | 15 +++++++++++++++
1 file changed, 15 insertions(+)

Index: linux-2.6.18-rc4-mm3/Documentation/power/interface.txt
===================================================================
--- linux-2.6.18-rc4-mm3.orig/Documentation/power/interface.txt 2006-06-18 03:49:35.000000000 +0200
+++ linux-2.6.18-rc4-mm3/Documentation/power/interface.txt 2006-08-30 11:59:31.000000000 +0200
@@ -52,3 +52,18 @@ suspend image will be as small as possib

Reading from this file will display the current image size limit, which
is set to 500 MB by default.
+
+/sys/power/pm_trace controls the code which saves the last PM event point in
+the RTC across reboots, so that you can debug a machine that just hangs
+during suspend (or more commonly, during resume). Namely, the RTC is only
+used to save the last PM event point if this file contains '1'. Initially it
+contains '0' which may be changed to '1' by writing a string representing a
+nonzero integer into it.
+
+To use this debugging feature you should attempt to suspend the machine, then
+reboot it and run
+
+ dmesg -s 1000000 | grep 'hash matches'
+
+CAUTION: Using it will cause your machine's real-time (CMOS) clock to be
+set to a random invalid time after a resume.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH -mm] PM: Add pm_trace switch [ In reply to ]
On Wed, Aug 30, 2006 at 12:02:59PM +0200, Rafael J. Wysocki wrote:
> On Tuesday 29 August 2006 22:46, Andrew Morton wrote:
> > On Tue, 29 Aug 2006 13:09:57 +0200
> > "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
> >
> > > +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);
> >
> > <grumbles about documentation>
>
> Well, this is the most difficult part. ;-)
>
> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> ---
> Documentation/power/interface.txt | 15 +++++++++++++++

Please update Documentation/ABI/ too.

thanks,

greg k-h
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH -mm] PM: Add pm_trace switch [ In reply to ]
On Wednesday 30 August 2006 19:22, Greg KH wrote:
> On Wed, Aug 30, 2006 at 12:02:59PM +0200, Rafael J. Wysocki wrote:
> > On Tuesday 29 August 2006 22:46, Andrew Morton wrote:
> > > On Tue, 29 Aug 2006 13:09:57 +0200
> > > "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
> > >
> > > > +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);
> > >
> > > <grumbles about documentation>
> >
> > Well, this is the most difficult part. ;-)
> >
> > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> > ---
> > Documentation/power/interface.txt | 15 +++++++++++++++
>
> Please update Documentation/ABI/ too.

I could, but there's nothing related to /sys/power/ in Documentation/ABI/
right now.

Do you mean I should create a file for /sys/power/ in there? If so, what
should I put in there? I guess pretty much the same as in
Documentation/power/interface.txt ...

Greetings,
Rafael


--
You never change things by fighting the existing reality.
R. Buckminster Fuller
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH -mm] PM: Add pm_trace switch [ In reply to ]
On Wed, Aug 30, 2006 at 10:22:36PM +0200, Rafael J. Wysocki wrote:
> On Wednesday 30 August 2006 19:22, Greg KH wrote:
> > On Wed, Aug 30, 2006 at 12:02:59PM +0200, Rafael J. Wysocki wrote:
> > > On Tuesday 29 August 2006 22:46, Andrew Morton wrote:
> > > > On Tue, 29 Aug 2006 13:09:57 +0200
> > > > "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
> > > >
> > > > > +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);
> > > >
> > > > <grumbles about documentation>
> > >
> > > Well, this is the most difficult part. ;-)
> > >
> > > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> > > ---
> > > Documentation/power/interface.txt | 15 +++++++++++++++
> >
> > Please update Documentation/ABI/ too.
>
> I could, but there's nothing related to /sys/power/ in Documentation/ABI/
> right now.
>
> Do you mean I should create a file for /sys/power/ in there? If so, what
> should I put in there? I guess pretty much the same as in
> Documentation/power/interface.txt ...

Exactly :)

thanks,

greg k-h
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH -mm] PM: Add pm_trace switch [ In reply to ]
On Wednesday 30 August 2006 22:33, Greg KH wrote:
> On Wed, Aug 30, 2006 at 10:22:36PM +0200, Rafael J. Wysocki wrote:
> > On Wednesday 30 August 2006 19:22, Greg KH wrote:
> > > On Wed, Aug 30, 2006 at 12:02:59PM +0200, Rafael J. Wysocki wrote:
> > > > On Tuesday 29 August 2006 22:46, Andrew Morton wrote:
> > > > > On Tue, 29 Aug 2006 13:09:57 +0200
> > > > > "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
> > > > >
> > > > > > +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);
> > > > >
> > > > > <grumbles about documentation>
> > > >
> > > > Well, this is the most difficult part. ;-)
> > > >
> > > > Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
> > > > ---
> > > > Documentation/power/interface.txt | 15 +++++++++++++++
> > >
> > > Please update Documentation/ABI/ too.
> >
> > I could, but there's nothing related to /sys/power/ in Documentation/ABI/
> > right now.
> >
> > Do you mean I should create a file for /sys/power/ in there? If so, what
> > should I put in there? I guess pretty much the same as in
> > Documentation/power/interface.txt ...
>
> Exactly :)

Okay, but I think that should be done in a separate patch.

Greetings,
Rafael


--
You never change things by fighting the existing reality.
R. Buckminster Fuller
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/