Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 35695
b: refs/heads/master
c: c5c6ba4
h: refs/heads/master
i:
  35693: cd24f55
  35691: a77f4af
  35687: b8855f6
  35679: dfacf56
v: v3
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Sep 26, 2006
1 parent bc0dc0a commit 0d91992
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7d145aa3abf4d96c91f37c012facd5cfbb9010d1
refs/heads/master: c5c6ba4e08ab9c9e390a0f3a7d9a5c332f5cc6ef
15 changes: 15 additions & 0 deletions trunk/Documentation/power/interface.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,18 @@ suspend image will be as small as possible.

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.
24 changes: 14 additions & 10 deletions trunk/include/linux/resume-trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 30 additions & 0 deletions trunk/kernel/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/pm.h>
#include <linux/console.h>
#include <linux/cpu.h>
#include <linux/resume-trace.h>

#include "power.h"

Expand Down Expand Up @@ -281,10 +282,39 @@ static ssize_t state_store(struct subsystem * subsys, const char * buf, size_t n

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,
Expand Down

0 comments on commit 0d91992

Please sign in to comment.