/* Requires cpu_add_remove_lock to be held */ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) { int ret, nr_calls = 0; void *hcpu = (void *)(long)cpu; unsigned long mod = tasks_frozen ? CPU_TASKS_FROZEN : 0; struct task_struct *idle; cpu_hotplug_begin(); sec_debug_task_log_msg(cpu, "cpu_up+"); if (cpu_online(cpu) || !cpu_present(cpu)) { ret = -EINVAL; goto out; } idle = idle_thread_get(cpu); if (IS_ERR(idle)) { ret = PTR_ERR(idle); goto out; } ret = smpboot_create_threads(cpu); if (ret) goto out; ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); if (ret) { nr_calls--; printk(KERN_WARNING "%s: attempt to bring up CPU %u failed\n", __func__, cpu); goto out_notify; } /* Arch-specific enabling code. */ ret = __cpu_up(cpu, idle); if (ret != 0) goto out_notify; BUG_ON(!cpu_online(cpu)); /* Wake the per cpu threads */ smpboot_unpark_threads(cpu); /* Now call notifier in preparation. */ cpu_notify(CPU_ONLINE | mod, hcpu); out_notify: if (ret != 0) __cpu_notify(CPU_UP_CANCELED | mod, hcpu, nr_calls, NULL); out: sec_debug_task_log_msg(cpu, "cpu_up-"); cpu_hotplug_done(); return ret; }
int __ref cpu_down(unsigned int cpu) { int err; cpu_maps_update_begin(); sec_debug_task_log_msg(cpu, "cpu_down+"); if (cpu_hotplug_disabled) { err = -EBUSY; goto out; } err = _cpu_down(cpu, 0); out: sec_debug_task_log_msg(cpu, "cpu_down-"); cpu_maps_update_done(); return err; }
int __ref cpu_down(unsigned int cpu) { int err; if (num_online_cpus() <= pm_qos_request(PM_QOS_CPU_ONLINE_MIN)) return 0; cpu_maps_update_begin(); sec_debug_task_log_msg(cpu, "cpudown+"); if (cpu_hotplug_disabled) { err = -EBUSY; goto out; } err = _cpu_down(cpu, 0); out: pr_info("_cpu_down ret=%d\n", err); sec_debug_task_log_msg(cpu, "cpudown-"); cpu_maps_update_done(); return err; }
/* Requires cpu_add_remove_lock to be held */ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) { int ret, nr_calls = 0; void *hcpu = (void *)(long)cpu; unsigned long mod = tasks_frozen ? CPU_TASKS_FROZEN : 0; if (cpu_online(cpu) || !cpu_present(cpu)) return -EINVAL; cpu_hotplug_begin(); sec_debug_task_log_msg(cpu, "cpuup+"); ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); if (ret) { nr_calls--; printk(KERN_WARNING "%s: attempt to bring up CPU %u failed\n", __func__, cpu); goto out_notify; } /* Arch-specific enabling code. */ ret = __cpu_up(cpu); if (ret != 0) goto out_notify; BUG_ON(!cpu_online(cpu)); /* Now call notifier in preparation. */ cpu_notify(CPU_ONLINE | mod, hcpu); out_notify: if (ret != 0) __cpu_notify(CPU_UP_CANCELED | mod, hcpu, nr_calls, NULL); sec_debug_task_log_msg(cpu, "cpuup-"); cpu_hotplug_done(); return ret; }