/* * drivers/power/smp.c - Functions for stopping other CPUs. * * Copyright 2004 Pavel Machek * Copyright (C) 2002-2003 Nigel Cunningham * * This file is released under the GPLv2. */ #undef DEBUG #include #include #include #include #include #include #include /* This is protected by pm_sem semaphore */ static cpumask_t frozen_cpus; void disable_nonboot_cpus(void) { int cpu, error; error = 0; cpus_clear(frozen_cpus); printk("Freezing cpus ...\n"); for_each_online_cpu(cpu) { if (cpu == 0) continue; error = cpu_down(cpu); if (!error) { cpu_set(cpu, frozen_cpus); printk("CPU%d is down\n", cpu); continue; } printk("Error taking cpu %d down: %d\n", cpu, error); } BUG_ON(raw_smp_processor_id() != 0); if (error) panic("cpus not sleeping"); } void enable_nonboot_cpus(void) { int cpu, error; printk("Thawing cpus ...\n"); for_each_cpu_mask(cpu, frozen_cpus) { error = smp_prepare_cpu(cpu); if (!error) error = cpu_up(cpu); if (!error) { printk("CPU%d is up\n", cpu); continue; } printk("Error taking cpu %d up: %d\n", cpu, error); panic("Not enough cpus"); } cpus_clear(frozen_cpus); }