Skip to content

Commit b730bab

Browse files
committed
PM: sleep: stats: Use an array of step failure counters
Instead of using a set of individual struct suspend_stats fields representing suspend step failure counters, use an array of counters indexed by enum suspend_stat_step for this purpose, which allows dpm_save_failed_step() to increment the appropriate counter automatically, so that its callers don't need to do that directly. It also allows suspend_stats_show() to carry out a loop over the counters array to print their values. Because the counters cannot become negative, use unsigned int for representing them. The only user-observable impact of this change is a different ordering of entries in the suspend_stats debugfs file which is not expected to matter. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent bc88528 commit b730bab

4 files changed

Lines changed: 40 additions & 46 deletions

File tree

drivers/base/power/main.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,6 @@ static void device_resume_noirq(struct device *dev, pm_message_t state, bool asy
686686
TRACE_RESUME(error);
687687

688688
if (error) {
689-
suspend_stats.failed_resume_noirq++;
690689
dpm_save_failed_step(SUSPEND_RESUME_NOIRQ);
691690
dpm_save_failed_dev(dev_name(dev));
692691
pm_dev_err(dev, state, async ? " async noirq" : " noirq", error);
@@ -817,7 +816,6 @@ static void device_resume_early(struct device *dev, pm_message_t state, bool asy
817816
complete_all(&dev->power.completion);
818817

819818
if (error) {
820-
suspend_stats.failed_resume_early++;
821819
dpm_save_failed_step(SUSPEND_RESUME_EARLY);
822820
dpm_save_failed_dev(dev_name(dev));
823821
pm_dev_err(dev, state, async ? " async early" : " early", error);
@@ -974,7 +972,6 @@ static void device_resume(struct device *dev, pm_message_t state, bool async)
974972
TRACE_RESUME(error);
975973

976974
if (error) {
977-
suspend_stats.failed_resume++;
978975
dpm_save_failed_step(SUSPEND_RESUME);
979976
dpm_save_failed_dev(dev_name(dev));
980977
pm_dev_err(dev, state, async ? " async" : "", error);
@@ -1323,10 +1320,9 @@ static int dpm_noirq_suspend_devices(pm_message_t state)
13231320
if (!error)
13241321
error = async_error;
13251322

1326-
if (error) {
1327-
suspend_stats.failed_suspend_noirq++;
1323+
if (error)
13281324
dpm_save_failed_step(SUSPEND_SUSPEND_NOIRQ);
1329-
}
1325+
13301326
dpm_show_time(starttime, state, error, "noirq");
13311327
trace_suspend_resume(TPS("dpm_suspend_noirq"), state.event, false);
13321328
return error;
@@ -1509,8 +1505,8 @@ int dpm_suspend_late(pm_message_t state)
15091505
async_synchronize_full();
15101506
if (!error)
15111507
error = async_error;
1508+
15121509
if (error) {
1513-
suspend_stats.failed_suspend_late++;
15141510
dpm_save_failed_step(SUSPEND_SUSPEND_LATE);
15151511
dpm_resume_early(resume_event(state));
15161512
}
@@ -1789,10 +1785,10 @@ int dpm_suspend(pm_message_t state)
17891785
async_synchronize_full();
17901786
if (!error)
17911787
error = async_error;
1792-
if (error) {
1793-
suspend_stats.failed_suspend++;
1788+
1789+
if (error)
17941790
dpm_save_failed_step(SUSPEND_SUSPEND);
1795-
}
1791+
17961792
dpm_show_time(starttime, state, error, NULL);
17971793
trace_suspend_resume(TPS("dpm_suspend"), state.event, false);
17981794
return error;
@@ -1943,11 +1939,11 @@ int dpm_suspend_start(pm_message_t state)
19431939
int error;
19441940

19451941
error = dpm_prepare(state);
1946-
if (error) {
1947-
suspend_stats.failed_prepare++;
1942+
if (error)
19481943
dpm_save_failed_step(SUSPEND_PREPARE);
1949-
} else
1944+
else
19501945
error = dpm_suspend(state);
1946+
19511947
dpm_show_time(starttime, state, error, "start");
19521948
return error;
19531949
}

include/linux/suspend.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,12 @@ enum suspend_stat_step {
5252
SUSPEND_RESUME
5353
};
5454

55+
#define SUSPEND_NR_STEPS SUSPEND_RESUME
56+
5557
struct suspend_stats {
58+
unsigned int step_failures[SUSPEND_NR_STEPS];
5659
int success;
5760
int fail;
58-
int failed_freeze;
59-
int failed_prepare;
60-
int failed_suspend;
61-
int failed_suspend_late;
62-
int failed_suspend_noirq;
63-
int failed_resume;
64-
int failed_resume_early;
65-
int failed_resume_noirq;
6661
#define REC_FAILED_NUM 2
6762
int last_failed_dev;
6863
char failed_devs[REC_FAILED_NUM][40];
@@ -95,6 +90,7 @@ static inline void dpm_save_failed_errno(int err)
9590

9691
static inline void dpm_save_failed_step(enum suspend_stat_step step)
9792
{
93+
suspend_stats.step_failures[step-1]++;
9894
suspend_stats.failed_steps[suspend_stats.last_failed_step] = step;
9995
suspend_stats.last_failed_step++;
10096
suspend_stats.last_failed_step %= REC_FAILED_NUM;

kernel/power/main.c

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -341,18 +341,28 @@ static struct kobj_attribute _name = __ATTR_RO(_name)
341341

342342
suspend_attr(success, "%d\n");
343343
suspend_attr(fail, "%d\n");
344-
suspend_attr(failed_freeze, "%d\n");
345-
suspend_attr(failed_prepare, "%d\n");
346-
suspend_attr(failed_suspend, "%d\n");
347-
suspend_attr(failed_suspend_late, "%d\n");
348-
suspend_attr(failed_suspend_noirq, "%d\n");
349-
suspend_attr(failed_resume, "%d\n");
350-
suspend_attr(failed_resume_early, "%d\n");
351-
suspend_attr(failed_resume_noirq, "%d\n");
352344
suspend_attr(last_hw_sleep, "%llu\n");
353345
suspend_attr(total_hw_sleep, "%llu\n");
354346
suspend_attr(max_hw_sleep, "%llu\n");
355347

348+
#define suspend_step_attr(_name, step) \
349+
static ssize_t _name##_show(struct kobject *kobj, \
350+
struct kobj_attribute *attr, char *buf) \
351+
{ \
352+
return sprintf(buf, "%u\n", \
353+
suspend_stats.step_failures[step-1]); \
354+
} \
355+
static struct kobj_attribute _name = __ATTR_RO(_name)
356+
357+
suspend_step_attr(failed_freeze, SUSPEND_FREEZE);
358+
suspend_step_attr(failed_prepare, SUSPEND_PREPARE);
359+
suspend_step_attr(failed_suspend, SUSPEND_SUSPEND);
360+
suspend_step_attr(failed_suspend_late, SUSPEND_SUSPEND_LATE);
361+
suspend_step_attr(failed_suspend_noirq, SUSPEND_SUSPEND_NOIRQ);
362+
suspend_step_attr(failed_resume, SUSPEND_RESUME);
363+
suspend_step_attr(failed_resume_early, SUSPEND_RESUME_EARLY);
364+
suspend_step_attr(failed_resume_noirq, SUSPEND_RESUME_NOIRQ);
365+
356366
static ssize_t last_failed_dev_show(struct kobject *kobj,
357367
struct kobj_attribute *attr, char *buf)
358368
{
@@ -439,29 +449,22 @@ static const struct attribute_group suspend_attr_group = {
439449
static int suspend_stats_show(struct seq_file *s, void *unused)
440450
{
441451
int i, index, last_dev, last_errno, last_step;
452+
enum suspend_stat_step step;
442453

443454
last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
444455
last_dev %= REC_FAILED_NUM;
445456
last_errno = suspend_stats.last_failed_errno + REC_FAILED_NUM - 1;
446457
last_errno %= REC_FAILED_NUM;
447458
last_step = suspend_stats.last_failed_step + REC_FAILED_NUM - 1;
448459
last_step %= REC_FAILED_NUM;
449-
seq_printf(s, "%s: %d\n%s: %d\n%s: %d\n%s: %d\n%s: %d\n"
450-
"%s: %d\n%s: %d\n%s: %d\n%s: %d\n%s: %d\n",
451-
"success", suspend_stats.success,
452-
"fail", suspend_stats.fail,
453-
"failed_freeze", suspend_stats.failed_freeze,
454-
"failed_prepare", suspend_stats.failed_prepare,
455-
"failed_suspend", suspend_stats.failed_suspend,
456-
"failed_suspend_late",
457-
suspend_stats.failed_suspend_late,
458-
"failed_suspend_noirq",
459-
suspend_stats.failed_suspend_noirq,
460-
"failed_resume", suspend_stats.failed_resume,
461-
"failed_resume_early",
462-
suspend_stats.failed_resume_early,
463-
"failed_resume_noirq",
464-
suspend_stats.failed_resume_noirq);
460+
461+
seq_printf(s, "success: %d\nfail: %d\n",
462+
suspend_stats.success, suspend_stats.fail);
463+
464+
for (step = SUSPEND_FREEZE; step <= SUSPEND_NR_STEPS; step++)
465+
seq_printf(s, "failed_%s: %u\n", suspend_step_names[step],
466+
suspend_stats.step_failures[step-1]);
467+
465468
seq_printf(s, "failures:\n last_failed_dev:\t%-s\n",
466469
suspend_stats.failed_devs[last_dev]);
467470
for (i = 1; i < REC_FAILED_NUM; i++) {

kernel/power/suspend.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,6 @@ static int suspend_prepare(suspend_state_t state)
367367
if (!error)
368368
return 0;
369369

370-
suspend_stats.failed_freeze++;
371370
dpm_save_failed_step(SUSPEND_FREEZE);
372371
pm_notifier_call_chain(PM_POST_SUSPEND);
373372
Restore:

0 commit comments

Comments
 (0)