diff options
-rw-r--r-- | Documentation/power/freezing-of-tasks.txt | 5 | ||||
-rw-r--r-- | include/linux/freezer.h | 5 | ||||
-rw-r--r-- | kernel/power/main.c | 27 | ||||
-rw-r--r-- | kernel/power/process.c | 4 |
4 files changed, 39 insertions, 2 deletions
diff --git a/Documentation/power/freezing-of-tasks.txt b/Documentation/power/freezing-of-tasks.txt index 6ec291ea1c78..85894d83b352 100644 --- a/Documentation/power/freezing-of-tasks.txt +++ b/Documentation/power/freezing-of-tasks.txt | |||
@@ -223,3 +223,8 @@ since they ask the freezer to skip freezing this task, since it is anyway | |||
223 | only after the entire suspend/hibernation sequence is complete. | 223 | only after the entire suspend/hibernation sequence is complete. |
224 | So, to summarize, use [un]lock_system_sleep() instead of directly using | 224 | So, to summarize, use [un]lock_system_sleep() instead of directly using |
225 | mutex_[un]lock(&pm_mutex). That would prevent freezing failures. | 225 | mutex_[un]lock(&pm_mutex). That would prevent freezing failures. |
226 | |||
227 | V. Miscellaneous | ||
228 | /sys/power/pm_freeze_timeout controls how long it will cost at most to freeze | ||
229 | all user space processes or all freezable kernel threads, in unit of millisecond. | ||
230 | The default value is 20000, with range of unsigned integer. | ||
diff --git a/include/linux/freezer.h b/include/linux/freezer.h index e4238ceaa4d6..e70df40d84f6 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h | |||
@@ -13,6 +13,11 @@ extern bool pm_freezing; /* PM freezing in effect */ | |||
13 | extern bool pm_nosig_freezing; /* PM nosig freezing in effect */ | 13 | extern bool pm_nosig_freezing; /* PM nosig freezing in effect */ |
14 | 14 | ||
15 | /* | 15 | /* |
16 | * Timeout for stopping processes | ||
17 | */ | ||
18 | extern unsigned int freeze_timeout_msecs; | ||
19 | |||
20 | /* | ||
16 | * Check if a process has been frozen | 21 | * Check if a process has been frozen |
17 | */ | 22 | */ |
18 | static inline bool frozen(struct task_struct *p) | 23 | static inline bool frozen(struct task_struct *p) |
diff --git a/kernel/power/main.c b/kernel/power/main.c index b1c26a92ca9f..d77663bfedeb 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -553,6 +553,30 @@ power_attr(pm_trace_dev_match); | |||
553 | 553 | ||
554 | #endif /* CONFIG_PM_TRACE */ | 554 | #endif /* CONFIG_PM_TRACE */ |
555 | 555 | ||
556 | #ifdef CONFIG_FREEZER | ||
557 | static ssize_t pm_freeze_timeout_show(struct kobject *kobj, | ||
558 | struct kobj_attribute *attr, char *buf) | ||
559 | { | ||
560 | return sprintf(buf, "%u\n", freeze_timeout_msecs); | ||
561 | } | ||
562 | |||
563 | static ssize_t pm_freeze_timeout_store(struct kobject *kobj, | ||
564 | struct kobj_attribute *attr, | ||
565 | const char *buf, size_t n) | ||
566 | { | ||
567 | unsigned long val; | ||
568 | |||
569 | if (kstrtoul(buf, 10, &val)) | ||
570 | return -EINVAL; | ||
571 | |||
572 | freeze_timeout_msecs = val; | ||
573 | return n; | ||
574 | } | ||
575 | |||
576 | power_attr(pm_freeze_timeout); | ||
577 | |||
578 | #endif /* CONFIG_FREEZER*/ | ||
579 | |||
556 | static struct attribute * g[] = { | 580 | static struct attribute * g[] = { |
557 | &state_attr.attr, | 581 | &state_attr.attr, |
558 | #ifdef CONFIG_PM_TRACE | 582 | #ifdef CONFIG_PM_TRACE |
@@ -576,6 +600,9 @@ static struct attribute * g[] = { | |||
576 | &pm_print_times_attr.attr, | 600 | &pm_print_times_attr.attr, |
577 | #endif | 601 | #endif |
578 | #endif | 602 | #endif |
603 | #ifdef CONFIG_FREEZER | ||
604 | &pm_freeze_timeout_attr.attr, | ||
605 | #endif | ||
579 | NULL, | 606 | NULL, |
580 | }; | 607 | }; |
581 | 608 | ||
diff --git a/kernel/power/process.c b/kernel/power/process.c index d5a258b60c6f..98088e0e71e8 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -21,7 +21,7 @@ | |||
21 | /* | 21 | /* |
22 | * Timeout for stopping processes | 22 | * Timeout for stopping processes |
23 | */ | 23 | */ |
24 | #define TIMEOUT (20 * HZ) | 24 | unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC; |
25 | 25 | ||
26 | static int try_to_freeze_tasks(bool user_only) | 26 | static int try_to_freeze_tasks(bool user_only) |
27 | { | 27 | { |
@@ -36,7 +36,7 @@ static int try_to_freeze_tasks(bool user_only) | |||
36 | 36 | ||
37 | do_gettimeofday(&start); | 37 | do_gettimeofday(&start); |
38 | 38 | ||
39 | end_time = jiffies + TIMEOUT; | 39 | end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs); |
40 | 40 | ||
41 | if (!user_only) | 41 | if (!user_only) |
42 | freeze_workqueues_begin(); | 42 | freeze_workqueues_begin(); |