Subject: [PATCH v1] ARM: rockchip: Add cpu hotplug support for RK3XXX SoCs

From: [email-masked] (Romain Perier)
Date: Fri, 18 Jul 2014 18:43:21 +0200

Le 18/07/2014 10:29, Russell King - ARM Linux a ?crit :
> On Fri, Jul 18, 2014 at 08:16:02AM +0200, Romain Perier wrote:
>> you're probably talking about __cpu_die at
>> http://lxr.free-electrons.com/source/arch/arm/kernel/smp.c#L223 . The
>> problem being that the thread below which executes cpu_die completes the
>> completion before executing smp_ops.cpu_die. So smp_ops.cpu_kill might
>> be executed before smp_ops.cpu_die (in some cases cache coherency would
>> not be turned off). Note that almost all SoCs do the same thing.
> Look at what's happening:
>
> 	CPU0				CPU1
> 	wait_for_completion_timeout()
> 					idle_task_exit()
> 					flush_cache_louis()
> 					complete(&cpu_died);
>
> At this point, it is safe for CPU1 to be powered down.
>
> 	smp_ops.cpu_kill(cpu);
> 					flush_cache_louis();
> 					smp_ops.cpu_die(cpu);
>
> If we include your code at that point, then the sequence in totality
> becomes:
>
> 	wait_for_completion_timeout()
> 					idle_task_exit()
> 					flush_cache_louis()
> 					complete(&cpu_died);
> 	--- rockchip_cpu_kill ---
> 	wait_for_completion_timeout()
> 					flush_cache_louis();
> 					--- rockchip_cpu_die ---
> 					complete(&cpu_died);
> 	pmu_set_power_domain(0 + cpu, false);
> 					flush_cache_louis();
> 					v7_exit_coherency_flush(louis);
> 					while(1)
> 						cpu_do_idle();
>
> So, I repeat my question.  What is the point of your additional wait
> in rockchip_cpu_kill() and complete in rockchip_cpu_die()?
>
Mhhh... you're right... my bad ! So either smp_ops.cpu_kill(cpu) is 
executed before smp_ops.cpu_die and in this case it is safe to power 
down the cpu. or smp_ops.cpu_die(cpu) is executed before 
smp_ops.cpu_kill(due) and it is safe too.

I will send a new patch (v2)

Romain