aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorRichard Larocque <rlarocque@google.com>2014-09-09 21:31:03 -0400
committerJohn Stultz <john.stultz@linaro.org>2014-09-12 16:59:11 -0400
commite86fea764991e00a03ff1e56409ec9cacdbda4c9 (patch)
treef12edeca14a07b086642c369cbb45dae112dd14d /kernel
parentd78c9300c51d6ceed9f6d078d4e9366f259de28c (diff)
alarmtimer: Return relative times in timer_gettime
Returns the time remaining for an alarm timer, rather than the time at which it is scheduled to expire. If the timer has already expired or it is not currently scheduled, the it_value's members are set to zero. This new behavior matches that of the other posix-timers and the POSIX specifications. This is a change in user-visible behavior, and may break existing applications. Hopefully, few users rely on the old incorrect behavior. Cc: stable@vger.kernel.org Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@kernel.org> Cc: Richard Cochran <richardcochran@gmail.com> Cc: Prarit Bhargava <prarit@redhat.com> Cc: Sharvil Nanavati <sharvil@google.com> Signed-off-by: Richard Larocque <rlarocque@google.com> [jstultz: minor style tweak] Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/time/alarmtimer.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 4aec4a457431..b4bce62e47b2 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -541,18 +541,22 @@ static int alarm_timer_create(struct k_itimer *new_timer)
541 * @new_timer: k_itimer pointer 541 * @new_timer: k_itimer pointer
542 * @cur_setting: itimerspec data to fill 542 * @cur_setting: itimerspec data to fill
543 * 543 *
544 * Copies the itimerspec data out from the k_itimer 544 * Copies out the current itimerspec data
545 */ 545 */
546static void alarm_timer_get(struct k_itimer *timr, 546static void alarm_timer_get(struct k_itimer *timr,
547 struct itimerspec *cur_setting) 547 struct itimerspec *cur_setting)
548{ 548{
549 memset(cur_setting, 0, sizeof(struct itimerspec)); 549 ktime_t relative_expiry_time =
550 alarm_expires_remaining(&(timr->it.alarm.alarmtimer));
550 551
551 cur_setting->it_interval = 552 if (ktime_to_ns(relative_expiry_time) > 0) {
552 ktime_to_timespec(timr->it.alarm.interval); 553 cur_setting->it_value = ktime_to_timespec(relative_expiry_time);
553 cur_setting->it_value = 554 } else {
554 ktime_to_timespec(timr->it.alarm.alarmtimer.node.expires); 555 cur_setting->it_value.tv_sec = 0;
555 return; 556 cur_setting->it_value.tv_nsec = 0;
557 }
558
559 cur_setting->it_interval = ktime_to_timespec(timr->it.alarm.interval);
556} 560}
557 561
558/** 562/**