diff options
Diffstat (limited to 'kernel/cpu.c')
| -rw-r--r-- | kernel/cpu.c | 55 | 
1 files changed, 23 insertions, 32 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index b5e4ab2d427..198a38883e6 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -133,6 +133,27 @@ static void cpu_hotplug_done(void)  	mutex_unlock(&cpu_hotplug.lock);  } +/* + * Wait for currently running CPU hotplug operations to complete (if any) and + * disable future CPU hotplug (from sysfs). The 'cpu_add_remove_lock' protects + * the 'cpu_hotplug_disabled' flag. The same lock is also acquired by the + * hotplug path before performing hotplug operations. So acquiring that lock + * guarantees mutual exclusion from any currently running hotplug operations. + */ +void cpu_hotplug_disable(void) +{ +	cpu_maps_update_begin(); +	cpu_hotplug_disabled = 1; +	cpu_maps_update_done(); +} + +void cpu_hotplug_enable(void) +{ +	cpu_maps_update_begin(); +	cpu_hotplug_disabled = 0; +	cpu_maps_update_done(); +} +  #else /* #if CONFIG_HOTPLUG_CPU */  static void cpu_hotplug_begin(void) {}  static void cpu_hotplug_done(void) {} @@ -541,36 +562,6 @@ static int __init alloc_frozen_cpus(void)  core_initcall(alloc_frozen_cpus);  /* - * Prevent regular CPU hotplug from racing with the freezer, by disabling CPU - * hotplug when tasks are about to be frozen. Also, don't allow the freezer - * to continue until any currently running CPU hotplug operation gets - * completed. - * To modify the 'cpu_hotplug_disabled' flag, we need to acquire the - * 'cpu_add_remove_lock'. And this same lock is also taken by the regular - * CPU hotplug path and released only after it is complete. Thus, we - * (and hence the freezer) will block here until any currently running CPU - * hotplug operation gets completed. - */ -void cpu_hotplug_disable_before_freeze(void) -{ -	cpu_maps_update_begin(); -	cpu_hotplug_disabled = 1; -	cpu_maps_update_done(); -} - - -/* - * When tasks have been thawed, re-enable regular CPU hotplug (which had been - * disabled while beginning to freeze tasks). - */ -void cpu_hotplug_enable_after_thaw(void) -{ -	cpu_maps_update_begin(); -	cpu_hotplug_disabled = 0; -	cpu_maps_update_done(); -} - -/*   * When callbacks for CPU hotplug notifications are being executed, we must   * ensure that the state of the system with respect to the tasks being frozen   * or not, as reported by the notification, remains unchanged *throughout the @@ -589,12 +580,12 @@ cpu_hotplug_pm_callback(struct notifier_block *nb,  	case PM_SUSPEND_PREPARE:  	case PM_HIBERNATION_PREPARE: -		cpu_hotplug_disable_before_freeze(); +		cpu_hotplug_disable();  		break;  	case PM_POST_SUSPEND:  	case PM_POST_HIBERNATION: -		cpu_hotplug_enable_after_thaw(); +		cpu_hotplug_enable();  		break;  	default:  |