diff mbox

arm64: smp: Update the topology masks before calling CPU_STARTING notifiers

Message ID 1407892269-28650-1-git-send-email-rvaswani@codeaurora.org (mailing list archive)
State New, archived
Headers show

Commit Message

Rohit Vaswani Aug. 13, 2014, 1:11 a.m. UTC
Currently, the CPU_STARTING notifiers would observe an incorrect sibling
mask since the notifier chain is called before the topology masks are updated
for the new cpu.
Update the topology masks before calling the notifier chain to fix this
problem.

Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org>
---
 arch/arm/kernel/smp.c   | 4 ++--
 arch/arm64/kernel/smp.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

Comments

Will Deacon Aug. 15, 2014, 10:43 a.m. UTC | #1
On Wed, Aug 13, 2014 at 02:11:09AM +0100, Rohit Vaswani wrote:
> Currently, the CPU_STARTING notifiers would observe an incorrect sibling
> mask since the notifier chain is called before the topology masks are updated
> for the new cpu.
> Update the topology masks before calling the notifier chain to fix this
> problem.
> 
> Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org>
> ---
>  arch/arm/kernel/smp.c   | 4 ++--
>  arch/arm64/kernel/smp.c | 4 ++--
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
> index 7c4fada..0e2237c 100644
> --- a/arch/arm/kernel/smp.c
> +++ b/arch/arm/kernel/smp.c
> @@ -363,12 +363,12 @@ asmlinkage void secondary_start_kernel(void)
>  	if (smp_ops.smp_secondary_init)
>  		smp_ops.smp_secondary_init(cpu);
>  
> +	smp_store_cpu_info(cpu);
> +
>  	notify_cpu_starting(cpu);
>  
>  	calibrate_delay();
>  
> -	smp_store_cpu_info(cpu);
> -

Hmm, smp_store_cpu_info takes a copy of loops_per_jiffy. Are you sure it's
safe to move the call before calibrate_delay?

Will
Rohit Vaswani Aug. 15, 2014, 11:12 p.m. UTC | #2
On 8/15/2014 3:43 AM, Will Deacon wrote:
> On Wed, Aug 13, 2014 at 02:11:09AM +0100, Rohit Vaswani wrote:
>> Currently, the CPU_STARTING notifiers would observe an incorrect sibling
>> mask since the notifier chain is called before the topology masks are updated
>> for the new cpu.
>> Update the topology masks before calling the notifier chain to fix this
>> problem.
>>
>> Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org>
>> ---
>>   arch/arm/kernel/smp.c   | 4 ++--
>>   arch/arm64/kernel/smp.c | 4 ++--
>>   2 files changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
>> index 7c4fada..0e2237c 100644
>> --- a/arch/arm/kernel/smp.c
>> +++ b/arch/arm/kernel/smp.c
>> @@ -363,12 +363,12 @@ asmlinkage void secondary_start_kernel(void)
>>   	if (smp_ops.smp_secondary_init)
>>   		smp_ops.smp_secondary_init(cpu);
>>   
>> +	smp_store_cpu_info(cpu);
>> +
>>   	notify_cpu_starting(cpu);
>>   
>>   	calibrate_delay();
>>   
>> -	smp_store_cpu_info(cpu);
>> -
> Hmm, smp_store_cpu_info takes a copy of loops_per_jiffy. Are you sure it's
> safe to move the call before calibrate_delay?

Right! - I had looked at the arm64 version .  I checked for arm32 now 
and I think we should be
safe to move calibrate_delay before the smp_store_cpu_info and I can 
push a v2 version if
there are no concerns. I did not see calibrate_delay having any 
dependency for cpu_starting notifiers.

-Rohit
> Will


Thanks,
Rohit Vaswani
diff mbox

Patch

diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 7c4fada..0e2237c 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -363,12 +363,12 @@  asmlinkage void secondary_start_kernel(void)
 	if (smp_ops.smp_secondary_init)
 		smp_ops.smp_secondary_init(cpu);
 
+	smp_store_cpu_info(cpu);
+
 	notify_cpu_starting(cpu);
 
 	calibrate_delay();
 
-	smp_store_cpu_info(cpu);
-
 	/*
 	 * OK, now it's safe to let the boot CPU continue.  Wait for
 	 * the CPU migration code to notice that the CPU is online
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 3e2f5eb..4ae78fe 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -163,10 +163,10 @@  asmlinkage void secondary_start_kernel(void)
 	/*
 	 * Enable GIC and timers.
 	 */
-	notify_cpu_starting(cpu);
-
 	smp_store_cpu_info(cpu);
 
+	notify_cpu_starting(cpu);
+
 	/*
 	 * OK, now it's safe to let the boot CPU continue.  Wait for
 	 * the CPU migration code to notice that the CPU is online