diff mbox

clockevent: exynos_mct: fix lockdep warning

Message ID 1380120578-17458-1-git-send-email-tom.leiming@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ming Lei Sept. 25, 2013, 2:49 p.m. UTC
This patch moves request_irq() out of cpu notifier callback
to fix below lockdep warning:

[    0.249513] ------------[ cut here ]------------
[    0.249525] WARNING: CPU: 1 PID: 0 at kernel/lockdep.c:2740 lockdep_trace_alloc+0xc8/0x10c()
[    0.249534] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
[    0.249538] Modules linked in:
[    0.249548] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.12.0-rc1-next-20130923+ #338
[    0.249564] [<c00165d0>] (unwind_backtrace+0x0/0xec) from [<c0012b48>] (show_stack+0x20/0x24)
[    0.249577] [<c0012b48>] (show_stack+0x20/0x24) from [<c04ebf0c>] (dump_stack+0x74/0xb4)
[    0.249591] [<c04ebf0c>] (dump_stack+0x74/0xb4) from [<c00237a8>] (warn_slowpath_common+0x78/0x9c)
[    0.249604] [<c00237a8>] (warn_slowpath_common+0x78/0x9c) from [<c0023888>] (warn_slowpath_fmt+0x40/0x48)
[    0.249615] [<c0023888>] (warn_slowpath_fmt+0x40/0x48) from [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c)
[    0.249626] [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c) from [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x2
24)
[    0.249638] [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x224) from [<c006bc4c>] (request_threaded_irq+0x90/0x130)
[    0.249651] [<c006bc4c>] (request_threaded_irq+0x90/0x130) from [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140)
[    0.249663] [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140) from [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0)
[    0.249675] [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0) from [<c04f4e18>] (notifier_call_chain+0x48/0x78)
[    0.249688] [<c04f4e18>] (notifier_call_chain+0x48/0x78) from [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c)
[    0.249700] [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c) from [<c0023908>] (__cpu_notify+0x3c/0x58)
[    0.249713] [<c0023908>] (__cpu_notify+0x3c/0x58) from [<c0023944>] (cpu_notify+0x20/0x24)
[    0.249725] [<c0023944>] (cpu_notify+0x20/0x24) from [<c002407c>] (notify_cpu_starting+0x58/0x60)
[    0.249737] [<c002407c>] (notify_cpu_starting+0x58/0x60) from [<c00143cc>] (secondary_start_kernel+0xec/0x13
8)
[    0.249748] [<c00143cc>] (secondary_start_kernel+0xec/0x138) from [<40008664>] (0x40008664)
[    0.249767] ---[ end trace 3406ff24bd97382e ]---

Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-samsung-soc@vger.kernel.org
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
 drivers/clocksource/exynos_mct.c |   34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

Comments

Daniel Lezcano Sept. 26, 2013, 12:39 a.m. UTC | #1
On 09/25/2013 04:49 PM, Ming Lei wrote:
> This patch moves request_irq() out of cpu notifier callback
> to fix below lockdep warning:
> 
> [    0.249513] ------------[ cut here ]------------
> [    0.249525] WARNING: CPU: 1 PID: 0 at kernel/lockdep.c:2740 lockdep_trace_alloc+0xc8/0x10c()
> [    0.249534] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
> [    0.249538] Modules linked in:
> [    0.249548] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.12.0-rc1-next-20130923+ #338
> [    0.249564] [<c00165d0>] (unwind_backtrace+0x0/0xec) from [<c0012b48>] (show_stack+0x20/0x24)
> [    0.249577] [<c0012b48>] (show_stack+0x20/0x24) from [<c04ebf0c>] (dump_stack+0x74/0xb4)
> [    0.249591] [<c04ebf0c>] (dump_stack+0x74/0xb4) from [<c00237a8>] (warn_slowpath_common+0x78/0x9c)
> [    0.249604] [<c00237a8>] (warn_slowpath_common+0x78/0x9c) from [<c0023888>] (warn_slowpath_fmt+0x40/0x48)
> [    0.249615] [<c0023888>] (warn_slowpath_fmt+0x40/0x48) from [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c)
> [    0.249626] [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c) from [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x2
> 24)
> [    0.249638] [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x224) from [<c006bc4c>] (request_threaded_irq+0x90/0x130)
> [    0.249651] [<c006bc4c>] (request_threaded_irq+0x90/0x130) from [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140)
> [    0.249663] [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140) from [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0)
> [    0.249675] [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0) from [<c04f4e18>] (notifier_call_chain+0x48/0x78)
> [    0.249688] [<c04f4e18>] (notifier_call_chain+0x48/0x78) from [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c)
> [    0.249700] [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c) from [<c0023908>] (__cpu_notify+0x3c/0x58)
> [    0.249713] [<c0023908>] (__cpu_notify+0x3c/0x58) from [<c0023944>] (cpu_notify+0x20/0x24)
> [    0.249725] [<c0023944>] (cpu_notify+0x20/0x24) from [<c002407c>] (notify_cpu_starting+0x58/0x60)
> [    0.249737] [<c002407c>] (notify_cpu_starting+0x58/0x60) from [<c00143cc>] (secondary_start_kernel+0xec/0x13
> 8)
> [    0.249748] [<c00143cc>] (secondary_start_kernel+0xec/0x138) from [<40008664>] (0x40008664)
> [    0.249767] ---[ end trace 3406ff24bd97382e ]---
> 
> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Kukjin Kim <kgene.kim@samsung.com>
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-samsung-soc@vger.kernel.org
> Signed-off-by: Ming Lei <tom.leiming@gmail.com>
> ---

Tomasz, what do you think ?

>  drivers/clocksource/exynos_mct.c |   34 +++++++++++++++++++++-------------
>  1 file changed, 21 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index 5b34768..94b35aa 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -419,19 +419,10 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)
>  
>  	exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
>  
> -	if (mct_int_type == MCT_INT_SPI) {
> -		evt->irq = mct_irqs[MCT_L0_IRQ + cpu];
> -		if (request_irq(evt->irq, exynos4_mct_tick_isr,
> -				IRQF_TIMER | IRQF_NOBALANCING,
> -				evt->name, mevt)) {
> -			pr_err("exynos-mct: cannot register IRQ %d\n",
> -				evt->irq);
> -			return -EIO;
> -		}
> -		irq_set_affinity(evt->irq, cpumask_of(cpu));
> -	} else {
> +	if (mct_int_type == MCT_INT_PPI)
>  		enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
> -	}
> +	else
> +		enable_irq(evt->irq);
>  
>  	return 0;
>  }
> @@ -440,7 +431,7 @@ static void exynos4_local_timer_stop(struct clock_event_device *evt)
>  {
>  	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
>  	if (mct_int_type == MCT_INT_SPI)
> -		free_irq(evt->irq, this_cpu_ptr(&percpu_mct_tick));
> +		disable_irq(evt->irq);
>  	else
>  		disable_percpu_irq(mct_irqs[MCT_L0_IRQ]);
>  }
> @@ -500,6 +491,23 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem
>  					 &percpu_mct_tick);
>  		WARN(err, "MCT: can't request IRQ %d (%d)\n",
>  		     mct_irqs[MCT_L0_IRQ], err);
> +	} else {
> +		int cpu;
> +
> +		for_each_possible_cpu(cpu) {
> +			struct mct_clock_event_device *mevt =
> +				&per_cpu(percpu_mct_tick, cpu);
> +
> +			mevt->evt.irq = mct_irqs[MCT_L0_IRQ + cpu];
> +			if (request_irq(mevt->evt.irq, exynos4_mct_tick_isr,
> +					IRQF_TIMER | IRQF_NOBALANCING,
> +					mevt->evt.name, mevt)) {
> +				WARN(1, "exynos-mct: cannot register IRQ %d\n",
> +				     mevt->evt.irq);
> +			}
> +			irq_set_affinity(mevt->evt.irq, cpumask_of(cpu));
> +			disable_irq(mevt->evt.irq);
> +		}
>  	}
>  
>  	err = register_cpu_notifier(&exynos4_mct_cpu_nb);
>
Tomasz Figa Sept. 26, 2013, 10:32 a.m. UTC | #2
Hi Daniel,

On Thursday 26 of September 2013 02:39:25 Daniel Lezcano wrote:
> On 09/25/2013 04:49 PM, Ming Lei wrote:
> > This patch moves request_irq() out of cpu notifier callback
> > to fix below lockdep warning:
> > 
> > [    0.249513] ------------[ cut here ]------------
> > [    0.249525] WARNING: CPU: 1 PID: 0 at kernel/lockdep.c:2740 lockdep_trace_alloc+0xc8/0x10c()
> > [    0.249534] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
> > [    0.249538] Modules linked in:
> > [    0.249548] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.12.0-rc1-next-20130923+ #338
> > [    0.249564] [<c00165d0>] (unwind_backtrace+0x0/0xec) from [<c0012b48>] (show_stack+0x20/0x24)
> > [    0.249577] [<c0012b48>] (show_stack+0x20/0x24) from [<c04ebf0c>] (dump_stack+0x74/0xb4)
> > [    0.249591] [<c04ebf0c>] (dump_stack+0x74/0xb4) from [<c00237a8>] (warn_slowpath_common+0x78/0x9c)
> > [    0.249604] [<c00237a8>] (warn_slowpath_common+0x78/0x9c) from [<c0023888>] (warn_slowpath_fmt+0x40/0x48)
> > [    0.249615] [<c0023888>] (warn_slowpath_fmt+0x40/0x48) from [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c)
> > [    0.249626] [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c) from [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x2
> > 24)
> > [    0.249638] [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x224) from [<c006bc4c>] (request_threaded_irq+0x90/0x130)
> > [    0.249651] [<c006bc4c>] (request_threaded_irq+0x90/0x130) from [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140)
> > [    0.249663] [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140) from [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0)
> > [    0.249675] [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0) from [<c04f4e18>] (notifier_call_chain+0x48/0x78)
> > [    0.249688] [<c04f4e18>] (notifier_call_chain+0x48/0x78) from [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c)
> > [    0.249700] [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c) from [<c0023908>] (__cpu_notify+0x3c/0x58)
> > [    0.249713] [<c0023908>] (__cpu_notify+0x3c/0x58) from [<c0023944>] (cpu_notify+0x20/0x24)
> > [    0.249725] [<c0023944>] (cpu_notify+0x20/0x24) from [<c002407c>] (notify_cpu_starting+0x58/0x60)
> > [    0.249737] [<c002407c>] (notify_cpu_starting+0x58/0x60) from [<c00143cc>] (secondary_start_kernel+0xec/0x13
> > 8)
> > [    0.249748] [<c00143cc>] (secondary_start_kernel+0xec/0x138) from [<40008664>] (0x40008664)
> > [    0.249767] ---[ end trace 3406ff24bd97382e ]---
> > 
> > Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > Cc: Kukjin Kim <kgene.kim@samsung.com>
> > Cc: linux-arm-kernel@lists.infradead.org
> > Cc: linux-samsung-soc@vger.kernel.org
> > Signed-off-by: Ming Lei <tom.leiming@gmail.com>
> > ---
> 
> Tomasz, what do you think ?

This is a fix that we may want to have, but it must be modified to take
my regression fix[1] into account.

[1] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
http://thread.gmane.org/gmane.linux.kernel.samsung-soc/22511/focus=23418

Best regards,
Tomasz
Daniel Lezcano Sept. 26, 2013, 10:54 a.m. UTC | #3
On 09/26/2013 12:32 PM, Tomasz Figa wrote:
> Hi Daniel,
>
> On Thursday 26 of September 2013 02:39:25 Daniel Lezcano wrote:
>> On 09/25/2013 04:49 PM, Ming Lei wrote:
>>> This patch moves request_irq() out of cpu notifier callback
>>> to fix below lockdep warning:
>>>
>>> [    0.249513] ------------[ cut here ]------------
>>> [    0.249525] WARNING: CPU: 1 PID: 0 at kernel/lockdep.c:2740 lockdep_trace_alloc+0xc8/0x10c()
>>> [    0.249534] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
>>> [    0.249538] Modules linked in:
>>> [    0.249548] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.12.0-rc1-next-20130923+ #338
>>> [    0.249564] [<c00165d0>] (unwind_backtrace+0x0/0xec) from [<c0012b48>] (show_stack+0x20/0x24)
>>> [    0.249577] [<c0012b48>] (show_stack+0x20/0x24) from [<c04ebf0c>] (dump_stack+0x74/0xb4)
>>> [    0.249591] [<c04ebf0c>] (dump_stack+0x74/0xb4) from [<c00237a8>] (warn_slowpath_common+0x78/0x9c)
>>> [    0.249604] [<c00237a8>] (warn_slowpath_common+0x78/0x9c) from [<c0023888>] (warn_slowpath_fmt+0x40/0x48)
>>> [    0.249615] [<c0023888>] (warn_slowpath_fmt+0x40/0x48) from [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c)
>>> [    0.249626] [<c007f194>] (lockdep_trace_alloc+0xc8/0x10c) from [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x2
>>> 24)
>>> [    0.249638] [<c01173b0>] (kmem_cache_alloc_trace+0x38/0x224) from [<c006bc4c>] (request_threaded_irq+0x90/0x130)
>>> [    0.249651] [<c006bc4c>] (request_threaded_irq+0x90/0x130) from [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140)
>>> [    0.249663] [<c0408c60>] (exynos4_local_timer_setup+0xdc/0x140) from [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0)
>>> [    0.249675] [<c0408d78>] (exynos4_mct_cpu_notify+0x40/0xb0) from [<c04f4e18>] (notifier_call_chain+0x48/0x78)
>>> [    0.249688] [<c04f4e18>] (notifier_call_chain+0x48/0x78) from [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c)
>>> [    0.249700] [<c004abb0>] (__raw_notifier_call_chain+0x24/0x2c) from [<c0023908>] (__cpu_notify+0x3c/0x58)
>>> [    0.249713] [<c0023908>] (__cpu_notify+0x3c/0x58) from [<c0023944>] (cpu_notify+0x20/0x24)
>>> [    0.249725] [<c0023944>] (cpu_notify+0x20/0x24) from [<c002407c>] (notify_cpu_starting+0x58/0x60)
>>> [    0.249737] [<c002407c>] (notify_cpu_starting+0x58/0x60) from [<c00143cc>] (secondary_start_kernel+0xec/0x13
>>> 8)
>>> [    0.249748] [<c00143cc>] (secondary_start_kernel+0xec/0x138) from [<40008664>] (0x40008664)
>>> [    0.249767] ---[ end trace 3406ff24bd97382e ]---
>>>
>>> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
>>> Cc: Thomas Gleixner <tglx@linutronix.de>
>>> Cc: Kukjin Kim <kgene.kim@samsung.com>
>>> Cc: linux-arm-kernel@lists.infradead.org
>>> Cc: linux-samsung-soc@vger.kernel.org
>>> Signed-off-by: Ming Lei <tom.leiming@gmail.com>
>>> ---
>>
>> Tomasz, what do you think ?
>
> This is a fix that we may want to have, but it must be modified to take
> my regression fix[1] into account.
>
> [1] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
> http://thread.gmane.org/gmane.linux.kernel.samsung-soc/22511/focus=23418

Ok, as the clockevents fixes PR for 3.12-rc2 has already been sent, this 
patch will go to next round of fixes.
Ming Lei Sept. 27, 2013, 1:09 p.m. UTC | #4
On Thu, Sep 26, 2013 at 6:32 PM, Tomasz Figa <t.figa@samsung.com> wrote:
>
> This is a fix that we may want to have, but it must be modified to take
> my regression fix[1] into account.
>
> [1] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
> http://thread.gmane.org/gmane.linux.kernel.samsung-soc/22511/focus=23418

OK, I will write and submit v1 against your patch.

Thanks,
Daniel Lezcano Sept. 27, 2013, 1:17 p.m. UTC | #5
On 09/27/2013 03:09 PM, Ming Lei wrote:
> On Thu, Sep 26, 2013 at 6:32 PM, Tomasz Figa <t.figa@samsung.com> wrote:
>>
>> This is a fix that we may want to have, but it must be modified to take
>> my regression fix[1] into account.
>>
>> [1] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
>> http://thread.gmane.org/gmane.linux.kernel.samsung-soc/22511/focus=23418
>
> OK, I will write and submit v1 against your patch.

Better you stick to

https://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/

or you rebase it against the v3.12-rc3 when it goes out.

Thanks
   -- Daniel
diff mbox

Patch

diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 5b34768..94b35aa 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -419,19 +419,10 @@  static int exynos4_local_timer_setup(struct clock_event_device *evt)
 
 	exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
 
-	if (mct_int_type == MCT_INT_SPI) {
-		evt->irq = mct_irqs[MCT_L0_IRQ + cpu];
-		if (request_irq(evt->irq, exynos4_mct_tick_isr,
-				IRQF_TIMER | IRQF_NOBALANCING,
-				evt->name, mevt)) {
-			pr_err("exynos-mct: cannot register IRQ %d\n",
-				evt->irq);
-			return -EIO;
-		}
-		irq_set_affinity(evt->irq, cpumask_of(cpu));
-	} else {
+	if (mct_int_type == MCT_INT_PPI)
 		enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
-	}
+	else
+		enable_irq(evt->irq);
 
 	return 0;
 }
@@ -440,7 +431,7 @@  static void exynos4_local_timer_stop(struct clock_event_device *evt)
 {
 	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
 	if (mct_int_type == MCT_INT_SPI)
-		free_irq(evt->irq, this_cpu_ptr(&percpu_mct_tick));
+		disable_irq(evt->irq);
 	else
 		disable_percpu_irq(mct_irqs[MCT_L0_IRQ]);
 }
@@ -500,6 +491,23 @@  static void __init exynos4_timer_resources(struct device_node *np, void __iomem
 					 &percpu_mct_tick);
 		WARN(err, "MCT: can't request IRQ %d (%d)\n",
 		     mct_irqs[MCT_L0_IRQ], err);
+	} else {
+		int cpu;
+
+		for_each_possible_cpu(cpu) {
+			struct mct_clock_event_device *mevt =
+				&per_cpu(percpu_mct_tick, cpu);
+
+			mevt->evt.irq = mct_irqs[MCT_L0_IRQ + cpu];
+			if (request_irq(mevt->evt.irq, exynos4_mct_tick_isr,
+					IRQF_TIMER | IRQF_NOBALANCING,
+					mevt->evt.name, mevt)) {
+				WARN(1, "exynos-mct: cannot register IRQ %d\n",
+				     mevt->evt.irq);
+			}
+			irq_set_affinity(mevt->evt.irq, cpumask_of(cpu));
+			disable_irq(mevt->evt.irq);
+		}
 	}
 
 	err = register_cpu_notifier(&exynos4_mct_cpu_nb);