All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
@ 2014-02-13  3:08 ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-13  3:08 UTC (permalink / raw)
  To: linux-kernel
  Cc: Russell King, Kukjin Kim, Daniel Lezcano, Sachin Kamat,
	Thomas Gleixner, Tarek Dakhran, Vyacheslav Tyrtov, Tomasz Figa,
	linux-arm-kernel, linux-samsung-soc, Tarek Dakhran

exynos4_local_timer_setup called on the secondary cpu before
irqs are enabled. request_irq can sleep, which produces next warning:

on boot:
[    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
[    0.395000] CPU1: Booted secondary processor
[    0.395000] ------------[ cut here ]------------
[    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742 lockdep_trace_alloc+0xe0/0xfc()
[    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
[    0.395000] Modules linked in:
[    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.14.0-rc2-00004-g0db95f4 #128
[    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
[    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
[    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>] (warn_slowpath_common+0x68/0x8c)
[    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>] (warn_slowpath_fmt+0x30/0x40)
[    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>] (lockdep_trace_alloc+0xe0/0xfc)
[    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>] (kmem_cache_alloc+0x24/0x160)
[    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
[    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
[    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
[    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
[    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
[    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
[    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)
[    0.395000] ---[ end trace 347890460e745f50 ]---
[    0.420000] CPU1: update cpu_power 1024
[    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001

on hotplug:
[  108.040000] CPU3: Booted secondary processor
[  108.040000] BUG: sleeping function called from invalid context at mm/slub.c:965
[  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3
[  108.040000] INFO: lockdep is turned off.
[  108.040000] irq event stamp: 0
[  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
[  108.040000] hardirqs last disabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
[  108.040000] softirqs last  enabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
[  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
[  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W    3.14.0-rc2-00004-g0db95f4 #128
[  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
[  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
[  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>] (kmem_cache_alloc+0xd4/0x160)
[  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
[  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
[  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
[  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
[  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
[  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
[  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)

First patch fixes this problem by removing request_irq from exynos4_local_timer_setup
Second removes non-dt stuff.

Tested on linux kernel v3.14-rc2.
Comments and additions would be appreciated.
Thank you.
	Tarek.

Tarek Dakhran (2):
  clocksource: mct: remove request_irq from exynos4_local_timer_setup
  clocksource: mct: cleanup, remove non-dt stuff from mct

 arch/arm/mach-exynos/common.h    |    2 --
 drivers/clocksource/exynos_mct.c |   55 +++++++++++++++++++++-----------------
 2 files changed, 31 insertions(+), 26 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
@ 2014-02-13  3:08 ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-13  3:08 UTC (permalink / raw)
  To: linux-arm-kernel

exynos4_local_timer_setup called on the secondary cpu before
irqs are enabled. request_irq can sleep, which produces next warning:

on boot:
[    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
[    0.395000] CPU1: Booted secondary processor
[    0.395000] ------------[ cut here ]------------
[    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742 lockdep_trace_alloc+0xe0/0xfc()
[    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
[    0.395000] Modules linked in:
[    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.14.0-rc2-00004-g0db95f4 #128
[    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
[    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
[    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>] (warn_slowpath_common+0x68/0x8c)
[    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>] (warn_slowpath_fmt+0x30/0x40)
[    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>] (lockdep_trace_alloc+0xe0/0xfc)
[    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>] (kmem_cache_alloc+0x24/0x160)
[    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
[    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
[    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
[    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
[    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
[    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
[    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)
[    0.395000] ---[ end trace 347890460e745f50 ]---
[    0.420000] CPU1: update cpu_power 1024
[    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001

on hotplug:
[  108.040000] CPU3: Booted secondary processor
[  108.040000] BUG: sleeping function called from invalid context at mm/slub.c:965
[  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3
[  108.040000] INFO: lockdep is turned off.
[  108.040000] irq event stamp: 0
[  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
[  108.040000] hardirqs last disabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
[  108.040000] softirqs last  enabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
[  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
[  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W    3.14.0-rc2-00004-g0db95f4 #128
[  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
[  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
[  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>] (kmem_cache_alloc+0xd4/0x160)
[  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
[  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
[  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
[  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
[  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
[  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
[  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)

First patch fixes this problem by removing request_irq from exynos4_local_timer_setup
Second removes non-dt stuff.

Tested on linux kernel v3.14-rc2.
Comments and additions would be appreciated.
Thank you.
	Tarek.

Tarek Dakhran (2):
  clocksource: mct: remove request_irq from exynos4_local_timer_setup
  clocksource: mct: cleanup, remove non-dt stuff from mct

 arch/arm/mach-exynos/common.h    |    2 --
 drivers/clocksource/exynos_mct.c |   55 +++++++++++++++++++++-----------------
 2 files changed, 31 insertions(+), 26 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 1/2] clocksource: mct: remove request_irq from exynos4_local_timer_setup
  2014-02-13  3:08 ` Tarek Dakhran
@ 2014-02-13  3:08   ` Tarek Dakhran
  -1 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-13  3:08 UTC (permalink / raw)
  To: linux-kernel
  Cc: Russell King, Kukjin Kim, Daniel Lezcano, Sachin Kamat,
	Thomas Gleixner, Tarek Dakhran, Vyacheslav Tyrtov, Tomasz Figa,
	linux-arm-kernel, linux-samsung-soc, Tarek Dakhran

exynos4_local_timer_setup called on the secondary cpu before
irqs are enabled. request_irq can sleep, which produces next warning:

	BUG: sleeping function called from invalid context at mm/slub.c:965
	in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3

Call setup_irq for each local timer in exynos4_timer_resources,
and only call enable_irq during percpu timer setup.

Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
---
 drivers/clocksource/exynos_mct.c |   38 ++++++++++++++++++++++++++++++--------
 1 file changed, 30 insertions(+), 8 deletions(-)

diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 48f76bc..1cde3de 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -82,6 +82,7 @@ static void __iomem *reg_base;
 static unsigned long clk_rate;
 static unsigned int mct_int_type;
 static int mct_irqs[MCT_NR_IRQS];
+static struct irqaction __percpu *mct_LX_irqaction;
 
 struct mct_clock_event_device {
 	struct clock_event_device evt;
@@ -402,6 +403,25 @@ static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+static void exynos4_setup_irqaction_spi(unsigned int cpu)
+{
+	struct irqaction *pcpu_irqaction = per_cpu_ptr(mct_LX_irqaction, cpu);
+	unsigned int irq = mct_irqs[MCT_L0_IRQ + cpu];
+	int err;
+
+	pcpu_irqaction->name = per_cpu(percpu_mct_tick, cpu).name;
+	pcpu_irqaction->flags  = IRQF_TIMER | IRQF_NOBALANCING;
+	pcpu_irqaction->handler = exynos4_mct_tick_isr;
+	pcpu_irqaction->dev_id = &per_cpu(percpu_mct_tick, cpu);
+
+	err = setup_irq(irq, pcpu_irqaction);
+	if (err) {
+		pr_err("MCT: can't setup IRQ %d (%d)\n", irq, err);
+		return;
+	}
+	disable_irq(irq);
+}
+
 static int exynos4_local_timer_setup(struct clock_event_device *evt)
 {
 	struct mct_clock_event_device *mevt;
@@ -425,13 +445,7 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)
 
 	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;
-		}
+		enable_irq(evt->irq);
 	} else {
 		enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
 	}
@@ -443,7 +457,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]);
 }
@@ -485,9 +499,12 @@ static struct notifier_block exynos4_mct_cpu_nb = {
 static void __init exynos4_timer_resources(struct device_node *np, void __iomem *base)
 {
 	int err;
+	u32 i, cpu, nr_irqs;
 	struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
 	struct clk *mct_clk, *tick_clk;
 
+	nr_irqs = of_irq_count(np);
+
 	tick_clk = np ? of_clk_get_by_name(np, "fin_pll") :
 				clk_get(NULL, "fin_pll");
 	if (IS_ERR(tick_clk))
@@ -511,6 +528,11 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem
 		WARN(err, "MCT: can't request IRQ %d (%d)\n",
 		     mct_irqs[MCT_L0_IRQ], err);
 	} else {
+		mct_LX_irqaction = alloc_percpu(struct irqaction);
+		BUG_ON(!mct_LX_irqaction);
+
+		for (i = MCT_L0_IRQ, cpu = 0; i < nr_irqs; i++, cpu++)
+			exynos4_setup_irqaction_spi(cpu);
 		irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
 	}
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 1/2] clocksource: mct: remove request_irq from exynos4_local_timer_setup
@ 2014-02-13  3:08   ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-13  3:08 UTC (permalink / raw)
  To: linux-arm-kernel

exynos4_local_timer_setup called on the secondary cpu before
irqs are enabled. request_irq can sleep, which produces next warning:

	BUG: sleeping function called from invalid context at mm/slub.c:965
	in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3

Call setup_irq for each local timer in exynos4_timer_resources,
and only call enable_irq during percpu timer setup.

Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
---
 drivers/clocksource/exynos_mct.c |   38 ++++++++++++++++++++++++++++++--------
 1 file changed, 30 insertions(+), 8 deletions(-)

diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 48f76bc..1cde3de 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -82,6 +82,7 @@ static void __iomem *reg_base;
 static unsigned long clk_rate;
 static unsigned int mct_int_type;
 static int mct_irqs[MCT_NR_IRQS];
+static struct irqaction __percpu *mct_LX_irqaction;
 
 struct mct_clock_event_device {
 	struct clock_event_device evt;
@@ -402,6 +403,25 @@ static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+static void exynos4_setup_irqaction_spi(unsigned int cpu)
+{
+	struct irqaction *pcpu_irqaction = per_cpu_ptr(mct_LX_irqaction, cpu);
+	unsigned int irq = mct_irqs[MCT_L0_IRQ + cpu];
+	int err;
+
+	pcpu_irqaction->name = per_cpu(percpu_mct_tick, cpu).name;
+	pcpu_irqaction->flags  = IRQF_TIMER | IRQF_NOBALANCING;
+	pcpu_irqaction->handler = exynos4_mct_tick_isr;
+	pcpu_irqaction->dev_id = &per_cpu(percpu_mct_tick, cpu);
+
+	err = setup_irq(irq, pcpu_irqaction);
+	if (err) {
+		pr_err("MCT: can't setup IRQ %d (%d)\n", irq, err);
+		return;
+	}
+	disable_irq(irq);
+}
+
 static int exynos4_local_timer_setup(struct clock_event_device *evt)
 {
 	struct mct_clock_event_device *mevt;
@@ -425,13 +445,7 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)
 
 	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;
-		}
+		enable_irq(evt->irq);
 	} else {
 		enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
 	}
@@ -443,7 +457,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]);
 }
@@ -485,9 +499,12 @@ static struct notifier_block exynos4_mct_cpu_nb = {
 static void __init exynos4_timer_resources(struct device_node *np, void __iomem *base)
 {
 	int err;
+	u32 i, cpu, nr_irqs;
 	struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
 	struct clk *mct_clk, *tick_clk;
 
+	nr_irqs = of_irq_count(np);
+
 	tick_clk = np ? of_clk_get_by_name(np, "fin_pll") :
 				clk_get(NULL, "fin_pll");
 	if (IS_ERR(tick_clk))
@@ -511,6 +528,11 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem
 		WARN(err, "MCT: can't request IRQ %d (%d)\n",
 		     mct_irqs[MCT_L0_IRQ], err);
 	} else {
+		mct_LX_irqaction = alloc_percpu(struct irqaction);
+		BUG_ON(!mct_LX_irqaction);
+
+		for (i = MCT_L0_IRQ, cpu = 0; i < nr_irqs; i++, cpu++)
+			exynos4_setup_irqaction_spi(cpu);
 		irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
 	}
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 2/2] clocksource: mct: cleanup, remove non-dt stuff from mct
  2014-02-13  3:08 ` Tarek Dakhran
@ 2014-02-13  3:08   ` Tarek Dakhran
  -1 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-13  3:08 UTC (permalink / raw)
  To: linux-kernel
  Cc: Russell King, Kukjin Kim, Daniel Lezcano, Sachin Kamat,
	Thomas Gleixner, Tarek Dakhran, Vyacheslav Tyrtov, Tomasz Figa,
	linux-arm-kernel, linux-samsung-soc, Tarek Dakhran

mct_init not used anywhere, remove this non-dt stuff.
also remove declaration of mct_init
in arch/arm/mach-exynos/common.h

Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
---
 arch/arm/mach-exynos/common.h    |    2 --
 drivers/clocksource/exynos_mct.c |   17 +----------------
 2 files changed, 1 insertion(+), 18 deletions(-)

diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index f76967b..8945170 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -15,8 +15,6 @@
 #include <linux/reboot.h>
 #include <linux/of.h>
 
-void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
-
 struct map_desc;
 void exynos_init_io(void);
 void exynos4_restart(enum reboot_mode mode, const char *cmd);
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 1cde3de..a94a908 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -548,18 +548,6 @@ out_irq:
 	free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick);
 }
 
-void __init mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1)
-{
-	mct_irqs[MCT_G0_IRQ] = irq_g0;
-	mct_irqs[MCT_L0_IRQ] = irq_l0;
-	mct_irqs[MCT_L1_IRQ] = irq_l1;
-	mct_int_type = MCT_INT_SPI;
-
-	exynos4_timer_resources(NULL, base);
-	exynos4_clocksource_init();
-	exynos4_clockevent_init();
-}
-
 static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
 {
 	u32 nr_irqs, i;
@@ -574,11 +562,8 @@ static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
 	 * timer irqs are specified after the four global timer
 	 * irqs are specified.
 	 */
-#ifdef CONFIG_OF
 	nr_irqs = of_irq_count(np);
-#else
-	nr_irqs = 0;
-#endif
+
 	for (i = MCT_L0_IRQ; i < nr_irqs; i++)
 		mct_irqs[i] = irq_of_parse_and_map(np, i);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v1 2/2] clocksource: mct: cleanup, remove non-dt stuff from mct
@ 2014-02-13  3:08   ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-13  3:08 UTC (permalink / raw)
  To: linux-arm-kernel

mct_init not used anywhere, remove this non-dt stuff.
also remove declaration of mct_init
in arch/arm/mach-exynos/common.h

Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
---
 arch/arm/mach-exynos/common.h    |    2 --
 drivers/clocksource/exynos_mct.c |   17 +----------------
 2 files changed, 1 insertion(+), 18 deletions(-)

diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index f76967b..8945170 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -15,8 +15,6 @@
 #include <linux/reboot.h>
 #include <linux/of.h>
 
-void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
-
 struct map_desc;
 void exynos_init_io(void);
 void exynos4_restart(enum reboot_mode mode, const char *cmd);
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 1cde3de..a94a908 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -548,18 +548,6 @@ out_irq:
 	free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick);
 }
 
-void __init mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1)
-{
-	mct_irqs[MCT_G0_IRQ] = irq_g0;
-	mct_irqs[MCT_L0_IRQ] = irq_l0;
-	mct_irqs[MCT_L1_IRQ] = irq_l1;
-	mct_int_type = MCT_INT_SPI;
-
-	exynos4_timer_resources(NULL, base);
-	exynos4_clocksource_init();
-	exynos4_clockevent_init();
-}
-
 static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
 {
 	u32 nr_irqs, i;
@@ -574,11 +562,8 @@ static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
 	 * timer irqs are specified after the four global timer
 	 * irqs are specified.
 	 */
-#ifdef CONFIG_OF
 	nr_irqs = of_irq_count(np);
-#else
-	nr_irqs = 0;
-#endif
+
 	for (i = MCT_L0_IRQ; i < nr_irqs; i++)
 		mct_irqs[i] = irq_of_parse_and_map(np, i);
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
  2014-02-13  3:08 ` Tarek Dakhran
@ 2014-02-13 12:36   ` Tomasz Figa
  -1 siblings, 0 replies; 13+ messages in thread
From: Tomasz Figa @ 2014-02-13 12:36 UTC (permalink / raw)
  To: Tarek Dakhran, linux-kernel
  Cc: Russell King, Kukjin Kim, Daniel Lezcano, Sachin Kamat,
	Thomas Gleixner, Tarek Dakhran, Vyacheslav Tyrtov,
	linux-arm-kernel, linux-samsung-soc

Hi Tarek,

On 13.02.2014 04:08, Tarek Dakhran wrote:
> exynos4_local_timer_setup called on the secondary cpu before
> irqs are enabled. request_irq can sleep, which produces next warning:
>
> on boot:
> [    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
> [    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
> [    0.395000] CPU1: Booted secondary processor
> [    0.395000] ------------[ cut here ]------------
> [    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742 lockdep_trace_alloc+0xe0/0xfc()
> [    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
> [    0.395000] Modules linked in:
> [    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.14.0-rc2-00004-g0db95f4 #128
> [    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
> [    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
> [    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>] (warn_slowpath_common+0x68/0x8c)
> [    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>] (warn_slowpath_fmt+0x30/0x40)
> [    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>] (lockdep_trace_alloc+0xe0/0xfc)
> [    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>] (kmem_cache_alloc+0x24/0x160)
> [    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
> [    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
> [    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
> [    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
> [    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
> [    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
> [    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)
> [    0.395000] ---[ end trace 347890460e745f50 ]---
> [    0.420000] CPU1: update cpu_power 1024
> [    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
>
> on hotplug:
> [  108.040000] CPU3: Booted secondary processor
> [  108.040000] BUG: sleeping function called from invalid context at mm/slub.c:965
> [  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3
> [  108.040000] INFO: lockdep is turned off.
> [  108.040000] irq event stamp: 0
> [  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
> [  108.040000] hardirqs last disabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
> [  108.040000] softirqs last  enabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
> [  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
> [  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W    3.14.0-rc2-00004-g0db95f4 #128
> [  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
> [  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
> [  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>] (kmem_cache_alloc+0xd4/0x160)
> [  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
> [  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
> [  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
> [  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
> [  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
> [  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
> [  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)
>
> First patch fixes this problem by removing request_irq from exynos4_local_timer_setup
> Second removes non-dt stuff.
>
> Tested on linux kernel v3.14-rc2.

It would be nice to say on which boards it has been tested. Let me check 
this on our boards anyway.

Best regards,
Tomasz

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
@ 2014-02-13 12:36   ` Tomasz Figa
  0 siblings, 0 replies; 13+ messages in thread
From: Tomasz Figa @ 2014-02-13 12:36 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Tarek,

On 13.02.2014 04:08, Tarek Dakhran wrote:
> exynos4_local_timer_setup called on the secondary cpu before
> irqs are enabled. request_irq can sleep, which produces next warning:
>
> on boot:
> [    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
> [    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
> [    0.395000] CPU1: Booted secondary processor
> [    0.395000] ------------[ cut here ]------------
> [    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742 lockdep_trace_alloc+0xe0/0xfc()
> [    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
> [    0.395000] Modules linked in:
> [    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.14.0-rc2-00004-g0db95f4 #128
> [    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
> [    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
> [    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>] (warn_slowpath_common+0x68/0x8c)
> [    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>] (warn_slowpath_fmt+0x30/0x40)
> [    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>] (lockdep_trace_alloc+0xe0/0xfc)
> [    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>] (kmem_cache_alloc+0x24/0x160)
> [    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
> [    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
> [    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
> [    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
> [    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
> [    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
> [    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)
> [    0.395000] ---[ end trace 347890460e745f50 ]---
> [    0.420000] CPU1: update cpu_power 1024
> [    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
>
> on hotplug:
> [  108.040000] CPU3: Booted secondary processor
> [  108.040000] BUG: sleeping function called from invalid context at mm/slub.c:965
> [  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3
> [  108.040000] INFO: lockdep is turned off.
> [  108.040000] irq event stamp: 0
> [  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
> [  108.040000] hardirqs last disabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
> [  108.040000] softirqs last  enabled at (0): [<c001b768>] copy_process.part.2+0x2a4/0x12f4
> [  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
> [  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W    3.14.0-rc2-00004-g0db95f4 #128
> [  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>] (show_stack+0x10/0x14)
> [  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>] (dump_stack+0x6c/0xb8)
> [  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>] (kmem_cache_alloc+0xd4/0x160)
> [  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>] (request_threaded_irq+0x64/0x130)
> [  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>] (exynos4_local_timer_setup+0xd0/0x124)
> [  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>] (exynos4_mct_cpu_notify+0x78/0xf0)
> [  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>] (notifier_call_chain+0x44/0x84)
> [  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>] (__cpu_notify+0x24/0x40)
> [  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>] (secondary_start_kernel+0xe4/0x134)
> [  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>] (0x40008624)
>
> First patch fixes this problem by removing request_irq from exynos4_local_timer_setup
> Second removes non-dt stuff.
>
> Tested on linux kernel v3.14-rc2.

It would be nice to say on which boards it has been tested. Let me check 
this on our boards anyway.

Best regards,
Tomasz

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
       [not found]   ` <CANhyOUcBrsnfSa3sCGbFqUB0g6zfG9moqbGapJGU3zbxWQVgiA@mail.gmail.com>
  2014-02-15  4:12       ` Tarek Dakhran
@ 2014-02-15  4:12       ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-15  4:12 UTC (permalink / raw)
  To: Tomasz Figa
  Cc: Tarek Dakhran, linux-kernel, Russell King, Kukjin Kim,
	Daniel Lezcano, Sachin Kamat, Thomas Gleixner, Vyacheslav Tyrtov,
	linux-arm-kernel, linux-samsung-soc, Tarek Dakhran

On Thu, Feb 13, 2014 at 10:31 PM, Tarek Dakhran <t.dakhran@gmail.com> wrote:
> Hi Tomasz,
>
> On Thursday, February 13, 2014, Tomasz Figa <t.figa@samsung.com> wrote:
>>
>> Hi Tarek,
>>
>> On 13.02.2014 04:08, Tarek Dakhran wrote:
>>>
>>> exynos4_local_timer_setup called on the secondary cpu before
>>> irqs are enabled. request_irq can sleep, which produces next warning:
>>>
>>> on boot:
>>> [    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
>>> [    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
>>> [    0.395000] CPU1: Booted secondary processor
>>> [    0.395000] ------------[ cut here ]------------
>>> [    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742
>>> lockdep_trace_alloc+0xe0/0xfc()
>>> [    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
>>> [    0.395000] Modules linked in:
>>> [    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted
>>> 3.14.0-rc2-00004-g0db95f4 #128
>>> [    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>]
>>> (show_stack+0x10/0x14)
>>> [    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>]
>>> (dump_stack+0x6c/0xb8)
>>> [    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>]
>>> (warn_slowpath_common+0x68/0x8c)
>>> [    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>]
>>> (warn_slowpath_fmt+0x30/0x40)
>>> [    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>]
>>> (lockdep_trace_alloc+0xe0/0xfc)
>>> [    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>]
>>> (kmem_cache_alloc+0x24/0x160)
>>> [    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>]
>>> (request_threaded_irq+0x64/0x130)
>>> [    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>]
>>> (exynos4_local_timer_setup+0xd0/0x124)
>>> [    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>]
>>> (exynos4_mct_cpu_notify+0x78/0xf0)
>>> [    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>]
>>> (notifier_call_chain+0x44/0x84)
>>> [    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>]
>>> (__cpu_notify+0x24/0x40)
>>> [    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>]
>>> (secondary_start_kernel+0xe4/0x134)
>>> [    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>]
>>> (0x40008624)
>>> [    0.395000] ---[ end trace 347890460e745f50 ]---
>>> [    0.420000] CPU1: update cpu_power 1024
>>> [    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
>>>
>>> on hotplug:
>>> [  108.040000] CPU3: Booted secondary processor
>>> [  108.040000] BUG: sleeping function called from invalid context at
>>> mm/slub.c:965
>>> [  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name:
>>> swapper/3
>>> [  108.040000] INFO: lockdep is turned off.
>>> [  108.040000] irq event stamp: 0
>>> [  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
>>> [  108.040000] hardirqs last disabled at (0): [<c001b768>]
>>> copy_process.part.2+0x2a4/0x12f4
>>> [  108.040000] softirqs last  enabled at (0): [<c001b768>]
>>> copy_process.part.2+0x2a4/0x12f4
>>> [  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
>>> [  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W
>>> 3.14.0-rc2-00004-g0db95f4 #128
>>> [  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>]
>>> (show_stack+0x10/0x14)
>>> [  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>]
>>> (dump_stack+0x6c/0xb8)
>>> [  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>]
>>> (kmem_cache_alloc+0xd4/0x160)
>>> [  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>]
>>> (request_threaded_irq+0x64/0x130)
>>> [  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>]
>>> (exynos4_local_timer_setup+0xd0/0x124)
>>> [  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>]
>>> (exynos4_mct_cpu_notify+0x78/0xf0)
>>> [  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>]
>>> (notifier_call_chain+0x44/0x84)
>>> [  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>]
>>> (__cpu_notify+0x24/0x40)
>>> [  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>]
>>> (secondary_start_kernel+0xe4/0x134)
>>> [  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>]
>>> (0x40008624)
>>>
>>> First patch fixes this problem by removing request_irq from
>>> exynos4_local_timer_setup
>>> Second removes non-dt stuff.
>>>
>>> Tested on linux kernel v3.14-rc2.
>>
>>
>> It would be nice to say on which boards it has been tested. Let me check
>> this on our boards anyway.
>>
>> Best regards,
>> Tomasz
>
>
> Tested on smdk5410 reference board with lockdep enabled.
> I think the problem will present on all boards due to call sleeping function
> in irq_disabled context.
>
> Best Regards,
>     Tarek
>
Has anyone else tested this patches?
if yes, what is the result?


Best regards,
. Tarek

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
@ 2014-02-15  4:12       ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-15  4:12 UTC (permalink / raw)
  To: Tomasz Figa
  Cc: Tarek Dakhran, linux-kernel, Russell King, Kukjin Kim,
	Daniel Lezcano, Sachin Kamat, Thomas Gleixner, Vyacheslav Tyrtov,
	linux-arm-kernel, linux-samsung-soc, Tarek Dakhran

On Thu, Feb 13, 2014 at 10:31 PM, Tarek Dakhran <t.dakhran@gmail.com> wrote:
> Hi Tomasz,
>
> On Thursday, February 13, 2014, Tomasz Figa <t.figa@samsung.com> wrote:
>>
>> Hi Tarek,
>>
>> On 13.02.2014 04:08, Tarek Dakhran wrote:
>>>
>>> exynos4_local_timer_setup called on the secondary cpu before
>>> irqs are enabled. request_irq can sleep, which produces next warning:
>>>
>>> on boot:
>>> [    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
>>> [    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
>>> [    0.395000] CPU1: Booted secondary processor
>>> [    0.395000] ------------[ cut here ]------------
>>> [    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742
>>> lockdep_trace_alloc+0xe0/0xfc()
>>> [    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
>>> [    0.395000] Modules linked in:
>>> [    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted
>>> 3.14.0-rc2-00004-g0db95f4 #128
>>> [    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>]
>>> (show_stack+0x10/0x14)
>>> [    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>]
>>> (dump_stack+0x6c/0xb8)
>>> [    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>]
>>> (warn_slowpath_common+0x68/0x8c)
>>> [    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>]
>>> (warn_slowpath_fmt+0x30/0x40)
>>> [    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>]
>>> (lockdep_trace_alloc+0xe0/0xfc)
>>> [    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>]
>>> (kmem_cache_alloc+0x24/0x160)
>>> [    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>]
>>> (request_threaded_irq+0x64/0x130)
>>> [    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>]
>>> (exynos4_local_timer_setup+0xd0/0x124)
>>> [    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>]
>>> (exynos4_mct_cpu_notify+0x78/0xf0)
>>> [    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>]
>>> (notifier_call_chain+0x44/0x84)
>>> [    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>]
>>> (__cpu_notify+0x24/0x40)
>>> [    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>]
>>> (secondary_start_kernel+0xe4/0x134)
>>> [    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>]
>>> (0x40008624)
>>> [    0.395000] ---[ end trace 347890460e745f50 ]---
>>> [    0.420000] CPU1: update cpu_power 1024
>>> [    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
>>>
>>> on hotplug:
>>> [  108.040000] CPU3: Booted secondary processor
>>> [  108.040000] BUG: sleeping function called from invalid context at
>>> mm/slub.c:965
>>> [  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name:
>>> swapper/3
>>> [  108.040000] INFO: lockdep is turned off.
>>> [  108.040000] irq event stamp: 0
>>> [  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
>>> [  108.040000] hardirqs last disabled at (0): [<c001b768>]
>>> copy_process.part.2+0x2a4/0x12f4
>>> [  108.040000] softirqs last  enabled at (0): [<c001b768>]
>>> copy_process.part.2+0x2a4/0x12f4
>>> [  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
>>> [  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W
>>> 3.14.0-rc2-00004-g0db95f4 #128
>>> [  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>]
>>> (show_stack+0x10/0x14)
>>> [  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>]
>>> (dump_stack+0x6c/0xb8)
>>> [  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>]
>>> (kmem_cache_alloc+0xd4/0x160)
>>> [  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>]
>>> (request_threaded_irq+0x64/0x130)
>>> [  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>]
>>> (exynos4_local_timer_setup+0xd0/0x124)
>>> [  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>]
>>> (exynos4_mct_cpu_notify+0x78/0xf0)
>>> [  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>]
>>> (notifier_call_chain+0x44/0x84)
>>> [  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>]
>>> (__cpu_notify+0x24/0x40)
>>> [  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>]
>>> (secondary_start_kernel+0xe4/0x134)
>>> [  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>]
>>> (0x40008624)
>>>
>>> First patch fixes this problem by removing request_irq from
>>> exynos4_local_timer_setup
>>> Second removes non-dt stuff.
>>>
>>> Tested on linux kernel v3.14-rc2.
>>
>>
>> It would be nice to say on which boards it has been tested. Let me check
>> this on our boards anyway.
>>
>> Best regards,
>> Tomasz
>
>
> Tested on smdk5410 reference board with lockdep enabled.
> I think the problem will present on all boards due to call sleeping function
> in irq_disabled context.
>
> Best Regards,
>     Tarek
>
Has anyone else tested this patches?
if yes, what is the result?


Best regards,
. Tarek

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup
@ 2014-02-15  4:12       ` Tarek Dakhran
  0 siblings, 0 replies; 13+ messages in thread
From: Tarek Dakhran @ 2014-02-15  4:12 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Feb 13, 2014 at 10:31 PM, Tarek Dakhran <t.dakhran@gmail.com> wrote:
> Hi Tomasz,
>
> On Thursday, February 13, 2014, Tomasz Figa <t.figa@samsung.com> wrote:
>>
>> Hi Tarek,
>>
>> On 13.02.2014 04:08, Tarek Dakhran wrote:
>>>
>>> exynos4_local_timer_setup called on the secondary cpu before
>>> irqs are enabled. request_irq can sleep, which produces next warning:
>>>
>>> on boot:
>>> [    0.370000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
>>> [    0.370000] Setting up static identity map for 0x403b5700 - 0x403b5758
>>> [    0.395000] CPU1: Booted secondary processor
>>> [    0.395000] ------------[ cut here ]------------
>>> [    0.395000] WARNING: CPU: 1 PID: 0 at kernel/locking/lockdep.c:2742
>>> lockdep_trace_alloc+0xe0/0xfc()
>>> [    0.395000] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
>>> [    0.395000] Modules linked in:
>>> [    0.395000] CPU: 1 PID: 0 Comm: swapper/1 Not tainted
>>> 3.14.0-rc2-00004-g0db95f4 #128
>>> [    0.395000] [<c0014308>] (unwind_backtrace) from [<c0011690>]
>>> (show_stack+0x10/0x14)
>>> [    0.395000] [<c0011690>] (show_stack) from [<c03ae7d0>]
>>> (dump_stack+0x6c/0xb8)
>>> [    0.395000] [<c03ae7d0>] (dump_stack) from [<c001d504>]
>>> (warn_slowpath_common+0x68/0x8c)
>>> [    0.395000] [<c001d504>] (warn_slowpath_common) from [<c001d5bc>]
>>> (warn_slowpath_fmt+0x30/0x40)
>>> [    0.395000] [<c001d5bc>] (warn_slowpath_fmt) from [<c0059824>]
>>> (lockdep_trace_alloc+0xe0/0xfc)
>>> [    0.395000] [<c0059824>] (lockdep_trace_alloc) from [<c00bee24>]
>>> (kmem_cache_alloc+0x24/0x160)
>>> [    0.395000] [<c00bee24>] (kmem_cache_alloc) from [<c0068174>]
>>> (request_threaded_irq+0x64/0x130)
>>> [    0.395000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>]
>>> (exynos4_local_timer_setup+0xd0/0x124)
>>> [    0.395000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>]
>>> (exynos4_mct_cpu_notify+0x78/0xf0)
>>> [    0.395000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>]
>>> (notifier_call_chain+0x44/0x84)
>>> [    0.395000] [<c003d318>] (notifier_call_chain) from [<c001d61c>]
>>> (__cpu_notify+0x24/0x40)
>>> [    0.395000] [<c001d61c>] (__cpu_notify) from [<c0013314>]
>>> (secondary_start_kernel+0xe4/0x134)
>>> [    0.395000] [<c0013314>] (secondary_start_kernel) from [<40008624>]
>>> (0x40008624)
>>> [    0.395000] ---[ end trace 347890460e745f50 ]---
>>> [    0.420000] CPU1: update cpu_power 1024
>>> [    0.420000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
>>>
>>> on hotplug:
>>> [  108.040000] CPU3: Booted secondary processor
>>> [  108.040000] BUG: sleeping function called from invalid context at
>>> mm/slub.c:965
>>> [  108.040000] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name:
>>> swapper/3
>>> [  108.040000] INFO: lockdep is turned off.
>>> [  108.040000] irq event stamp: 0
>>> [  108.040000] hardirqs last  enabled at (0): [<  (null)>]   (null)
>>> [  108.040000] hardirqs last disabled at (0): [<c001b768>]
>>> copy_process.part.2+0x2a4/0x12f4
>>> [  108.040000] softirqs last  enabled at (0): [<c001b768>]
>>> copy_process.part.2+0x2a4/0x12f4
>>> [  108.040000] softirqs last disabled at (0): [<  (null)>]   (null)
>>> [  108.040000] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G        W
>>> 3.14.0-rc2-00004-g0db95f4 #128
>>> [  108.040000] [<c0014308>] (unwind_backtrace) from [<c0011690>]
>>> (show_stack+0x10/0x14)
>>> [  108.040000] [<c0011690>] (show_stack) from [<c03ae7d0>]
>>> (dump_stack+0x6c/0xb8)
>>> [  108.040000] [<c03ae7d0>] (dump_stack) from [<c00beed4>]
>>> (kmem_cache_alloc+0xd4/0x160)
>>> [  108.040000] [<c00beed4>] (kmem_cache_alloc) from [<c0068174>]
>>> (request_threaded_irq+0x64/0x130)
>>> [  108.040000] [<c0068174>] (request_threaded_irq) from [<c02efaf8>]
>>> (exynos4_local_timer_setup+0xd0/0x124)
>>> [  108.040000] [<c02efaf8>] (exynos4_local_timer_setup) from [<c02efc34>]
>>> (exynos4_mct_cpu_notify+0x78/0xf0)
>>> [  108.040000] [<c02efc34>] (exynos4_mct_cpu_notify) from [<c003d318>]
>>> (notifier_call_chain+0x44/0x84)
>>> [  108.040000] [<c003d318>] (notifier_call_chain) from [<c001d61c>]
>>> (__cpu_notify+0x24/0x40)
>>> [  108.040000] [<c001d61c>] (__cpu_notify) from [<c0013314>]
>>> (secondary_start_kernel+0xe4/0x134)
>>> [  108.040000] [<c0013314>] (secondary_start_kernel) from [<40008624>]
>>> (0x40008624)
>>>
>>> First patch fixes this problem by removing request_irq from
>>> exynos4_local_timer_setup
>>> Second removes non-dt stuff.
>>>
>>> Tested on linux kernel v3.14-rc2.
>>
>>
>> It would be nice to say on which boards it has been tested. Let me check
>> this on our boards anyway.
>>
>> Best regards,
>> Tomasz
>
>
> Tested on smdk5410 reference board with lockdep enabled.
> I think the problem will present on all boards due to call sleeping function
> in irq_disabled context.
>
> Best Regards,
>     Tarek
>
Has anyone else tested this patches?
if yes, what is the result?


Best regards,
. Tarek

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v1 1/2] clocksource: mct: remove request_irq from exynos4_local_timer_setup
  2014-02-13  3:08   ` Tarek Dakhran
@ 2014-02-15 12:42     ` Thomas Gleixner
  -1 siblings, 0 replies; 13+ messages in thread
From: Thomas Gleixner @ 2014-02-15 12:42 UTC (permalink / raw)
  To: Tarek Dakhran
  Cc: linux-kernel, Russell King, Kukjin Kim, Daniel Lezcano,
	Sachin Kamat, Tarek Dakhran, Vyacheslav Tyrtov, Tomasz Figa,
	linux-arm-kernel, linux-samsung-soc

On Thu, 13 Feb 2014, Tarek Dakhran wrote:

> exynos4_local_timer_setup called on the secondary cpu before
> irqs are enabled. request_irq can sleep, which produces next warning:
> 
> 	BUG: sleeping function called from invalid context at mm/slub.c:965
> 	in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3
> 
> Call setup_irq for each local timer in exynos4_timer_resources,
> and only call enable_irq during percpu timer setup.
> 
> Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
> ---
>  drivers/clocksource/exynos_mct.c |   38 ++++++++++++++++++++++++++++++--------
>  1 file changed, 30 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index 48f76bc..1cde3de 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -82,6 +82,7 @@ static void __iomem *reg_base;
>  static unsigned long clk_rate;
>  static unsigned int mct_int_type;
>  static int mct_irqs[MCT_NR_IRQS];
> +static struct irqaction __percpu *mct_LX_irqaction;
>  
>  struct mct_clock_event_device {
>  	struct clock_event_device evt;
> @@ -402,6 +403,25 @@ static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
>  	return IRQ_HANDLED;
>  }
>  
> +static void exynos4_setup_irqaction_spi(unsigned int cpu)
> +{
> +	struct irqaction *pcpu_irqaction = per_cpu_ptr(mct_LX_irqaction, cpu);
> +	unsigned int irq = mct_irqs[MCT_L0_IRQ + cpu];
> +	int err;
> +
> +	pcpu_irqaction->name = per_cpu(percpu_mct_tick, cpu).name;
> +	pcpu_irqaction->flags  = IRQF_TIMER | IRQF_NOBALANCING;
> +	pcpu_irqaction->handler = exynos4_mct_tick_isr;
> +	pcpu_irqaction->dev_id = &per_cpu(percpu_mct_tick, cpu);
> +
> +	err = setup_irq(irq, pcpu_irqaction);

This is just crap. Why don't you use request_irq()?

> +	if (err) {
> +		pr_err("MCT: can't setup IRQ %d (%d)\n", irq, err);
> +		return;
> +	}
> +	disable_irq(irq);

This is completely backwards. We have flags which tell the core not to
enable an interrupt at setup time. Also what's wrong with enabling the
interrupt in the first place? When the timer is stopped then no
interrupts happen and it does not matter a bit whether the irq line is
enabled or not.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v1 1/2] clocksource: mct: remove request_irq from exynos4_local_timer_setup
@ 2014-02-15 12:42     ` Thomas Gleixner
  0 siblings, 0 replies; 13+ messages in thread
From: Thomas Gleixner @ 2014-02-15 12:42 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, 13 Feb 2014, Tarek Dakhran wrote:

> exynos4_local_timer_setup called on the secondary cpu before
> irqs are enabled. request_irq can sleep, which produces next warning:
> 
> 	BUG: sleeping function called from invalid context at mm/slub.c:965
> 	in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/3
> 
> Call setup_irq for each local timer in exynos4_timer_resources,
> and only call enable_irq during percpu timer setup.
> 
> Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
> ---
>  drivers/clocksource/exynos_mct.c |   38 ++++++++++++++++++++++++++++++--------
>  1 file changed, 30 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
> index 48f76bc..1cde3de 100644
> --- a/drivers/clocksource/exynos_mct.c
> +++ b/drivers/clocksource/exynos_mct.c
> @@ -82,6 +82,7 @@ static void __iomem *reg_base;
>  static unsigned long clk_rate;
>  static unsigned int mct_int_type;
>  static int mct_irqs[MCT_NR_IRQS];
> +static struct irqaction __percpu *mct_LX_irqaction;
>  
>  struct mct_clock_event_device {
>  	struct clock_event_device evt;
> @@ -402,6 +403,25 @@ static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
>  	return IRQ_HANDLED;
>  }
>  
> +static void exynos4_setup_irqaction_spi(unsigned int cpu)
> +{
> +	struct irqaction *pcpu_irqaction = per_cpu_ptr(mct_LX_irqaction, cpu);
> +	unsigned int irq = mct_irqs[MCT_L0_IRQ + cpu];
> +	int err;
> +
> +	pcpu_irqaction->name = per_cpu(percpu_mct_tick, cpu).name;
> +	pcpu_irqaction->flags  = IRQF_TIMER | IRQF_NOBALANCING;
> +	pcpu_irqaction->handler = exynos4_mct_tick_isr;
> +	pcpu_irqaction->dev_id = &per_cpu(percpu_mct_tick, cpu);
> +
> +	err = setup_irq(irq, pcpu_irqaction);

This is just crap. Why don't you use request_irq()?

> +	if (err) {
> +		pr_err("MCT: can't setup IRQ %d (%d)\n", irq, err);
> +		return;
> +	}
> +	disable_irq(irq);

This is completely backwards. We have flags which tell the core not to
enable an interrupt at setup time. Also what's wrong with enabling the
interrupt in the first place? When the timer is stopped then no
interrupts happen and it does not matter a bit whether the irq line is
enabled or not.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2014-02-15 12:42 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-13  3:08 [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup Tarek Dakhran
2014-02-13  3:08 ` Tarek Dakhran
2014-02-13  3:08 ` [PATCH v1 1/2] clocksource: mct: remove request_irq from exynos4_local_timer_setup Tarek Dakhran
2014-02-13  3:08   ` Tarek Dakhran
2014-02-15 12:42   ` Thomas Gleixner
2014-02-15 12:42     ` Thomas Gleixner
2014-02-13  3:08 ` [PATCH v1 2/2] clocksource: mct: cleanup, remove non-dt stuff from mct Tarek Dakhran
2014-02-13  3:08   ` Tarek Dakhran
2014-02-13 12:36 ` [PATCH v1 0/2] exynos_mct driver: fix irq allocation and cleanup Tomasz Figa
2014-02-13 12:36   ` Tomasz Figa
     [not found]   ` <CANhyOUcBrsnfSa3sCGbFqUB0g6zfG9moqbGapJGU3zbxWQVgiA@mail.gmail.com>
2014-02-15  4:12     ` Tarek Dakhran
2014-02-15  4:12       ` Tarek Dakhran
2014-02-15  4:12       ` Tarek Dakhran

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.