xen/arm: missing put_cpu in xen_percpu_init

Message ID 1375113966-2859-1-git-send-email-julien.grall@linaro.org
State Accepted
Commit 0d7febe58413884f6428143221971618fbf3a47d
Headers show

Commit Message

Julien Grall July 29, 2013, 4:06 p.m.
When CONFIG_PREEMPT is enabled, Linux will not be able to boot and warn:
[    4.127825] ------------[ cut here ]------------
[    4.133376] WARNING: at init/main.c:699 do_one_initcall+0x150/0x158()
[    4.140738] initcall xen_init_events+0x0/0x10c returned with preemption imbalance

This is because xen_percpu_init uses get_cpu but doesn't have the corresponding
put_cpu.

Signed-off-by: Julien Grall <julien.grall@linaro.org>
---
 arch/arm/xen/enlighten.c |    1 +
 1 file changed, 1 insertion(+)

Comments

Stefano Stabellini Aug. 2, 2013, 5:18 p.m. | #1
On Mon, 29 Jul 2013, Julien Grall wrote:
> When CONFIG_PREEMPT is enabled, Linux will not be able to boot and warn:
> [    4.127825] ------------[ cut here ]------------
> [    4.133376] WARNING: at init/main.c:699 do_one_initcall+0x150/0x158()
> [    4.140738] initcall xen_init_events+0x0/0x10c returned with preemption imbalance
> 
> This is because xen_percpu_init uses get_cpu but doesn't have the corresponding
> put_cpu.
> 
> Signed-off-by: Julien Grall <julien.grall@linaro.org>

Ops. Thanks for catching the bug.
I'll add this to my queue.


>  arch/arm/xen/enlighten.c |    1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
> index f71c37e..dc9f284 100644
> --- a/arch/arm/xen/enlighten.c
> +++ b/arch/arm/xen/enlighten.c
> @@ -170,6 +170,7 @@ static void __init xen_percpu_init(void *unused)
>  	per_cpu(xen_vcpu, cpu) = vcpup;
>  
>  	enable_percpu_irq(xen_events_irq, 0);
> +	put_cpu();
>  }
>  
>  static void xen_restart(char str, const char *cmd)
> -- 
> 1.7.10.4
>

Patch

diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index f71c37e..dc9f284 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -170,6 +170,7 @@  static void __init xen_percpu_init(void *unused)
 	per_cpu(xen_vcpu, cpu) = vcpup;
 
 	enable_percpu_irq(xen_events_irq, 0);
+	put_cpu();
 }
 
 static void xen_restart(char str, const char *cmd)