diff options
author | Jonas Aaberg <jonas.aberg@stericsson.com> | 2011-08-25 11:39:12 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2012-03-19 08:49:08 +0100 |
commit | c0290cacc88e48927717f6ff515f7c80e92401dd (patch) | |
tree | bd1faf0b5eb5813fc36caece55561478d61a8714 /kernel | |
parent | 010cf71348948712a7e052fe3486dce0975a2e18 (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 4fd51beed87..f40d3095747 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -24,6 +24,7 @@ #include <linux/slab.h> #include <linux/export.h> #include <linux/suspend.h> +#include <linux/kthread.h> #include <linux/syscore_ops.h> #include <trace/events/power.h> @@ -162,9 +163,10 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) 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()); @@ -182,9 +184,6 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) arch_suspend_enable_irqs(); BUG_ON(irqs_disabled()); - Enable_cpus: - enable_nonboot_cpus(); - Platform_wake: if (suspend_ops->wake) suspend_ops->wake(); @@ -264,6 +263,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. @@ -277,6 +285,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; @@ -305,6 +314,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; } |