int __cpuinit cpu_up(unsigned int cpu) { int err = 0; #ifdef CONFIG_MEMORY_HOTPLUG int nid; pg_data_t *pgdat; #endif trace_cpu_hotplug(cpu, POWER_CPU_UP_START); if (!cpu_possible(cpu)) { printk(KERN_ERR "can't online cpu %d because it is not " "configured as may-hotadd at boot time\n", cpu); #if defined(CONFIG_IA64) printk(KERN_ERR "please check additional_cpus= boot " "parameter\n"); #endif return -EINVAL; } #ifdef CONFIG_MEMORY_HOTPLUG nid = cpu_to_node(cpu); if (!node_online(nid)) { err = mem_online_node(nid); if (err) return err; } pgdat = NODE_DATA(nid); if (!pgdat) { printk(KERN_ERR "Can't online cpu %d due to NULL pgdat\n", cpu); return -ENOMEM; } if (pgdat->node_zonelists->_zonerefs->zone == NULL) { mutex_lock(&zonelists_mutex); build_all_zonelists(NULL); mutex_unlock(&zonelists_mutex); } #endif cpu_maps_update_begin(); if (cpu_hotplug_disabled) { err = -EBUSY; goto out; } err = _cpu_up(cpu, 0); out: cpu_maps_update_done(); trace_cpu_hotplug(cpu, POWER_CPU_UP_DONE); return err; }
/* * platform_cpu_die: shutdown a CPU * @cpu: */ void platform_cpu_die(unsigned int cpu) { int spurious = 0; struct wd_api *wd_api = NULL; HOTPLUG_INFO("platform_cpu_die, cpu: %d\n", cpu); get_wd_api(&wd_api); if (wd_api) wd_api->wd_cpu_hot_plug_off_notify(cpu); #ifdef CONFIG_MTK_SCHED_TRACERS trace_cpu_hotplug(cpu, 0, per_cpu(last_event_ts, cpu)); per_cpu(last_event_ts, cpu) = ns2usecs(ftrace_now(cpu)); #endif /* * we're ready for shutdown now, so do it */ cpu_enter_lowpower(cpu); platform_do_lowpower(cpu, &spurious); /* * bring this CPU back into the world of cache * coherency, and then restore interrupts */ cpu_leave_lowpower(cpu); if (spurious) HOTPLUG_INFO("platform_do_lowpower, spurious wakeup call, cpu: %d, spurious: %d\n", cpu, spurious); }
int __ref cpu_down(unsigned int cpu) { int err; trace_cpu_hotplug(cpu, POWER_CPU_DOWN_START); cpu_maps_update_begin(); if (cpu_hotplug_disabled) { err = -EBUSY; goto out; } err = _cpu_down(cpu, 0); out: cpu_maps_update_done(); trace_cpu_hotplug(cpu, POWER_CPU_DOWN_DONE); return err; }