* [PATCH] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
@ 2013-08-26 16:33 Tomasz Figa
2013-08-26 23:09 ` Stephen Boyd
2013-09-25 14:05 ` [PATCH RESEND CRITICAL] " Tomasz Figa
0 siblings, 2 replies; 4+ messages in thread
From: Tomasz Figa @ 2013-08-26 16:33 UTC (permalink / raw)
To: linux-arm-kernel
Some variants of Exynos MCT, namely exynos4210-mct at the moment, use
normal, shared interrupts for local timers. This means that each
interrupt must have correct affinity set to fire only on CPU
corresponding to given local timer.
However after recent conversion of clocksource drivers to not use the
local timer API for local timer initialization any more, the point of
time when local timers get initialized changed and irq_set_affinity()
fails because the CPU is not marked as online yet.
This patch fixes this by moving the call to irq_set_affinity() to
CPU_ONLINE notification, so the affinity is being set when the CPU goes
online.
This fixes a problem with Exynos4210 failing to boot, present since commit
ee98d27df6 ARM: EXYNOS4: Divorce mct from local timer API
due to failing irq_set_affinity().
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
drivers/clocksource/exynos_mct.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 5b34768..62b0de6 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -428,7 +428,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)
evt->irq);
return -EIO;
}
- irq_set_affinity(evt->irq, cpumask_of(cpu));
} else {
enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
}
@@ -449,6 +448,7 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
struct mct_clock_event_device *mevt;
+ unsigned int cpu;
/*
* Grab cpu pointer in each case to avoid spurious
@@ -459,6 +459,12 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self,
mevt = this_cpu_ptr(&percpu_mct_tick);
exynos4_local_timer_setup(&mevt->evt);
break;
+ case CPU_ONLINE:
+ cpu = (unsigned long)hcpu;
+ if (mct_int_type == MCT_INT_SPI)
+ irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu],
+ cpumask_of(cpu));
+ break;
case CPU_DYING:
mevt = this_cpu_ptr(&percpu_mct_tick);
exynos4_local_timer_stop(&mevt->evt);
@@ -500,6 +506,8 @@ 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 {
+ irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
}
err = register_cpu_notifier(&exynos4_mct_cpu_nb);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
2013-08-26 16:33 [PATCH] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online Tomasz Figa
@ 2013-08-26 23:09 ` Stephen Boyd
2013-08-26 23:26 ` Tomasz Figa
2013-09-25 14:05 ` [PATCH RESEND CRITICAL] " Tomasz Figa
1 sibling, 1 reply; 4+ messages in thread
From: Stephen Boyd @ 2013-08-26 23:09 UTC (permalink / raw)
To: linux-arm-kernel
On 08/26, Tomasz Figa wrote:
> Some variants of Exynos MCT, namely exynos4210-mct at the moment, use
> normal, shared interrupts for local timers. This means that each
> interrupt must have correct affinity set to fire only on CPU
> corresponding to given local timer.
>
> However after recent conversion of clocksource drivers to not use the
> local timer API for local timer initialization any more, the point of
> time when local timers get initialized changed and irq_set_affinity()
> fails because the CPU is not marked as online yet.
>
> This patch fixes this by moving the call to irq_set_affinity() to
> CPU_ONLINE notification, so the affinity is being set when the CPU goes
> online.
>
> This fixes a problem with Exynos4210 failing to boot, present since commit
> ee98d27df6 ARM: EXYNOS4: Divorce mct from local timer API
> due to failing irq_set_affinity().
>
> Signed-off-by: Tomasz Figa <t.figa@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> ---
Looks good to me if you want to go this route.
Acked-by: Stephen Boyd <sboyd@codeaurora.org>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
2013-08-26 23:09 ` Stephen Boyd
@ 2013-08-26 23:26 ` Tomasz Figa
0 siblings, 0 replies; 4+ messages in thread
From: Tomasz Figa @ 2013-08-26 23:26 UTC (permalink / raw)
To: linux-arm-kernel
On Monday 26 of August 2013 16:09:41 Stephen Boyd wrote:
> On 08/26, Tomasz Figa wrote:
> > Some variants of Exynos MCT, namely exynos4210-mct at the moment, use
> > normal, shared interrupts for local timers. This means that each
> > interrupt must have correct affinity set to fire only on CPU
> > corresponding to given local timer.
> >
> > However after recent conversion of clocksource drivers to not use the
> > local timer API for local timer initialization any more, the point of
> > time when local timers get initialized changed and irq_set_affinity()
> > fails because the CPU is not marked as online yet.
> >
> > This patch fixes this by moving the call to irq_set_affinity() to
> > CPU_ONLINE notification, so the affinity is being set when the CPU
> > goes
> > online.
> >
> > This fixes a problem with Exynos4210 failing to boot, present since
> > commit>
> > ee98d27df6 ARM: EXYNOS4: Divorce mct from local timer API
> >
> > due to failing irq_set_affinity().
> >
> > Signed-off-by: Tomasz Figa <t.figa@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > ---
>
> Looks good to me if you want to go this route.
>
> Acked-by: Stephen Boyd <sboyd@codeaurora.org>
Thanks. After some testing this seems to work fine and I don't see any
reason how the timer could be programmed to fire an interrupt before the
CPU goes online, so it should be fine.
Anyway, we want this to be fixed for 3.12 for sure and since I don't
really see any better solution we should take this one.
Best regards,
Tomasz
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH RESEND CRITICAL] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online
2013-08-26 16:33 [PATCH] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online Tomasz Figa
2013-08-26 23:09 ` Stephen Boyd
@ 2013-09-25 14:05 ` Tomasz Figa
1 sibling, 0 replies; 4+ messages in thread
From: Tomasz Figa @ 2013-09-25 14:05 UTC (permalink / raw)
To: linux-arm-kernel
Some variants of Exynos MCT, namely exynos4210-mct at the moment, use
normal, shared interrupts for local timers. This means that each
interrupt must have correct affinity set to fire only on CPU
corresponding to given local timer.
However after recent conversion of clocksource drivers to not use the
local timer API for local timer initialization any more, the point of
time when local timers get initialized changed and irq_set_affinity()
fails because the CPU is not marked as online yet.
This patch fixes this by moving the call to irq_set_affinity() to
CPU_ONLINE notification, so the affinity is being set when the CPU goes
online.
This fixes a problem with Exynos4210 failing to boot, present since commit
ee98d27df6 ARM: EXYNOS4: Divorce mct from local timer API
due to failing irq_set_affinity().
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
---
drivers/clocksource/exynos_mct.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
Resending again, since my mail client previously freaked out and reset
message format to HTML...
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index 5b34768..62b0de6 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -428,7 +428,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)
evt->irq);
return -EIO;
}
- irq_set_affinity(evt->irq, cpumask_of(cpu));
} else {
enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0);
}
@@ -449,6 +448,7 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
struct mct_clock_event_device *mevt;
+ unsigned int cpu;
/*
* Grab cpu pointer in each case to avoid spurious
@@ -459,6 +459,12 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self,
mevt = this_cpu_ptr(&percpu_mct_tick);
exynos4_local_timer_setup(&mevt->evt);
break;
+ case CPU_ONLINE:
+ cpu = (unsigned long)hcpu;
+ if (mct_int_type == MCT_INT_SPI)
+ irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu],
+ cpumask_of(cpu));
+ break;
case CPU_DYING:
mevt = this_cpu_ptr(&percpu_mct_tick);
exynos4_local_timer_stop(&mevt->evt);
@@ -500,6 +506,8 @@ 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 {
+ irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0));
}
err = register_cpu_notifier(&exynos4_mct_cpu_nb);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-09-25 14:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-26 16:33 [PATCH] clocksource: exynos_mct: Set IRQ affinity when the CPU goes online Tomasz Figa
2013-08-26 23:09 ` Stephen Boyd
2013-08-26 23:26 ` Tomasz Figa
2013-09-25 14:05 ` [PATCH RESEND CRITICAL] " Tomasz Figa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).