Re: Cpufreq userspace governor start/stop issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2013/6/5 Viresh Kumar <viresh.kumar@xxxxxxxxxx>:
> On 5 June 2013 08:54, Xiaoguang Chen <chenxg.marvell@xxxxxxxxx> wrote:
>> Hi, Guys
>
> Hi Xiaoguang,
>
>> I met another question for cpufreq governor. When hotplug out one cpu,
>> cpufreq will remove the cpu device and also call governor stop, if
>> there are more than 1 cpu and cpu0 is the root for cpufreq, other cpus
>> are linked to cpu0. then policy->cpu is 0 always.
>
> Not really.. There are situations when this will not hold true..
> If you hot-unplug cpu0, then next cpu in line, i.e. cpu 1, will become
> policy->cpu :)
>

Yes, I know this. but usually we dont' allow hotplug cpu0. So the root is
cpu0 most of the time. this is just one example if policy->cpu is not changed.


>> in userspace governor, when governor stop is called, it will set
>> per_cpu(cpu_is_managed, cpu) = 0
>
> To make it clear, cpu_is_managed isn't telling which cpu is managing
> 'cpu' but if governor is enabled for cpu 'cpu' or not.
Yes, that should be the intent for this variable, but unluckily we get
'cpu' as 0
even when we hotplug cpu3.

>
>> but the cpu is policy->cpu which is 0 always.
>>
>>        case CPUFREQ_GOV_STOP:
>>                 mutex_lock(&userspace_mutex);
>>                 cpus_using_userspace_governor--;
>>                 if (cpus_using_userspace_governor == 0) {
>>                         cpufreq_unregister_notifier(
>>                                         &userspace_cpufreq_notifier_block,
>>                                         CPUFREQ_TRANSITION_NOTIFIER);
>>                 }
>>
>>                 per_cpu(cpu_is_managed, cpu) = 0;
>>                 per_cpu(cpu_min_freq, cpu) = 0;
>>                 per_cpu(cpu_max_freq, cpu) = 0;
>>                 per_cpu(cpu_set_freq, cpu) = 0;
>>                 pr_debug("managing cpu %u stopped\n", cpu);
>>                 mutex_unlock(&userspace_mutex);
>>                 break;
>>
>>
>> also in userspace governor store_setspeed function cpufreq_set will
>> retun error if per_cpu(cpu_is_managed, cpu) is 0 which means it will
>> not change frequency .
>>
>> static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
>> {
>> int ret = -EINVAL;
>>
>> pr_debug("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);
>>
>> mutex_lock(&userspace_mutex);
>> if (!per_cpu(cpu_is_managed, policy->cpu))
>> goto err;
>>
>> per_cpu(cpu_set_freq, policy->cpu) = freq;
>> ...........
>>
>>
>>
>> So consider below case:
>> 1) cpu0 tries to hotplug cpu3, it calls userspace governor stop
>> function, it should stop cpu3's userspace governor, but it actually
>> set cpu0's per_cpu(cpu_is_managed, cpu) to 0.
>> 2) cpu0 tries to change cpu freuqency through userspace governor, but
>> it will never succeed since cpufreq_set will return err if cpu0'
>> percpu variable cpu_is_managed is 0.
>> 3) unless there is another cpu hotplug in operation, in which it calls
>> governor start and set cpu_is_managed to 1, then the frequency change
>> will go on and doesn't report error.
>>
>> The reason here is policy->cpu is always 0 if we use managed policy
>> for all cpus. but we can't see which cpu's governor want's to
>> start/stop in userspace goveror. we can only get the information from
>> struct policy, but this policy doesn't include the exact cpu that
>> wants to do governor start/stop.
>>
>>
>> Any suggestions for this issue?
>
> Hmm.. the problem is bigger than what you observed..
> I am starting to cleanup userspace governor now and will cc you
> for my patches. Please test them and give your Tested-by :)

Ok, thanks
--
To unsubscribe from this list: send the line "unsubscribe cpufreq" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Devel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Forum]     [Linux SCSI]

  Powered by Linux