[PATCHv2 3/5] cpuidle: add support for states that affect multiple cpus
From: Colin Cross <hidden>
Date: 2012-03-16 00:20:14
Also in:
linux-pm, lkml
On Thu, Mar 15, 2012 at 5:04 PM, Kevin Hilman [off-list ref] wrote:
Colin Cross [off-list ref] writes:quoted
+/** + * cpuidle_coupled_cpu_set_alive - adjust alive_count during hotplug transitions + * @cpu: target cpu number + * @alive: whether the target cpu is going up or down + * + * Run on the cpu that is bringing up the target cpu, before the target cpu + * has been booted, or after the target cpu is completely dead. + */ +static void cpuidle_coupled_cpu_set_alive(int cpu, bool alive) +{ + ? ? struct cpuidle_device *dev; + ? ? struct cpuidle_coupled *coupled; + + ? ? mutex_lock(&cpuidle_lock); + + ? ? dev = per_cpu(cpuidle_devices, cpu); + ? ? if (!dev->coupled) + ? ? ? ? ? ? goto out; + + ? ? coupled = dev->coupled; + + ? ? /* + ? ? ?* waiting_count must be at least 1 less than alive_count, because + ? ? ?* this cpu is not waiting. ?Spin until all cpus have noticed this cpu + ? ? ?* is not idle and exited the ready loop before changing alive_count. + ? ? ?*/ + ? ? while (atomic_read(&coupled->ready_count)) + ? ? ? ? ? ? cpu_relax(); + + ? ? smp_mb__before_atomic_inc(); + ? ? atomic_inc(&coupled->alive_count);This doesn't look quite right. ?alive_count is incrmented whether the CPU is going up or down? Maybe I misunderstood something, but I don't see anywhere where alive_count is decrmemented after a CPU is removed.
Oops, dropped the atomic_dec when I merged from two separate functions for up and down to a single function that takes a bool.
quoted
+ ? ? smp_mb__after_atomic_inc(); + + ? ? if (alive) + ? ? ? ? ? ? coupled->requested_state[dev->cpu] = CPUIDLE_COUPLED_NOT_IDLE; + ? ? else + ? ? ? ? ? ? coupled->requested_state[dev->cpu] = CPUIDLE_COUPLED_DEAD; + +out: + ? ? mutex_unlock(&cpuidle_lock); +} +