]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
reboot: freeze processes before restart/shutdown
authorDeepak Nibade <dnibade@nvidia.com>
Thu, 4 Feb 2016 10:14:51 +0000 (15:44 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Tue, 23 Feb 2016 00:10:24 +0000 (16:10 -0800)
Add new API freeze_processes_ignore_wakeup() which will
freeze all processes ignoring the wakeup sources

Use this API before triggering restart/shutdown

Bug 200125494

Change-Id: I093d6e5dcc02fe3ff73c7c4d7c6bc14fa8e91cb8
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/1007555
(cherry picked from commit 32212d6e42147942a853aa5238a417497d31d1c6)
Reviewed-on: http://git-master/r/1013804
Reviewed-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
include/linux/freezer.h
kernel/power/process.c
kernel/reboot.c

index 7fd81b8c48971676cd52362f09722dfd2dd28153..f532274ec5b844aa0b14dad0d2fdd07639b8f69d 100644 (file)
@@ -43,6 +43,7 @@ extern void __thaw_task(struct task_struct *t);
 
 extern bool __refrigerator(bool check_kthr_stop);
 extern int freeze_processes(void);
+extern int freeze_processes_ignore_wakeup(void);
 extern int freeze_kernel_threads(void);
 extern void thaw_processes(void);
 extern void thaw_kernel_threads(void);
@@ -301,6 +302,7 @@ static inline void __thaw_task(struct task_struct *t) {}
 
 static inline bool __refrigerator(bool check_kthr_stop) { return false; }
 static inline int freeze_processes(void) { return -ENOSYS; }
+static inline int freeze_processes_ignore_wakeup(void) { return -ENOSYS; }
 static inline int freeze_kernel_threads(void) { return -ENOSYS; }
 static inline void thaw_processes(void) {}
 static inline void thaw_kernel_threads(void) {}
index e9a04b6baccb5b4c25fd86ab0dfb2751fe65fef1..1252051e81d37887b4fc10710340313915ec9107 100644 (file)
@@ -25,7 +25,7 @@
  */
 unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
 
-static int try_to_freeze_tasks(bool user_only)
+static int try_to_freeze_tasks(bool user_only, bool ignore_wakeup)
 {
        struct task_struct *g, *p;
        unsigned long end_time;
@@ -67,7 +67,7 @@ static int try_to_freeze_tasks(bool user_only)
                if (!todo || time_after(jiffies, end_time))
                        break;
 
-               if (pm_wakeup_pending()) {
+               if (!ignore_wakeup && pm_wakeup_pending()) {
 #ifdef CONFIG_PM_SLEEP
                        pm_get_active_wakeup_sources(suspend_abort,
                                MAX_SUSPEND_ABORT_LEN);
@@ -147,7 +147,7 @@ done:
  *
  * On success, returns 0.  On failure, -errno and system is fully thawed.
  */
-int freeze_processes(void)
+static int __freeze_processes(bool ignore_wakeup)
 {
        int error;
        int oom_kills_saved;
@@ -165,7 +165,7 @@ int freeze_processes(void)
        printk("Freezing user space processes ... ");
        pm_freezing = true;
        oom_kills_saved = oom_kills_count();
-       error = try_to_freeze_tasks(true);
+       error = try_to_freeze_tasks(true, ignore_wakeup);
        if (!error) {
                __usermodehelper_set_disable_depth(UMH_DISABLED);
                oom_killer_disable();
@@ -193,6 +193,16 @@ done:
        return error;
 }
 
+int freeze_processes(void)
+{
+       return __freeze_processes(false);
+}
+
+int freeze_processes_ignore_wakeup(void)
+{
+       return __freeze_processes(true);
+}
+
 /**
  * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator.
  *
@@ -207,7 +217,7 @@ int freeze_kernel_threads(void)
 
        printk("Freezing remaining freezable tasks ... ");
        pm_nosig_freezing = true;
-       error = try_to_freeze_tasks(false);
+       error = try_to_freeze_tasks(false, false);
        if (!error)
                printk("done.");
 
index 5925f5ae8dff0a3810761ef2255627b4ccdedea1..9dff66175d9a262533a0545ff17383248c08605f 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/syscalls.h>
 #include <linux/syscore_ops.h>
 #include <linux/uaccess.h>
+#include <linux/freezer.h>
 
 /*
  * this indicates whether you can reboot with ctrl-alt-del: the default is yes
@@ -213,6 +214,7 @@ void migrate_to_reboot_cpu(void)
  */
 void kernel_restart(char *cmd)
 {
+       freeze_processes_ignore_wakeup();
        kernel_restart_prepare(cmd);
        migrate_to_reboot_cpu();
        syscore_shutdown();
@@ -256,6 +258,7 @@ EXPORT_SYMBOL_GPL(kernel_halt);
  */
 void kernel_power_off(void)
 {
+       freeze_processes_ignore_wakeup();
        kernel_shutdown_prepare(SYSTEM_POWER_OFF);
        if (pm_power_off_prepare)
                pm_power_off_prepare();