Re: [PATCH] ARM: timer: Shutdown clock event device when stopping local timer

2013-03-31 Thread Ning Jiang
2013/3/30 Ning Jiang ning.n.ji...@gmail.com:
 2013/3/30 Russell King - ARM Linux li...@arm.linux.org.uk:
 On Sat, Mar 30, 2013 at 05:57:38PM +0800, Ning Jiang wrote:
 2013/3/30 Stephen Boyd sb...@codeaurora.org:
  On 03/29/13 02:24, ning.n.ji...@gmail.com wrote:
  From: Ning Jiang ning.n.ji...@gmail.com
 
  Currently there are two problems when we try to stop local timer.
  First, it calls set_mode function directly so mode state is not
  updated for the clock event device. Second, it makes the device
  unused instead of shutdown.
 
  What device is this a problem on? I believe this only matters to drivers
  which enable their timer in their set_next_event() callback? But even
  then, does anything actually happen because the interrupt should have
  been disabled in the local timer stop callback.
 

 Right. Drivers which enable timer in set_next_event() will have this 
 problem.
 It will not have functional problem in my case. But my device cannot enter
 low power mode with a pending interrupt even if it is disabled.

 You're not telling us what you have discovered.  How does set_next_event()
 get called after we've set the mode to UNUSED in the current code?

 In the current code we did not set the mode to UNUSED but only call
 set_mode callback function for the clock event device. This normally
 disables current clock event device. The dying CPU eventually will
 switch to idle thread, call tick_nohz_idle_enter(), try to cancel the
 sched_timer and reprogram the next event. Then set_next_event() gets
 called. The call stack will be like:

 tick_nohz_idle_enter
   - __tick_nohz_idle_enter
 - tick_nohz_stop_sched_tick
   - hrtimer_cancel
 - hrtimer_try_to_cancel
   - remove_hrtimer
 - __remove_hrtimer
   - hrtimer_force_reprogram
 - tick_program_event
   - clockevents_program_event
 - set_next_event

 In set_next_event() we'll re-enable and re-program the clock event device.

I think there are two problems here:
1. We should use clockevents_set_mode() instead of calling set_mode
callback directly. This is the issue my patch was trying to fix.
2. We shouldn't program a clock event device for a dying CPU anyway. I
can submit another patch if agreed.
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: GENERIC_GPIO considered deprecated

2013-03-31 Thread Alexandre Courbot
Hi Romain,

On Sat, Mar 30, 2013 at 3:07 PM, Romain Naour romain.na...@openwide.fr wrote:
 Hi Alex,

 When I read your mail, I was surprised that you were speaking about GPIOs, my 
 pathes for samsung CPUs are intended for timer sub-system.

 As you can see in this thread, when I send my patches ARM: S3C24XX: Add 
 samsung-time support for s3c24xx and Add samsung-time support for s5pc100. 
 They didn't add select GENERIC_GPIO.
 http://thread.gmane.org/gmane.linux.kernel.samsung-soc/13432/focus=14980
 http://thread.gmane.org/gmane.linux.kernel.samsung-soc/13432/focus=14982

 There is something wrong with the commit, I see that select GENERIC_GPIO 
 was added in my patches by mistake.

 I recommend you to speak directly with samsung's kernel maintainer that I CC 
 in this mail.

Indeed, it seems like these select GENERIC_GPIO have been added
during the merge of your patches, since I can see the line is here in
your patch (but not added by it). Kim, on the current next there are
two of these select GENERIC_GPIO that are added from your branch,
could you amend the patches that adds them such as they get changed
into select ARCH_REQUIRE_GPIOLIB instead? You can grep for select
GENERIC_GPIO in arch/arm to find the offending lines. We are removing
GENERIC_GPIO and this work cannot be merged until you do this since it
would break ARM builds. Thanks!

Alex.
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: timer: Shutdown clock event device when stopping local timer

2013-03-31 Thread Daniel Lezcano
On 03/29/2013 10:24 AM, ning.n.ji...@gmail.com wrote:
 From: Ning Jiang ning.n.ji...@gmail.com
 
 Currently there are two problems when we try to stop local timer.
 First, it calls set_mode function directly so mode state is not
 updated for the clock event device. Second, it makes the device
 unused instead of shutdown.
 
 A subtle error will happen because of it. When a cpu is plugged out
 it will stop the local timer. It will call tick_nohz_idle_enter()
 in idle thread afterwards. It will cancel the sched timer and try
 to reprogram the next event. This is wrong since the local timer
 is supposed to be stopped.
 
 The right way to stop the local timer is to shutdown it by calling
 clockevents_set_mode(). Thus when we try to reprogram the clock
 event device, it will return directly without doing anything since
 the clock mode is CLOCK_EVT_MODE_SHUTDOWN.
 
 Signed-off-by: Ning Jiang ning.n.ji...@gmail.com
 ---
  arch/arm/kernel/smp_twd.c|2 +-
  arch/arm/mach-exynos/mct.c   |2 +-
  arch/arm/mach-msm/timer.c|2 +-
  drivers/clocksource/arm_arch_timer.c |2 +-
  drivers/clocksource/time-armada-370-xp.c |2 +-
  5 files changed, 5 insertions(+), 5 deletions(-)
 
 diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
 index 3f25650..c1d4ab4 100644
 --- a/arch/arm/kernel/smp_twd.c
 +++ b/arch/arm/kernel/smp_twd.c
 @@ -92,7 +92,7 @@ static int twd_timer_ack(void)
  
  static void twd_timer_stop(struct clock_event_device *clk)
  {
 - twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk);
 + clockevents_set_mode(clk, CLOCK_EVT_MODE_SHUTDOWN);
   disable_percpu_irq(clk-irq);

Wouldn't be clockevents_shutdown more adequate here ? The next event
will be also set.



-- 
 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

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: timer: Shutdown clock event device when stopping local timer

2013-03-31 Thread Daniel Lezcano
On 03/29/2013 10:24 AM, ning.n.ji...@gmail.com wrote:
 From: Ning Jiang ning.n.ji...@gmail.com
 
 Currently there are two problems when we try to stop local timer.
 First, it calls set_mode function directly so mode state is not
 updated for the clock event device. Second, it makes the device
 unused instead of shutdown.
 
 A subtle error will happen because of it. When a cpu is plugged out
 it will stop the local timer. It will call tick_nohz_idle_enter()
 in idle thread afterwards. It will cancel the sched timer and try
 to reprogram the next event. This is wrong since the local timer
 is supposed to be stopped.
 
 The right way to stop the local timer is to shutdown it by calling
 clockevents_set_mode(). Thus when we try to reprogram the clock
 event device, it will return directly without doing anything since
 the clock mode is CLOCK_EVT_MODE_SHUTDOWN.
 
 Signed-off-by: Ning Jiang ning.n.ji...@gmail.com
 ---


Don't you see a kernel BUG with this patch ?

In the clockevents code, there is:

/**
 * clockevents_notify - notification about relevant events
 */
void clockevents_notify(unsigned long reason, void *arg)
{
...
case CLOCK_EVT_NOTIFY_CPU_DEAD:
...
cpu = *((int *)arg);
list_for_each_entry_safe(dev, tmp, clockevent_devices,
list) {
   if (cpumask_test_cpu(cpu, dev-cpumask) 
cpumask_weight(dev-cpumask) == 1 
!tick_is_broadcast_device(dev)) {
BUG_ON(dev-mode !=
CLOCK_EVT_MODE_UNUSED);

^^

list_del(dev-list);
}
}
break;
...
}

This is called triggered from hrtimer_cpu_notify with the CPU_DEAD event.


-- 
 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

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: timer: Shutdown clock event device when stopping local timer

2013-03-31 Thread Ning Jiang
2013/4/1 Daniel Lezcano daniel.lezc...@linaro.org:
 On 03/29/2013 10:24 AM, ning.n.ji...@gmail.com wrote:
 From: Ning Jiang ning.n.ji...@gmail.com

 Currently there are two problems when we try to stop local timer.
 First, it calls set_mode function directly so mode state is not
 updated for the clock event device. Second, it makes the device
 unused instead of shutdown.

 A subtle error will happen because of it. When a cpu is plugged out
 it will stop the local timer. It will call tick_nohz_idle_enter()
 in idle thread afterwards. It will cancel the sched timer and try
 to reprogram the next event. This is wrong since the local timer
 is supposed to be stopped.

 The right way to stop the local timer is to shutdown it by calling
 clockevents_set_mode(). Thus when we try to reprogram the clock
 event device, it will return directly without doing anything since
 the clock mode is CLOCK_EVT_MODE_SHUTDOWN.

 Signed-off-by: Ning Jiang ning.n.ji...@gmail.com
 ---
  arch/arm/kernel/smp_twd.c|2 +-
  arch/arm/mach-exynos/mct.c   |2 +-
  arch/arm/mach-msm/timer.c|2 +-
  drivers/clocksource/arm_arch_timer.c |2 +-
  drivers/clocksource/time-armada-370-xp.c |2 +-
  5 files changed, 5 insertions(+), 5 deletions(-)

 diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
 index 3f25650..c1d4ab4 100644
 --- a/arch/arm/kernel/smp_twd.c
 +++ b/arch/arm/kernel/smp_twd.c
 @@ -92,7 +92,7 @@ static int twd_timer_ack(void)

  static void twd_timer_stop(struct clock_event_device *clk)
  {
 - twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk);
 + clockevents_set_mode(clk, CLOCK_EVT_MODE_SHUTDOWN);
   disable_percpu_irq(clk-irq);

 Wouldn't be clockevents_shutdown more adequate here ? The next event
 will be also set.

You're right. clockevents_shutdown seems more appropriate here. I'll
submit a revised patch for it.

 --
  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

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] ARM: timer: Shutdown clock event device when stopping local timer

2013-03-31 Thread Ning Jiang
2013/4/1 Daniel Lezcano daniel.lezc...@linaro.org:
 On 03/29/2013 10:24 AM, ning.n.ji...@gmail.com wrote:
 From: Ning Jiang ning.n.ji...@gmail.com

 Currently there are two problems when we try to stop local timer.
 First, it calls set_mode function directly so mode state is not
 updated for the clock event device. Second, it makes the device
 unused instead of shutdown.

 A subtle error will happen because of it. When a cpu is plugged out
 it will stop the local timer. It will call tick_nohz_idle_enter()
 in idle thread afterwards. It will cancel the sched timer and try
 to reprogram the next event. This is wrong since the local timer
 is supposed to be stopped.

 The right way to stop the local timer is to shutdown it by calling
 clockevents_set_mode(). Thus when we try to reprogram the clock
 event device, it will return directly without doing anything since
 the clock mode is CLOCK_EVT_MODE_SHUTDOWN.

 Signed-off-by: Ning Jiang ning.n.ji...@gmail.com
 ---


 Don't you see a kernel BUG with this patch ?

 In the clockevents code, there is:

 /**
  * clockevents_notify - notification about relevant events
  */
 void clockevents_notify(unsigned long reason, void *arg)
 {
 ...
 case CLOCK_EVT_NOTIFY_CPU_DEAD:
 ...
 cpu = *((int *)arg);
 list_for_each_entry_safe(dev, tmp, clockevent_devices,
 list) {
if (cpumask_test_cpu(cpu, dev-cpumask) 
 cpumask_weight(dev-cpumask) == 1 
 !tick_is_broadcast_device(dev)) {
 BUG_ON(dev-mode !=
 CLOCK_EVT_MODE_UNUSED);

 ^^

 list_del(dev-list);
 }
 }
 break;
 ...
 }

 This is called triggered from hrtimer_cpu_notify with the CPU_DEAD event.


The clockevents_do_notify() in clockevents_notify() will call
tick_notify() which will call tick_shutdown() in turn. tick_shutdown()
will set clock event device mode to UNUSED. So no panic afterwards.

void clockevents_notify(unsigned long reason, void *arg)
{
...
clockevents_do_notify(reason, arg);

switch (reason) {
case CLOCK_EVT_NOTIFY_CPU_DEAD:
...
list_for_each_entry_safe(dev, tmp, clockevent_devices, list) {
if (cpumask_test_cpu(cpu, dev-cpumask) 
cpumask_weight(dev-cpumask) == 1 
!tick_is_broadcast_device(dev)) {
BUG_ON(dev-mode != CLOCK_EVT_MODE_UNUSED);
list_del(dev-list);
}
}

}
raw_spin_unlock_irqrestore(clockevents_lock, flags);
}
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html