|
|
|
@ -171,40 +171,30 @@ static struct cpuidle_state shared_states[] = { |
|
|
|
|
.enter = &shared_cede_loop }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n, |
|
|
|
|
unsigned long action, void *hcpu) |
|
|
|
|
static int pseries_cpuidle_cpu_online(unsigned int cpu) |
|
|
|
|
{ |
|
|
|
|
int hotcpu = (unsigned long)hcpu; |
|
|
|
|
struct cpuidle_device *dev = |
|
|
|
|
per_cpu(cpuidle_devices, hotcpu); |
|
|
|
|
struct cpuidle_device *dev = per_cpu(cpuidle_devices, cpu); |
|
|
|
|
|
|
|
|
|
if (dev && cpuidle_get_driver()) { |
|
|
|
|
switch (action) { |
|
|
|
|
case CPU_ONLINE: |
|
|
|
|
case CPU_ONLINE_FROZEN: |
|
|
|
|
cpuidle_pause_and_lock(); |
|
|
|
|
cpuidle_enable_device(dev); |
|
|
|
|
cpuidle_resume_and_unlock(); |
|
|
|
|
break; |
|
|
|
|
cpuidle_pause_and_lock(); |
|
|
|
|
cpuidle_enable_device(dev); |
|
|
|
|
cpuidle_resume_and_unlock(); |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case CPU_DEAD: |
|
|
|
|
case CPU_DEAD_FROZEN: |
|
|
|
|
cpuidle_pause_and_lock(); |
|
|
|
|
cpuidle_disable_device(dev); |
|
|
|
|
cpuidle_resume_and_unlock(); |
|
|
|
|
break; |
|
|
|
|
static int pseries_cpuidle_cpu_dead(unsigned int cpu) |
|
|
|
|
{ |
|
|
|
|
struct cpuidle_device *dev = per_cpu(cpuidle_devices, cpu); |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
return NOTIFY_DONE; |
|
|
|
|
} |
|
|
|
|
if (dev && cpuidle_get_driver()) { |
|
|
|
|
cpuidle_pause_and_lock(); |
|
|
|
|
cpuidle_disable_device(dev); |
|
|
|
|
cpuidle_resume_and_unlock(); |
|
|
|
|
} |
|
|
|
|
return NOTIFY_OK; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct notifier_block setup_hotplug_notifier = { |
|
|
|
|
.notifier_call = pseries_cpuidle_add_cpu_notifier, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* pseries_cpuidle_driver_init() |
|
|
|
|
*/ |
|
|
|
@ -273,7 +263,14 @@ static int __init pseries_processor_idle_init(void) |
|
|
|
|
return retval; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
register_cpu_notifier(&setup_hotplug_notifier); |
|
|
|
|
retval = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, |
|
|
|
|
"cpuidle/pseries:online", |
|
|
|
|
pseries_cpuidle_cpu_online, NULL); |
|
|
|
|
WARN_ON(retval < 0); |
|
|
|
|
retval = cpuhp_setup_state_nocalls(CPUHP_CPUIDLE_DEAD, |
|
|
|
|
"cpuidle/pseries:DEAD", NULL, |
|
|
|
|
pseries_cpuidle_cpu_dead); |
|
|
|
|
WARN_ON(retval < 0); |
|
|
|
|
printk(KERN_DEBUG "pseries_idle_driver registered\n"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|