On Fri, Jul 14, 2017 at 10:33:20AM +0530, Viresh Kumar wrote:
On 13-07-17, 19:02, Saravana Kannan wrote:
Honestly, this seems like such a chip/platform specific decision. There's no reason that one can't have a chip where you can change the frequency of any CPU from any other CPU. If there's such a limitation, we should let that be handled at the CPU freq driver level instead of having to know about any of that at the scheduler. Heck, at worst case, the CPU freq driver can send an IPI and execute that work on the CPU of interest.
In all Qualcomm chipsets (well, at least the ones that have been used in Android devices so far), we can switch the frequency of any CPU from any other CPU. If we can do that even without fast switching, why wouldn't any theoretical fast switching be incapable of supporting this?
I spoke with Sudeep since the last email; and the proposed interface (SCMI) is a shmem/mailbox one, which can indeed change the frequency of another CPU.
Is this a limitation specific to x86 that we are assuming all architectures and platforms are going to have?
You are right in that x86 cannot do this. Sending IPIs is fairly expensive though :/
The default assumption in cpufreq core is that any CPU from a policy can change freq for that policy. Yes, we surely have cases where any CPU can change freq of any other CPU (even in different policies). Perhaps all ARM platforms are like that, not sure.
And so I added a special flag for that in my previous version, but the idea here is to get a simple solution merged first and then we can have a separate patch later to support freq switching from all CPUs.
I was going to write things about serialization here. How allowing remote updates would require extra serialization, in part inspired by your Changelog comment that says cpufreq-shared provides the required serialization.
But I think that's all nonsense... That is, yes cpufreq-shared needs additional serialization, but that's not relevant for the problem at hand.
The thing is, all of this cpufreq_update_*() crud is called with the relevant rq->lock held. So all those calls are already fully serialized between CPUs.