[PATCH 3.2 049/102] alarmtimer: Lock k_itimer during timer callback
3.2.64-rc1 review patch. If anyone has any objections, please let me know. -- From: Richard Larocque commit 474e941bed9262f5fa2394f9a4a67e24499e5926 upstream. Locks the k_itimer's it_lock member when handling the alarm timer's expiry callback. The regular posix timers defined in posix-timers.c have this lock held during timout processing because their callbacks are routed through posix_timer_fn(). The alarm timers follow a different path, so they ought to grab the lock somewhere else. Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Richard Cochran Cc: Prarit Bhargava Cc: Sharvil Nanavati Signed-off-by: Richard Larocque Signed-off-by: John Stultz Signed-off-by: Ben Hutchings --- kernel/time/alarmtimer.c | 10 -- 1 file changed, 8 insertions(+), 2 deletions(-) --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -448,8 +448,12 @@ static enum alarmtimer_type clock2alarm( static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, ktime_t now) { + unsigned long flags; struct k_itimer *ptr = container_of(alarm, struct k_itimer, it.alarm.alarmtimer); + enum alarmtimer_restart result = ALARMTIMER_NORESTART; + + spin_lock_irqsave(>it_lock, flags); if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) { if (posix_timer_event(ptr, 0) != 0) ptr->it_overrun++; @@ -459,9 +463,11 @@ static enum alarmtimer_restart alarm_han if (ptr->it.alarm.interval.tv64) { ptr->it_overrun += alarm_forward(alarm, now, ptr->it.alarm.interval); - return ALARMTIMER_RESTART; + result = ALARMTIMER_RESTART; } - return ALARMTIMER_NORESTART; + spin_unlock_irqrestore(>it_lock, flags); + + return result; } /** -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 3.2 049/102] alarmtimer: Lock k_itimer during timer callback
3.2.64-rc1 review patch. If anyone has any objections, please let me know. -- From: Richard Larocque rlaroc...@google.com commit 474e941bed9262f5fa2394f9a4a67e24499e5926 upstream. Locks the k_itimer's it_lock member when handling the alarm timer's expiry callback. The regular posix timers defined in posix-timers.c have this lock held during timout processing because their callbacks are routed through posix_timer_fn(). The alarm timers follow a different path, so they ought to grab the lock somewhere else. Cc: Thomas Gleixner t...@linutronix.de Cc: Ingo Molnar mi...@kernel.org Cc: Richard Cochran richardcoch...@gmail.com Cc: Prarit Bhargava pra...@redhat.com Cc: Sharvil Nanavati shar...@google.com Signed-off-by: Richard Larocque rlaroc...@google.com Signed-off-by: John Stultz john.stu...@linaro.org Signed-off-by: Ben Hutchings b...@decadent.org.uk --- kernel/time/alarmtimer.c | 10 -- 1 file changed, 8 insertions(+), 2 deletions(-) --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -448,8 +448,12 @@ static enum alarmtimer_type clock2alarm( static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, ktime_t now) { + unsigned long flags; struct k_itimer *ptr = container_of(alarm, struct k_itimer, it.alarm.alarmtimer); + enum alarmtimer_restart result = ALARMTIMER_NORESTART; + + spin_lock_irqsave(ptr-it_lock, flags); if ((ptr-it_sigev_notify ~SIGEV_THREAD_ID) != SIGEV_NONE) { if (posix_timer_event(ptr, 0) != 0) ptr-it_overrun++; @@ -459,9 +463,11 @@ static enum alarmtimer_restart alarm_han if (ptr-it.alarm.interval.tv64) { ptr-it_overrun += alarm_forward(alarm, now, ptr-it.alarm.interval); - return ALARMTIMER_RESTART; + result = ALARMTIMER_RESTART; } - return ALARMTIMER_NORESTART; + spin_unlock_irqrestore(ptr-it_lock, flags); + + return result; } /** -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/