]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
Merge branch 'pm-sleep'
authorRafael J. Wysocki <rjw@sisk.pl>
Sun, 4 Mar 2012 22:11:14 +0000 (23:11 +0100)
committerRafael J. Wysocki <rjw@sisk.pl>
Sun, 4 Mar 2012 22:11:14 +0000 (23:11 +0100)
* pm-sleep:
  PM / Freezer: Remove references to TIF_FREEZE in comments
  PM / Sleep: Add more wakeup source initialization routines
  PM / Hibernate: Enable usermodehelpers in hibernate() error path
  PM / Sleep: Make __pm_stay_awake() delete wakeup source timers
  PM / Sleep: Fix race conditions related to wakeup source timer function
  PM / Sleep: Fix possible infinite loop during wakeup source destruction
  PM / Hibernate: print physical addresses consistently with other parts of kernel
  PM: Add comment describing relationships between PM callbacks to pm.h
  PM / Sleep: Drop suspend_stats_update()
  PM / Sleep: Make enter_state() in kernel/power/suspend.c static
  PM / Sleep: Unify kerneldoc comments in kernel/power/suspend.c
  PM / Sleep: Remove unnecessary label from suspend_freeze_processes()
  PM / Sleep: Do not check wakeup too often in try_to_freeze_tasks()
  PM / Sleep: Initialize wakeup source locks in wakeup_source_add()
  PM / Hibernate: Refactor and simplify freezer_test_done
  PM / Hibernate: Thaw kernel threads in hibernation_snapshot() in error/test path
  PM / Freezer / Docs: Document the beauty of freeze/thaw semantics
  PM / Suspend: Avoid code duplication in suspend statistics update
  PM / Sleep: Introduce generic callbacks for new device PM phases
  PM / Sleep: Introduce "late suspend" and "early resume" of devices

1  2 
kernel/exit.c

diff --combined kernel/exit.c
index 4b4042f9bc6ade78a14199eb4ce96dc4ce6236b3,fd0af05e06390bd0fceff91e407b250765f2ba01..8e6b0e626b980cf51588bc5e32ffa6c736fde509
@@@ -424,7 -424,7 +424,7 @@@ void daemonize(const char *name, ...
         */
        exit_mm(current);
        /*
-        * We don't want to have TIF_FREEZE set if the system-wide hibernation
+        * We don't want to get frozen, in case system-wide hibernation
         * or suspend transition begins right now.
         */
        current->flags |= (PF_NOFREEZE | PF_KTHREAD);
@@@ -1038,22 -1038,6 +1038,22 @@@ void do_exit(long code
        if (tsk->nr_dirtied)
                __this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied);
        exit_rcu();
 +
 +      /*
 +       * The setting of TASK_RUNNING by try_to_wake_up() may be delayed
 +       * when the following two conditions become true.
 +       *   - There is race condition of mmap_sem (It is acquired by
 +       *     exit_mm()), and
 +       *   - SMI occurs before setting TASK_RUNINNG.
 +       *     (or hypervisor of virtual machine switches to other guest)
 +       *  As a result, we may become TASK_RUNNING after becoming TASK_DEAD
 +       *
 +       * To avoid it, we have to wait for releasing tsk->pi_lock which
 +       * is held by try_to_wake_up()
 +       */
 +      smp_mb();
 +      raw_spin_unlock_wait(&tsk->pi_lock);
 +
        /* causes final put_task_struct in finish_task_switch(). */
        tsk->state = TASK_DEAD;
        tsk->flags |= PF_NOFREEZE;      /* tell freezer to ignore us */