[PATCH] arm64: Improve parking of stopped CPUs

Suzuki K Poulose Suzuki.Poulose at arm.com
Wed Feb 1 06:31:38 PST 2017


On 01/02/17 14:16, Will Deacon wrote:
> On Wed, Feb 01, 2017 at 09:48:52AM +0000, Jayachandran C wrote:
>> The current code puts the stopped cpus in an 'yield' instruction loop.
>> Using a busy loop here is unnecessary, we can use the cpu_park_loop()
>> function here to do a wfi/wfe.
>>
>> Signed-off-by: Jayachandran C <jnair at caviumnetworks.com>
>> ---
>>  arch/arm64/kernel/smp.c | 3 +--
>>  1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
>> index cbaab44..0691d2f 100644
>> --- a/arch/arm64/kernel/smp.c
>> +++ b/arch/arm64/kernel/smp.c
>> @@ -829,8 +829,7 @@ static void ipi_cpu_stop(unsigned int cpu)
>>
>>  	local_irq_disable();
>>
>> -	while (1)
>> -		cpu_relax();
>> +	cpu_park_loop();
>>  }
>
> Hmm, so we actually added the yield for QEMU's benefit iirc, where QEMU
> will trap the yield and schedule a different vCPU. Should we be adding
> a yield to cpu_park_loop instead?

Wouldn't wfi/wfe trigger the same ? I don't know how yield affects a physical
CPU. The cpu_park_loop is also used by CPUs which cannot run due to the missing
capabilities on the system. As long as yield() doesn't affect the PCPUs, we
could do that. Going another step further, we could also include
local_irq_disable() in cpu_park_loop().

Suzuki



More information about the linux-arm-kernel mailing list