* [resend] Timer broadcast question @ 2013-02-19 18:02 Daniel Lezcano 2013-02-19 18:10 ` Thomas Gleixner 0 siblings, 1 reply; 18+ messages in thread From: Daniel Lezcano @ 2013-02-19 18:02 UTC (permalink / raw) To: John Stultz, Frederic Weisbecker, Linux Kernel Mailing List, Thomas Gleixner, linaro-dev >> Lists Linaro-dev Hi, I am working on identifying the different wakeup sources from the interrupts and I have a question regarding the timer broadcast. The broadcast timer is setup to the next event and that will wake up any idle cpu belonging to the "broadcast cpumask", right ? The cpu which has been woken up will look for each cpu the next-event and send an IPI to wake it up. Although, it is possible the sender of this IPI may not be concerned by the timer expiration and has been woken up just for sending the IPI, right ? If this is correct, is it possible to setup the timer irq affinity to a cpu which will be concerned by the timer expiration ? so we prevent an unnecessary wake up for a cpu. For example, let's say we have a 2 cpus system. cpu0, cpu1 are idle The next event is for cpu1 but cpu0 is wake up by the broadcast timer, after checking it has nothing to do except send a IPI_TIMER to cpu1 and then goes to idle again. Wouldn't be worth to set the broadcast timer affinity to cpu1, so cpu0 is not wake up ? Did I missed something or does it sound correct ? Thanks -- Daniel -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-19 18:02 [resend] Timer broadcast question Daniel Lezcano @ 2013-02-19 18:10 ` Thomas Gleixner 2013-02-19 18:21 ` Daniel Lezcano 0 siblings, 1 reply; 18+ messages in thread From: Thomas Gleixner @ 2013-02-19 18:10 UTC (permalink / raw) To: Daniel Lezcano Cc: John Stultz, Frederic Weisbecker, Linux Kernel Mailing List, linaro-dev >> Lists Linaro-dev On Tue, 19 Feb 2013, Daniel Lezcano wrote: > I am working on identifying the different wakeup sources from the > interrupts and I have a question regarding the timer broadcast. > > The broadcast timer is setup to the next event and that will wake up any > idle cpu belonging to the "broadcast cpumask", right ? > > The cpu which has been woken up will look for each cpu the next-event > and send an IPI to wake it up. > > Although, it is possible the sender of this IPI may not be concerned by > the timer expiration and has been woken up just for sending the IPI, right ? Correct. > If this is correct, is it possible to setup the timer irq affinity to a > cpu which will be concerned by the timer expiration ? so we prevent an > unnecessary wake up for a cpu. It is possible, but we never implemented it. If we go there, we want to make that conditional on a property flag, because some interrupt controllers especially on x86 only allow to move the affinity from interrupt context, which is pointless. Thanks, tglx ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-19 18:10 ` Thomas Gleixner @ 2013-02-19 18:21 ` Daniel Lezcano 2013-02-19 22:46 ` Andy Lutomirski ` (2 more replies) 0 siblings, 3 replies; 18+ messages in thread From: Daniel Lezcano @ 2013-02-19 18:21 UTC (permalink / raw) To: Thomas Gleixner Cc: John Stultz, Frederic Weisbecker, Linux Kernel Mailing List, linaro-dev >> Lists Linaro-dev On 02/19/2013 07:10 PM, Thomas Gleixner wrote: > On Tue, 19 Feb 2013, Daniel Lezcano wrote: >> I am working on identifying the different wakeup sources from the >> interrupts and I have a question regarding the timer broadcast. >> >> The broadcast timer is setup to the next event and that will wake up any >> idle cpu belonging to the "broadcast cpumask", right ? >> >> The cpu which has been woken up will look for each cpu the next-event >> and send an IPI to wake it up. >> >> Although, it is possible the sender of this IPI may not be concerned by >> the timer expiration and has been woken up just for sending the IPI, right ? > > Correct. > >> If this is correct, is it possible to setup the timer irq affinity to a >> cpu which will be concerned by the timer expiration ? so we prevent an >> unnecessary wake up for a cpu. > > It is possible, but we never implemented it. > > If we go there, we want to make that conditional on a property flag, > because some interrupt controllers especially on x86 only allow to > move the affinity from interrupt context, which is pointless. Thanks Thomas for your quick answer. I will write a RFC patchset. -- Daniel -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-19 18:21 ` Daniel Lezcano @ 2013-02-19 22:46 ` Andy Lutomirski 2013-02-20 10:09 ` Thomas Gleixner 2013-02-21 6:19 ` Santosh Shilimkar 2013-02-21 22:01 ` [PATCH 1/2] time : pass broadcast device parameter Daniel Lezcano 2 siblings, 1 reply; 18+ messages in thread From: Andy Lutomirski @ 2013-02-19 22:46 UTC (permalink / raw) To: Daniel Lezcano Cc: Thomas Gleixner, John Stultz, Frederic Weisbecker, Linux Kernel Mailing List, linaro-dev >> Lists Linaro-dev On 02/19/2013 10:21 AM, Daniel Lezcano wrote: > On 02/19/2013 07:10 PM, Thomas Gleixner wrote: >> On Tue, 19 Feb 2013, Daniel Lezcano wrote: >>> I am working on identifying the different wakeup sources from the >>> interrupts and I have a question regarding the timer broadcast. >>> >>> The broadcast timer is setup to the next event and that will wake up any >>> idle cpu belonging to the "broadcast cpumask", right ? >>> >>> The cpu which has been woken up will look for each cpu the next-event >>> and send an IPI to wake it up. >>> >>> Although, it is possible the sender of this IPI may not be concerned by >>> the timer expiration and has been woken up just for sending the IPI, right ? >> >> Correct. >> >>> If this is correct, is it possible to setup the timer irq affinity to a >>> cpu which will be concerned by the timer expiration ? so we prevent an >>> unnecessary wake up for a cpu. >> >> It is possible, but we never implemented it. >> >> If we go there, we want to make that conditional on a property flag, >> because some interrupt controllers especially on x86 only allow to >> move the affinity from interrupt context, which is pointless. > > Thanks Thomas for your quick answer. I will write a RFC patchset. I'm curious what the use case is. I played with this code awhile ago, and AFAICT it's not used on sensible (i.e. modern) systems. Is there anything other than old x86 machines that needs it? --Andy ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-19 22:46 ` Andy Lutomirski @ 2013-02-20 10:09 ` Thomas Gleixner 0 siblings, 0 replies; 18+ messages in thread From: Thomas Gleixner @ 2013-02-20 10:09 UTC (permalink / raw) To: Andy Lutomirski Cc: Daniel Lezcano, John Stultz, Frederic Weisbecker, Linux Kernel Mailing List, linaro-dev >> Lists Linaro-dev On Tue, 19 Feb 2013, Andy Lutomirski wrote: > On 02/19/2013 10:21 AM, Daniel Lezcano wrote: > > On 02/19/2013 07:10 PM, Thomas Gleixner wrote: > >> On Tue, 19 Feb 2013, Daniel Lezcano wrote: > >>> I am working on identifying the different wakeup sources from the > >>> interrupts and I have a question regarding the timer broadcast. > >>> > >>> The broadcast timer is setup to the next event and that will wake up any > >>> idle cpu belonging to the "broadcast cpumask", right ? > >>> > >>> The cpu which has been woken up will look for each cpu the next-event > >>> and send an IPI to wake it up. > >>> > >>> Although, it is possible the sender of this IPI may not be concerned by > >>> the timer expiration and has been woken up just for sending the IPI, right ? > >> > >> Correct. > >> > >>> If this is correct, is it possible to setup the timer irq affinity to a > >>> cpu which will be concerned by the timer expiration ? so we prevent an > >>> unnecessary wake up for a cpu. > >> > >> It is possible, but we never implemented it. > >> > >> If we go there, we want to make that conditional on a property flag, > >> because some interrupt controllers especially on x86 only allow to > >> move the affinity from interrupt context, which is pointless. > > > > Thanks Thomas for your quick answer. I will write a RFC patchset. > > I'm curious what the use case is. I played with this code awhile ago, > and AFAICT it's not used on sensible (i.e. modern) systems. Is there > anything other than old x86 machines that needs it? If the local apic timer is not affected by C-States, it's irrelevant, but there are enough machines out there which do not have that. The point is that we want a flag on the broadcast device which tells us whether we should use dynamic affinity settings or not. On x86 we would not set that flag ever. Thanks, tglx ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-19 18:21 ` Daniel Lezcano 2013-02-19 22:46 ` Andy Lutomirski @ 2013-02-21 6:19 ` Santosh Shilimkar 2013-02-21 9:01 ` Daniel Lezcano 2013-02-21 22:01 ` [PATCH 1/2] time : pass broadcast device parameter Daniel Lezcano 2 siblings, 1 reply; 18+ messages in thread From: Santosh Shilimkar @ 2013-02-21 6:19 UTC (permalink / raw) To: Daniel Lezcano Cc: Thomas Gleixner, Frederic Weisbecker, linaro-dev >> Lists Linaro-dev, John Stultz, Linux Kernel Mailing List, Linux ARM Kernel Mailing List [-- Attachment #1: Type: text/plain, Size: 5033 bytes --] On Tuesday 19 February 2013 11:51 PM, Daniel Lezcano wrote: > On 02/19/2013 07:10 PM, Thomas Gleixner wrote: >> On Tue, 19 Feb 2013, Daniel Lezcano wrote: >>> I am working on identifying the different wakeup sources from the >>> interrupts and I have a question regarding the timer broadcast. >>> >>> The broadcast timer is setup to the next event and that will wake up any >>> idle cpu belonging to the "broadcast cpumask", right ? >>> >>> The cpu which has been woken up will look for each cpu the next-event >>> and send an IPI to wake it up. >>> >>> Although, it is possible the sender of this IPI may not be concerned by >>> the timer expiration and has been woken up just for sending the IPI, right ? >> >> Correct. >> >>> If this is correct, is it possible to setup the timer irq affinity to a >>> cpu which will be concerned by the timer expiration ? so we prevent an >>> unnecessary wake up for a cpu. >> >> It is possible, but we never implemented it. >> >> If we go there, we want to make that conditional on a property flag, >> because some interrupt controllers especially on x86 only allow to >> move the affinity from interrupt context, which is pointless. > > Thanks Thomas for your quick answer. I will write a RFC patchset. > Last year I implemented the affinity hook for broad-cast code and experimented with it. Since the system I was using was dual core, it wasn't much beneficial and hence gave up later. I did remember discussing the approach with few folks in the conference. Patch in the end of the email (also attached) for generic broadcast code. I didn't look at all corner case though. In arch code then you need to setup "broadcast_affinity" hook which should be able to get handle of the arch irqchip and call the respective affinity handler. Just 3 lines function should do the trick. As Thomas said, effectiveness of such optimization solely depends on how well the affinity (in low powers) supported by your IRQ chip. Hope this is helpful for you. Regards, Santosh From d70f2d48ec08a3f1d73187c49b16e4e60f81a50c Mon Sep 17 00:00:00 2001 From: Santosh Shilimkar <santosh.shilimkar@ti.com> Date: Wed, 25 Jul 2012 03:42:33 +0530 Subject: [PATCH] tick-broadcast: Add tick road-cast affinity suport Current tick broad-cast code has affinity set to the boot CPU and hence the boot CPU will always wakeup from low power states when broad cast timer is armed even if the next expiry event doesn't belong to it. Patch adds broadcast affinity functionality to avoid above and let the tick framework set the affinity of the event for the CPU it belongs. Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> --- include/linux/clockchips.h | 2 ++ kernel/time/tick-broadcast.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 8a7096f..5488cdc 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -95,6 +95,8 @@ struct clock_event_device { unsigned long retries; void (*broadcast)(const struct cpumask *mask); + void (*broadcast_affinity) + (const struct cpumask *mask, int irq); void (*set_mode)(enum clock_event_mode mode, struct clock_event_device *); void (*suspend)(struct clock_event_device *); diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index f113755..2ec2425 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -39,6 +39,8 @@ static void tick_broadcast_clear_oneshot(int cpu); static inline void tick_broadcast_clear_oneshot(int cpu) { } #endif +static inline void dummy_broadcast_affinity(const struct cpumask *mask, + int irq) { } /* * Debugging: see timer_list.c */ @@ -485,14 +487,19 @@ void tick_broadcast_oneshot_control(unsigned long reason) if (!cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { cpumask_set_cpu(cpu, tick_get_broadcast_oneshot_mask()); clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); - if (dev->next_event.tv64 < bc->next_event.tv64) + if (dev->next_event.tv64 < bc->next_event.tv64) { tick_broadcast_set_event(dev->next_event, 1); + bc->broadcast_affinity( + tick_get_broadcast_oneshot_mask(), bc->irq); + } } } else { if (cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { cpumask_clear_cpu(cpu, tick_get_broadcast_oneshot_mask()); clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); + bc->broadcast_affinity( + tick_get_broadcast_oneshot_mask(), bc->irq); if (dev->next_event.tv64 != KTIME_MAX) tick_program_event(dev->next_event, 1); } @@ -536,6 +543,10 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) bc->event_handler = tick_handle_oneshot_broadcast; + /* setup dummy broadcast affinity handler if not provided */ + if (bc->broadcast_affinity) + bc->broadcast_affinity = dummy_broadcast_affinity; + /* Take the do_timer update */ tick_do_timer_cpu = cpu; -- 1.7.9.5 [-- Attachment #2: 0001-tick-broadcast-Add-tick-road-cast-affinity-suport.patch --] [-- Type: text/x-patch, Size: 3001 bytes --] >From d70f2d48ec08a3f1d73187c49b16e4e60f81a50c Mon Sep 17 00:00:00 2001 From: Santosh Shilimkar <santosh.shilimkar@ti.com> Date: Wed, 25 Jul 2012 03:42:33 +0530 Subject: [PATCH] tick-broadcast: Add tick road-cast affinity suport Current tick broad-cast code has affinity set to the boot CPU and hence the boot CPU will always wakeup from low power states when broad cast timer is armed even if the next expiry event doesn't belong to it. Patch adds broadcast affinity functionality to avoid above and let the tick framework set the affinity of the event for the CPU it belongs. Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> --- include/linux/clockchips.h | 2 ++ kernel/time/tick-broadcast.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 8a7096f..5488cdc 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -95,6 +95,8 @@ struct clock_event_device { unsigned long retries; void (*broadcast)(const struct cpumask *mask); + void (*broadcast_affinity) + (const struct cpumask *mask, int irq); void (*set_mode)(enum clock_event_mode mode, struct clock_event_device *); void (*suspend)(struct clock_event_device *); diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index f113755..2ec2425 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -39,6 +39,8 @@ static void tick_broadcast_clear_oneshot(int cpu); static inline void tick_broadcast_clear_oneshot(int cpu) { } #endif +static inline void dummy_broadcast_affinity(const struct cpumask *mask, + int irq) { } /* * Debugging: see timer_list.c */ @@ -485,14 +487,19 @@ void tick_broadcast_oneshot_control(unsigned long reason) if (!cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { cpumask_set_cpu(cpu, tick_get_broadcast_oneshot_mask()); clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); - if (dev->next_event.tv64 < bc->next_event.tv64) + if (dev->next_event.tv64 < bc->next_event.tv64) { tick_broadcast_set_event(dev->next_event, 1); + bc->broadcast_affinity( + tick_get_broadcast_oneshot_mask(), bc->irq); + } } } else { if (cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { cpumask_clear_cpu(cpu, tick_get_broadcast_oneshot_mask()); clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); + bc->broadcast_affinity( + tick_get_broadcast_oneshot_mask(), bc->irq); if (dev->next_event.tv64 != KTIME_MAX) tick_program_event(dev->next_event, 1); } @@ -536,6 +543,10 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) bc->event_handler = tick_handle_oneshot_broadcast; + /* setup dummy broadcast affinity handler if not provided */ + if (bc->broadcast_affinity) + bc->broadcast_affinity = dummy_broadcast_affinity; + /* Take the do_timer update */ tick_do_timer_cpu = cpu; -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-21 6:19 ` Santosh Shilimkar @ 2013-02-21 9:01 ` Daniel Lezcano 2013-02-21 9:14 ` Santosh Shilimkar 0 siblings, 1 reply; 18+ messages in thread From: Daniel Lezcano @ 2013-02-21 9:01 UTC (permalink / raw) To: Santosh Shilimkar Cc: Thomas Gleixner, Frederic Weisbecker, linaro-dev >> Lists Linaro-dev, John Stultz, Linux Kernel Mailing List, Linux ARM Kernel Mailing List On 02/21/2013 07:19 AM, Santosh Shilimkar wrote: > On Tuesday 19 February 2013 11:51 PM, Daniel Lezcano wrote: >> On 02/19/2013 07:10 PM, Thomas Gleixner wrote: >>> On Tue, 19 Feb 2013, Daniel Lezcano wrote: >>>> I am working on identifying the different wakeup sources from the >>>> interrupts and I have a question regarding the timer broadcast. >>>> >>>> The broadcast timer is setup to the next event and that will wake up >>>> any >>>> idle cpu belonging to the "broadcast cpumask", right ? >>>> >>>> The cpu which has been woken up will look for each cpu the next-event >>>> and send an IPI to wake it up. >>>> >>>> Although, it is possible the sender of this IPI may not be concerned by >>>> the timer expiration and has been woken up just for sending the IPI, >>>> right ? >>> >>> Correct. >>> >>>> If this is correct, is it possible to setup the timer irq affinity to a >>>> cpu which will be concerned by the timer expiration ? so we prevent an >>>> unnecessary wake up for a cpu. >>> >>> It is possible, but we never implemented it. >>> >>> If we go there, we want to make that conditional on a property flag, >>> because some interrupt controllers especially on x86 only allow to >>> move the affinity from interrupt context, which is pointless. >> >> Thanks Thomas for your quick answer. I will write a RFC patchset. >> > Last year I implemented the affinity hook for broad-cast code and > experimented with it. Since the system I was using was dual core, > it wasn't much beneficial and hence gave up later. I did remember > discussing the approach with few folks in the conference. I did a brief test with a similar patch on a ARM u8500 board. The timer is tied with CPU0 by default, setting the dynamic irq affinity reduce considerably the number of IPI. The difference with your patch is the affinity is set to one CPU, the first one which is supposed to be wake up by the timer expiration. This is easy to spot with a small program doing usleep wired on CPU1. We see CPU0 waking up to send an IPI to CPU1 and going to idle again. I don't know how that behaves with OMAP4 with this patch (which I guess it is the board you used), but the coupled idle state traces could be ambiguous if you relied on it to check the benefit of this patch. IMO, it is worth to implement such solution and perhaps we can extend it to optimize the package idle time with the generic power domain tied with the irq. Anyway, it is a random thought let's see that later :) > Patch in the end of the email (also attached) for generic broadcast > code. I didn't look at all corner case though. In arch code then > you need to setup "broadcast_affinity" hook which should be able > to get handle of the arch irqchip and call the respective affinity > handler. Just 3 lines function should do the trick. > > As Thomas said, effectiveness of such optimization solely depends > on how well the affinity (in low powers) supported by your IRQ chip. > > Hope this is helpful for you. Thanks a lot for your patch and your feedbacks. -- Daniel > > From d70f2d48ec08a3f1d73187c49b16e4e60f81a50c Mon Sep 17 00:00:00 2001 > From: Santosh Shilimkar <santosh.shilimkar@ti.com> > Date: Wed, 25 Jul 2012 03:42:33 +0530 > Subject: [PATCH] tick-broadcast: Add tick road-cast affinity suport > > Current tick broad-cast code has affinity set to the boot CPU and hence > the boot CPU will always wakeup from low power states when broad cast timer > is armed even if the next expiry event doesn't belong to it. > > Patch adds broadcast affinity functionality to avoid above and let the > tick framework set the affinity of the event for the CPU it belongs. > > Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> > --- > include/linux/clockchips.h | 2 ++ > kernel/time/tick-broadcast.c | 13 ++++++++++++- > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h > index 8a7096f..5488cdc 100644 > --- a/include/linux/clockchips.h > +++ b/include/linux/clockchips.h > @@ -95,6 +95,8 @@ struct clock_event_device { > unsigned long retries; > > void (*broadcast)(const struct cpumask *mask); > + void (*broadcast_affinity) > + (const struct cpumask *mask, int irq); > void (*set_mode)(enum clock_event_mode mode, > struct clock_event_device *); > void (*suspend)(struct clock_event_device *); > diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c > index f113755..2ec2425 100644 > --- a/kernel/time/tick-broadcast.c > +++ b/kernel/time/tick-broadcast.c > @@ -39,6 +39,8 @@ static void tick_broadcast_clear_oneshot(int cpu); > static inline void tick_broadcast_clear_oneshot(int cpu) { } > #endif > > +static inline void dummy_broadcast_affinity(const struct cpumask *mask, > + int irq) { } > /* > * Debugging: see timer_list.c > */ > @@ -485,14 +487,19 @@ void tick_broadcast_oneshot_control(unsigned long > reason) > if (!cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { > cpumask_set_cpu(cpu, tick_get_broadcast_oneshot_mask()); > clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); > - if (dev->next_event.tv64 < bc->next_event.tv64) > + if (dev->next_event.tv64 < bc->next_event.tv64) { > tick_broadcast_set_event(dev->next_event, 1); > + bc->broadcast_affinity( > + tick_get_broadcast_oneshot_mask(), bc->irq); > + } > } > } else { > if (cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { > cpumask_clear_cpu(cpu, > tick_get_broadcast_oneshot_mask()); > clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); > + bc->broadcast_affinity( > + tick_get_broadcast_oneshot_mask(), bc->irq); > if (dev->next_event.tv64 != KTIME_MAX) > tick_program_event(dev->next_event, 1); > } > @@ -536,6 +543,10 @@ void tick_broadcast_setup_oneshot(struct > clock_event_device *bc) > > bc->event_handler = tick_handle_oneshot_broadcast; > > + /* setup dummy broadcast affinity handler if not provided */ > + if (bc->broadcast_affinity) > + bc->broadcast_affinity = dummy_broadcast_affinity; > + > /* Take the do_timer update */ > tick_do_timer_cpu = cpu; > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog * English - detected * English * French * English * French <javascript:void(0);> <#> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [resend] Timer broadcast question 2013-02-21 9:01 ` Daniel Lezcano @ 2013-02-21 9:14 ` Santosh Shilimkar 0 siblings, 0 replies; 18+ messages in thread From: Santosh Shilimkar @ 2013-02-21 9:14 UTC (permalink / raw) To: Daniel Lezcano Cc: Thomas Gleixner, Frederic Weisbecker, linaro-dev >> Lists Linaro-dev, John Stultz, Linux Kernel Mailing List, Linux ARM Kernel Mailing List On Thursday 21 February 2013 02:31 PM, Daniel Lezcano wrote: > On 02/21/2013 07:19 AM, Santosh Shilimkar wrote: >> On Tuesday 19 February 2013 11:51 PM, Daniel Lezcano wrote: >>> On 02/19/2013 07:10 PM, Thomas Gleixner wrote: >>>> On Tue, 19 Feb 2013, Daniel Lezcano wrote: >>>>> I am working on identifying the different wakeup sources from the >>>>> interrupts and I have a question regarding the timer broadcast. >>>>> >>>>> The broadcast timer is setup to the next event and that will wake up >>>>> any >>>>> idle cpu belonging to the "broadcast cpumask", right ? >>>>> >>>>> The cpu which has been woken up will look for each cpu the next-event >>>>> and send an IPI to wake it up. >>>>> >>>>> Although, it is possible the sender of this IPI may not be concerned by >>>>> the timer expiration and has been woken up just for sending the IPI, >>>>> right ? >>>> >>>> Correct. >>>> >>>>> If this is correct, is it possible to setup the timer irq affinity to a >>>>> cpu which will be concerned by the timer expiration ? so we prevent an >>>>> unnecessary wake up for a cpu. >>>> >>>> It is possible, but we never implemented it. >>>> >>>> If we go there, we want to make that conditional on a property flag, >>>> because some interrupt controllers especially on x86 only allow to >>>> move the affinity from interrupt context, which is pointless. >>> >>> Thanks Thomas for your quick answer. I will write a RFC patchset. >>> >> Last year I implemented the affinity hook for broad-cast code and >> experimented with it. Since the system I was using was dual core, >> it wasn't much beneficial and hence gave up later. I did remember >> discussing the approach with few folks in the conference. > > I did a brief test with a similar patch on a ARM u8500 board. The timer > is tied with CPU0 by default, setting the dynamic irq affinity reduce > considerably the number of IPI. The difference with your patch is the > affinity is set to one CPU, the first one which is supposed to be wake > up by the timer expiration. > > This is easy to spot with a small program doing usleep wired on CPU1. > > We see CPU0 waking up to send an IPI to CPU1 and going to idle again. > > I don't know how that behaves with OMAP4 with this patch (which I guess > it is the board you used), but the coupled idle state traces could be > ambiguous if you relied on it to check the benefit of this patch. > Across OMAP4 and OMAP5 based devices, only the general purpose OMAP5 devices the approach was useful. Rest of the devices had constraints of master CPU(CPU0) waking up first always which in turns means pining the affinity to that CPU always which the current code already does. That was also another reason I didn't persue it further. > IMO, it is worth to implement such solution and perhaps we can extend it > to optimize the package idle time with the generic power domain tied > with the irq. Anyway, it is a random thought let's see that later :) > It is surely a good optimization especially for multi-core CPUIdle. >> Patch in the end of the email (also attached) for generic broadcast >> code. I didn't look at all corner case though. In arch code then >> you need to setup "broadcast_affinity" hook which should be able >> to get handle of the arch irqchip and call the respective affinity >> handler. Just 3 lines function should do the trick. >> >> As Thomas said, effectiveness of such optimization solely depends >> on how well the affinity (in low powers) supported by your IRQ chip. >> >> Hope this is helpful for you. > > Thanks a lot for your patch and your feedbacks. > Am glad that it was helpful. Regards, Santosh ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/2] time : pass broadcast device parameter 2013-02-19 18:21 ` Daniel Lezcano 2013-02-19 22:46 ` Andy Lutomirski 2013-02-21 6:19 ` Santosh Shilimkar @ 2013-02-21 22:01 ` Daniel Lezcano 2013-02-21 22:01 ` [PATCH 2/2][RFC] time : set broadcast irq affinity Daniel Lezcano 2013-02-26 8:45 ` [PATCH 1/2] time : pass broadcast device parameter Viresh Kumar 2 siblings, 2 replies; 18+ messages in thread From: Daniel Lezcano @ 2013-02-21 22:01 UTC (permalink / raw) To: tglx, linux-kernel, linux-arm-kernel Cc: santosh.shilimkar, linux-pm, fweisbec, john.stultz, linaro-kernel The broadcast timer could be passed as parameter to the function instead of using again tick_broadcast_device.evtdev which was previously used in the caller function. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- kernel/time/tick-broadcast.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index f113755..baf9b0e7 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -370,10 +370,9 @@ struct cpumask *tick_get_broadcast_oneshot_mask(void) return to_cpumask(tick_broadcast_oneshot_mask); } -static int tick_broadcast_set_event(ktime_t expires, int force) +static int tick_broadcast_set_event(struct clock_event_device *bc, + ktime_t expires, int force) { - struct clock_event_device *bc = tick_broadcast_device.evtdev; - if (bc->mode != CLOCK_EVT_MODE_ONESHOT) clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); @@ -443,7 +442,7 @@ again: * Rearm the broadcast device. If event expired, * repeat the above */ - if (tick_broadcast_set_event(next_event, 0)) + if (tick_broadcast_set_event(dev, next_event, 0)) goto again; } raw_spin_unlock(&tick_broadcast_lock); @@ -486,7 +485,7 @@ void tick_broadcast_oneshot_control(unsigned long reason) cpumask_set_cpu(cpu, tick_get_broadcast_oneshot_mask()); clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); if (dev->next_event.tv64 < bc->next_event.tv64) - tick_broadcast_set_event(dev->next_event, 1); + tick_broadcast_set_event(bc, dev->next_event, 1); } } else { if (cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { @@ -555,7 +554,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); tick_broadcast_init_next_event(to_cpumask(tmpmask), tick_next_period); - tick_broadcast_set_event(tick_next_period, 1); + tick_broadcast_set_event(bc, tick_next_period, 1); } else bc->next_event.tv64 = KTIME_MAX; } else { -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 2/2][RFC] time : set broadcast irq affinity 2013-02-21 22:01 ` [PATCH 1/2] time : pass broadcast device parameter Daniel Lezcano @ 2013-02-21 22:01 ` Daniel Lezcano 2013-02-22 17:55 ` Jacob Pan 2013-02-26 8:45 ` [PATCH 1/2] time : pass broadcast device parameter Viresh Kumar 1 sibling, 1 reply; 18+ messages in thread From: Daniel Lezcano @ 2013-02-21 22:01 UTC (permalink / raw) To: tglx, linux-kernel, linux-arm-kernel Cc: santosh.shilimkar, linux-pm, fweisbec, john.stultz, linaro-kernel When a cpu goes to a deep idle state where its local timer is shutdown, it notifies the time frame work to use the broadcast timer instead. Unfortunately, the broadcast device could wake up any CPU, including an idle one which is not concerned by the wake up at all. This implies, in the worst case, an idle CPU will wake up to send an IPI to another idle cpu. This patch solves this by setting the irq affinity to the cpu concerned by the nearest timer event, by this way, the CPU which is wake up is guarantee to be the one concerned by the next event and we are safe with unnecessary wakeup for another idle CPU. As the irq affinity is not supported by all the archs, a flag is needed to specify which clocksource can handle it. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- include/linux/clockchips.h | 1 + kernel/time/tick-broadcast.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 8a7096f..5cedb27 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -54,6 +54,7 @@ enum clock_event_nofitiers { */ #define CLOCK_EVT_FEAT_C3STOP 0x000008 #define CLOCK_EVT_FEAT_DUMMY 0x000010 +#define CLOCK_EVT_FEAT_DYNIRQ 0x000020 /** * struct clock_event_device - clock event device descriptor diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index baf9b0e7..cbd6737 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -370,13 +370,36 @@ struct cpumask *tick_get_broadcast_oneshot_mask(void) return to_cpumask(tick_broadcast_oneshot_mask); } -static int tick_broadcast_set_event(struct clock_event_device *bc, +/* + * Set broadcast interrupt affinity + */ +static void tick_broadcast_set_affinity(struct clock_event_device *bc, int cpu) +{ + struct cpumask cpumask; + + if (!(bc->features & CLOCK_EVT_FEAT_DYNIRQ)) + return; + + cpumask_clear(&cpumask); + cpumask_set_cpu(cpu, &cpumask); + irq_set_affinity(bc->irq, &cpumask); +} + +static int tick_broadcast_set_event(struct clock_event_device *bc, int cpu, ktime_t expires, int force) { + int ret; + if (bc->mode != CLOCK_EVT_MODE_ONESHOT) clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); - return clockevents_program_event(bc, expires, force); + ret = clockevents_program_event(bc, expires, force); + if (ret) + return ret; + + tick_broadcast_set_affinity(bc, cpu); + + return 0; } int tick_resume_broadcast_oneshot(struct clock_event_device *bc) @@ -405,7 +428,7 @@ static void tick_handle_oneshot_broadcast(struct clock_event_device *dev) { struct tick_device *td; ktime_t now, next_event; - int cpu; + int cpu, next_cpu; raw_spin_lock(&tick_broadcast_lock); again: @@ -418,8 +441,10 @@ again: td = &per_cpu(tick_cpu_device, cpu); if (td->evtdev->next_event.tv64 <= now.tv64) cpumask_set_cpu(cpu, to_cpumask(tmpmask)); - else if (td->evtdev->next_event.tv64 < next_event.tv64) + else if (td->evtdev->next_event.tv64 < next_event.tv64) { next_event.tv64 = td->evtdev->next_event.tv64; + next_cpu = cpu; + } } /* @@ -442,7 +467,7 @@ again: * Rearm the broadcast device. If event expired, * repeat the above */ - if (tick_broadcast_set_event(dev, next_event, 0)) + if (tick_broadcast_set_event(dev, next_cpu, next_event, 0)) goto again; } raw_spin_unlock(&tick_broadcast_lock); @@ -485,7 +510,7 @@ void tick_broadcast_oneshot_control(unsigned long reason) cpumask_set_cpu(cpu, tick_get_broadcast_oneshot_mask()); clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); if (dev->next_event.tv64 < bc->next_event.tv64) - tick_broadcast_set_event(bc, dev->next_event, 1); + tick_broadcast_set_event(bc, cpu, dev->next_event, 1); } } else { if (cpumask_test_cpu(cpu, tick_get_broadcast_oneshot_mask())) { @@ -554,7 +579,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); tick_broadcast_init_next_event(to_cpumask(tmpmask), tick_next_period); - tick_broadcast_set_event(bc, tick_next_period, 1); + tick_broadcast_set_event(bc, cpu, tick_next_period, 1); } else bc->next_event.tv64 = KTIME_MAX; } else { -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 2/2][RFC] time : set broadcast irq affinity 2013-02-21 22:01 ` [PATCH 2/2][RFC] time : set broadcast irq affinity Daniel Lezcano @ 2013-02-22 17:55 ` Jacob Pan 2013-02-22 18:45 ` Thomas Gleixner 2013-02-25 22:50 ` Daniel Lezcano 0 siblings, 2 replies; 18+ messages in thread From: Jacob Pan @ 2013-02-22 17:55 UTC (permalink / raw) To: Daniel Lezcano Cc: tglx, linux-kernel, linux-arm-kernel, santosh.shilimkar, linux-pm, fweisbec, john.stultz, linaro-kernel On Thu, 21 Feb 2013 23:01:23 +0100 Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > +/* > + * Set broadcast interrupt affinity > + */ > +static void tick_broadcast_set_affinity(struct clock_event_device > *bc, int cpu) +{ > + struct cpumask cpumask; > + > + if (!(bc->features & CLOCK_EVT_FEAT_DYNIRQ)) > + return; > + > + cpumask_clear(&cpumask); > + cpumask_set_cpu(cpu, &cpumask); > + irq_set_affinity(bc->irq, &cpumask); would it be more efficient to keep track of the current bc->irq affinity via cpumask then set it only if it is different? -- Thanks, Jacob ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/2][RFC] time : set broadcast irq affinity 2013-02-22 17:55 ` Jacob Pan @ 2013-02-22 18:45 ` Thomas Gleixner 2013-02-25 22:50 ` Daniel Lezcano 1 sibling, 0 replies; 18+ messages in thread From: Thomas Gleixner @ 2013-02-22 18:45 UTC (permalink / raw) To: Jacob Pan Cc: Daniel Lezcano, linux-kernel, linux-arm-kernel, santosh.shilimkar, linux-pm, fweisbec, john.stultz, linaro-kernel On Fri, 22 Feb 2013, Jacob Pan wrote: > On Thu, 21 Feb 2013 23:01:23 +0100 > Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > > > +/* > > + * Set broadcast interrupt affinity > > + */ > > +static void tick_broadcast_set_affinity(struct clock_event_device > > *bc, int cpu) +{ > > + struct cpumask cpumask; > > + > > + if (!(bc->features & CLOCK_EVT_FEAT_DYNIRQ)) > > + return; > > + > > + cpumask_clear(&cpumask); > > + cpumask_set_cpu(cpu, &cpumask); > > + irq_set_affinity(bc->irq, &cpumask); > would it be more efficient to keep track of the current bc->irq affinity > via cpumask then set it only if it is different? You beat me :) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/2][RFC] time : set broadcast irq affinity 2013-02-22 17:55 ` Jacob Pan 2013-02-22 18:45 ` Thomas Gleixner @ 2013-02-25 22:50 ` Daniel Lezcano 2013-02-25 23:00 ` Jacob Pan 1 sibling, 1 reply; 18+ messages in thread From: Daniel Lezcano @ 2013-02-25 22:50 UTC (permalink / raw) To: Jacob Pan Cc: tglx, linux-kernel, linux-arm-kernel, santosh.shilimkar, linux-pm, fweisbec, john.stultz, linaro-kernel On 02/22/2013 06:55 PM, Jacob Pan wrote: > On Thu, 21 Feb 2013 23:01:23 +0100 > Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > >> +/* >> + * Set broadcast interrupt affinity >> + */ >> +static void tick_broadcast_set_affinity(struct clock_event_device >> *bc, int cpu) +{ >> + struct cpumask cpumask; >> + >> + if (!(bc->features & CLOCK_EVT_FEAT_DYNIRQ)) >> + return; >> + >> + cpumask_clear(&cpumask); >> + cpumask_set_cpu(cpu, &cpumask); >> + irq_set_affinity(bc->irq, &cpumask); > would it be more efficient to keep track of the current bc->irq affinity > via cpumask then set it only if it is different? Do you mean a cpumask static variable ? and something like: if (!cpumask_test_cpu(cpu, &affinitymask)) { cpumask_set_cpu(cpu, &affinitymask); irq_set_affinity(bc->irq, &affinitymask) } -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/2][RFC] time : set broadcast irq affinity 2013-02-25 22:50 ` Daniel Lezcano @ 2013-02-25 23:00 ` Jacob Pan 0 siblings, 0 replies; 18+ messages in thread From: Jacob Pan @ 2013-02-25 23:00 UTC (permalink / raw) To: Daniel Lezcano Cc: tglx, linux-kernel, linux-arm-kernel, santosh.shilimkar, linux-pm, fweisbec, john.stultz, linaro-kernel On Mon, 25 Feb 2013 23:50:23 +0100 Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > Do you mean a cpumask static variable ? and something like: > > if (!cpumask_test_cpu(cpu, &affinitymask)) { > cpumask_set_cpu(cpu, &affinitymask); > irq_set_affinity(bc->irq, &affinitymask) > } yeah. but i think you can use the cpumask in struct clock_event_device. -- Thanks, Jacob ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] time : pass broadcast device parameter 2013-02-21 22:01 ` [PATCH 1/2] time : pass broadcast device parameter Daniel Lezcano 2013-02-21 22:01 ` [PATCH 2/2][RFC] time : set broadcast irq affinity Daniel Lezcano @ 2013-02-26 8:45 ` Viresh Kumar 2013-02-26 11:30 ` Daniel Lezcano 2013-02-26 11:31 ` Daniel Lezcano 1 sibling, 2 replies; 18+ messages in thread From: Viresh Kumar @ 2013-02-26 8:45 UTC (permalink / raw) To: Daniel Lezcano Cc: tglx, linux-kernel, linux-arm-kernel, fweisbec, linaro-kernel, linux-pm On 22 February 2013 03:31, Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > The broadcast timer could be passed as parameter to the function > instead of using again tick_broadcast_device.evtdev which was > previously used in the caller function. > > Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> I know you are going for another round with this patchset and was just trying v1. I did my tests on ARM Vexpress - TC2, big.LITTLE Arch. Tested-by: Viresh Kumar <viresh.kumar@linaro.org> ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] time : pass broadcast device parameter 2013-02-26 8:45 ` [PATCH 1/2] time : pass broadcast device parameter Viresh Kumar @ 2013-02-26 11:30 ` Daniel Lezcano 2013-02-26 11:31 ` Daniel Lezcano 1 sibling, 0 replies; 18+ messages in thread From: Daniel Lezcano @ 2013-02-26 11:30 UTC (permalink / raw) To: Viresh Kumar Cc: tglx, linux-kernel, linux-arm-kernel, fweisbec, linaro-kernel, linux-pm On 02/26/2013 09:45 AM, Viresh Kumar wrote: > On 22 February 2013 03:31, Daniel Lezcano <daniel.lezcano@linaro.org> wrote: >> The broadcast timer could be passed as parameter to the function >> instead of using again tick_broadcast_device.evtdev which was >> previously used in the caller function. >> >> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> > > I know you are going for another round with this patchset and was just > trying v1. > > I did my tests on ARM Vexpress - TC2, big.LITTLE Arch. > > Tested-by: Viresh Kumar <viresh.kumar@linaro.org> Thanks Viresh for testing. -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] time : pass broadcast device parameter 2013-02-26 8:45 ` [PATCH 1/2] time : pass broadcast device parameter Viresh Kumar 2013-02-26 11:30 ` Daniel Lezcano @ 2013-02-26 11:31 ` Daniel Lezcano 2013-02-26 12:14 ` Viresh Kumar 1 sibling, 1 reply; 18+ messages in thread From: Daniel Lezcano @ 2013-02-26 11:31 UTC (permalink / raw) To: Viresh Kumar Cc: tglx, linux-kernel, linux-arm-kernel, fweisbec, linaro-kernel, linux-pm On 02/26/2013 09:45 AM, Viresh Kumar wrote: > On 22 February 2013 03:31, Daniel Lezcano <daniel.lezcano@linaro.org> wrote: >> The broadcast timer could be passed as parameter to the function >> instead of using again tick_broadcast_device.evtdev which was >> previously used in the caller function. >> >> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> > > I know you are going for another round with this patchset and was just > trying v1. > > I did my tests on ARM Vexpress - TC2, big.LITTLE Arch. > > Tested-by: Viresh Kumar <viresh.kumar@linaro.org> Oh, by the way, could send me the patch to set the flag to the timer device ? I will include it to the patchset. Thanks -- Daniel -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] time : pass broadcast device parameter 2013-02-26 11:31 ` Daniel Lezcano @ 2013-02-26 12:14 ` Viresh Kumar 0 siblings, 0 replies; 18+ messages in thread From: Viresh Kumar @ 2013-02-26 12:14 UTC (permalink / raw) To: Daniel Lezcano Cc: tglx, linux-kernel, linux-arm-kernel, fweisbec, linaro-kernel, linux-pm [-- Attachment #1: Type: text/plain, Size: 1676 bytes --] On 26 February 2013 17:01, Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > Oh, by the way, could send me the patch to set the flag to the timer > device ? I will include it to the patchset. Sure. Find it attached too as gmail may break it. commit 14422c760bb5b2485867f3efb7842d296081ad86 Author: Viresh Kumar <viresh.kumar@linaro.org> Date: Fri Feb 22 12:42:39 2013 +0530 ARM/timer-sp: Set dynamic irq affinity When a cpu goes to a deep idle state where its local timer is shutdown, it notifies the time frame work to use the broadcast timer instead. Unfortunately, the broadcast device could wake up any CPU, including an idle one which is not concerned by the wake up at all. This implies, in the worst case, an idle CPU will wake up to send an IPI to another idle cpu. This patch fixes this for ARM platforms using timer-sp, by setting CLOCK_EVT_FEAT_DYNIRQ feature. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- arch/arm/common/timer-sp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index 9d2d3ba..ae3c0f9 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c @@ -158,7 +158,8 @@ static int sp804_set_next_event(unsigned long next, } static struct clock_event_device sp804_clockevent = { - .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, + .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | + CLOCK_EVT_FEAT_DYNIRQ, .set_mode = sp804_set_mode, .set_next_event = sp804_set_next_event, .rating = 300, [-- Attachment #2: 0001-ARM-timer-sp-Set-dynamic-irq-affinity.patch --] [-- Type: application/octet-stream, Size: 1493 bytes --] From 14422c760bb5b2485867f3efb7842d296081ad86 Mon Sep 17 00:00:00 2001 Message-Id: <14422c760bb5b2485867f3efb7842d296081ad86.1361880827.git.viresh.kumar@linaro.org> From: Viresh Kumar <viresh.kumar@linaro.org> Date: Fri, 22 Feb 2013 12:42:39 +0530 Subject: [PATCH] ARM/timer-sp: Set dynamic irq affinity When a cpu goes to a deep idle state where its local timer is shutdown, it notifies the time frame work to use the broadcast timer instead. Unfortunately, the broadcast device could wake up any CPU, including an idle one which is not concerned by the wake up at all. This implies, in the worst case, an idle CPU will wake up to send an IPI to another idle cpu. This patch fixes this for ARM platforms using timer-sp, by setting CLOCK_EVT_FEAT_DYNIRQ feature. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- arch/arm/common/timer-sp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index 9d2d3ba..ae3c0f9 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c @@ -158,7 +158,8 @@ static int sp804_set_next_event(unsigned long next, } static struct clock_event_device sp804_clockevent = { - .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, + .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | + CLOCK_EVT_FEAT_DYNIRQ, .set_mode = sp804_set_mode, .set_next_event = sp804_set_next_event, .rating = 300, -- 1.7.12.rc2.18.g61b472e ^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2013-02-26 12:14 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-02-19 18:02 [resend] Timer broadcast question Daniel Lezcano 2013-02-19 18:10 ` Thomas Gleixner 2013-02-19 18:21 ` Daniel Lezcano 2013-02-19 22:46 ` Andy Lutomirski 2013-02-20 10:09 ` Thomas Gleixner 2013-02-21 6:19 ` Santosh Shilimkar 2013-02-21 9:01 ` Daniel Lezcano 2013-02-21 9:14 ` Santosh Shilimkar 2013-02-21 22:01 ` [PATCH 1/2] time : pass broadcast device parameter Daniel Lezcano 2013-02-21 22:01 ` [PATCH 2/2][RFC] time : set broadcast irq affinity Daniel Lezcano 2013-02-22 17:55 ` Jacob Pan 2013-02-22 18:45 ` Thomas Gleixner 2013-02-25 22:50 ` Daniel Lezcano 2013-02-25 23:00 ` Jacob Pan 2013-02-26 8:45 ` [PATCH 1/2] time : pass broadcast device parameter Viresh Kumar 2013-02-26 11:30 ` Daniel Lezcano 2013-02-26 11:31 ` Daniel Lezcano 2013-02-26 12:14 ` Viresh Kumar
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).