+ Gautham, @Gautham: Can you please help reviewing this one ?
On 13-12-17, 13:49, Abhishek Goel wrote: > @@ -693,6 +746,8 @@ static int powernv_cpufreq_target_index(struct > cpufreq_policy *policy, > { > struct powernv_smp_call_data freq_data; > unsigned int cur_msec, gpstate_idx; > + cpumask_t temp; > + u32 cpu; > struct global_pstate_info *gpstates = policy->driver_data; > > if (unlikely(rebooting) && new_index != get_nominal_index()) > @@ -761,24 +816,48 @@ static int powernv_cpufreq_target_index(struct > cpufreq_policy *policy, > spin_unlock(&gpstates->gpstate_lock); > > /* > - * Use smp_call_function to send IPI and execute the > - * mtspr on target CPU. We could do that without IPI > - * if current CPU is within policy->cpus (core) > + * Use smp_call_function to send IPI and execute the mtspr on CPU. > + * This needs to be done on every core of the policy Why on each CPU ? > */ > - smp_call_function_any(policy->cpus, set_pstate, &freq_data, 1); > + cpumask_copy(&temp, policy->cpus); > + > + while (!cpumask_empty(&temp)) { > + cpu = cpumask_first(&temp); > + smp_call_function_any(cpu_sibling_mask(cpu), > + set_pstate, &freq_data, 1); > + cpumask_andnot(&temp, &temp, cpu_sibling_mask(cpu)); > + } > + > return 0; > } -- viresh