diff options
author | Jonas Aaberg <jonas.aberg@stericsson.com> | 2011-08-25 11:39:12 +0200 |
---|---|---|
committer | Jonas ABERG <jonas.aberg@stericsson.com> | 2011-10-27 15:44:28 +0200 |
commit | 7f07cfe07461d45ebfa9dc2d80b277aaeee95734 (patch) | |
tree | 427248270ae66c6cd02e0e0d4e36783813836459 /kernel | |
parent | 8d12596d5be3962625ad1872fb894c021a008e5f (diff) |
suspend: plug/unplug non-boot cpus in threads
In order to save >100ms during resume, plugging and unplugging
the secondary cpus are done in separate threads instead
of in sequence with device suspend/resume calls.
ST-Ericsson Linux next: Not tested, ask SSM for ER
ST-Ericsson ID: ER356920
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Ie2b28595e777b056e486ae6c3d90736bb274a307
Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/34871
Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Reviewed-by: Bengt JONSSON <bengt.g.jonsson@stericsson.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/power/suspend.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 63774df522b..e47e9621c25 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -22,6 +22,7 @@ #include <linux/mm.h> #include <linux/slab.h> #include <linux/suspend.h> +#include <linux/kthread.h> #include <linux/syscore_ops.h> #include <trace/events/power.h> @@ -159,9 +160,10 @@ static int suspend_enter(suspend_state_t state) if (suspend_test(TEST_PLATFORM)) goto Platform_wake; + error = disable_nonboot_cpus(); if (error || suspend_test(TEST_CPUS)) - goto Enable_cpus; + goto Platform_wake; arch_suspend_disable_irqs(); BUG_ON(!irqs_disabled()); @@ -178,9 +180,6 @@ static int suspend_enter(suspend_state_t state) arch_suspend_enable_irqs(); BUG_ON(irqs_disabled()); - Enable_cpus: - enable_nonboot_cpus(); - Platform_wake: if (suspend_ops->wake) suspend_ops->wake(); @@ -256,6 +255,15 @@ static void suspend_finish(void) pm_restore_console(); } +static int plug_secondary_cpus(void *data) +{ + if (!(suspend_test(TEST_FREEZER) || + suspend_test(TEST_DEVICES) || + suspend_test(TEST_PLATFORM))) + enable_nonboot_cpus(); + return 0; +} + /** * enter_state - Do common work of entering low-power state. * @state: pm_state structure for state we're entering. @@ -269,6 +277,7 @@ static void suspend_finish(void) int enter_state(suspend_state_t state) { int error; + struct task_struct *cpu_task; if (!valid_state(state)) return -ENODEV; @@ -297,6 +306,11 @@ int enter_state(suspend_state_t state) pr_debug("PM: Finishing wakeup.\n"); suspend_finish(); Unlock: + + cpu_task = kthread_run(plug_secondary_cpus, + NULL, "cpu-plug"); + BUG_ON(IS_ERR(cpu_task)); + mutex_unlock(&pm_mutex); return error; } |