Need help understanding the logic of __cpuidle_set_driver
AYAN KUMAR HALDER
ayankumarh at gmail.com
Fri Aug 22 08:06:23 EDT 2014
>> However, regarding the logic, I have a few doubts -
>>
>> 1. for each cpu in drv->cpumask, if there is already a driver
>> registered, its calling __cpuidle_unset_driver which loops over for
>> each cpu in drv->cpumask again. Isn't it unnecessary to do this nested
>> calls?
>
>
> It is to rollback the previous changes done in the loop.
However, I have two concerns here:-
1.
static inline int __cpuidle_set_driver(struct cpuidle_driver *drv)
{
int cpu;
struct cpuidle_driver *tmp = NULL;
for_each_cpu(cpu, drv->cpumask) {
tmp = __cpuidle_get_cpu_driver(cpu); /* This would
prevent nesting of loops */
if ( tmp != NULL ) {
if ( tmp == drv )
per_cpu(cpuidle_drivers, cpu) = NULL;
return -EBUSY;
}
per_cpu(cpuidle_drivers, cpu) = drv;
}
return 0;
}
Instead of calling __cpuidle_unset_driver() which would loop-over
again for all the cpus , is it not that the above function would be
more efficient.
2. Secondly, if the cpuidle driver to be registered matches to the one
already registered , then why should it be unset instead of leaving it
as it is.
Any views would be highly appreciated.
More information about the Kernelnewbies
mailing list