Commit a1b01afa authored by Richard Larocque's avatar Richard Larocque Committed by Ben Hutchings

alarmtimer: Return relative times in timer_gettime

commit e86fea76 upstream.

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: 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: default avatarRichard Larocque <rlarocque@google.com>
[jstultz: minor style tweak]
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
[bwh: Backported to 3.2: Add definition of alarm_expires_remaining() from
 commit 6cffe00f ('alarmtimer: Add functions for timerfd support')]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent d8aaaebb
...@@ -48,6 +48,7 @@ int alarm_try_to_cancel(struct alarm *alarm); ...@@ -48,6 +48,7 @@ int alarm_try_to_cancel(struct alarm *alarm);
int alarm_cancel(struct alarm *alarm); int alarm_cancel(struct alarm *alarm);
u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval); u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
ktime_t alarm_expires_remaining(const struct alarm *alarm);
/* /*
* A alarmtimer is active, when it is enqueued into timerqueue or the * A alarmtimer is active, when it is enqueued into timerqueue or the
......
...@@ -226,6 +226,12 @@ static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer) ...@@ -226,6 +226,12 @@ static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer)
} }
ktime_t alarm_expires_remaining(const struct alarm *alarm)
{
struct alarm_base *base = &alarm_bases[alarm->type];
return ktime_sub(alarm->node.expires, base->gettime());
}
#ifdef CONFIG_RTC_CLASS #ifdef CONFIG_RTC_CLASS
/** /**
* alarmtimer_suspend - Suspend time callback * alarmtimer_suspend - Suspend time callback
...@@ -519,18 +525,22 @@ static int alarm_timer_create(struct k_itimer *new_timer) ...@@ -519,18 +525,22 @@ static int alarm_timer_create(struct k_itimer *new_timer)
* @new_timer: k_itimer pointer * @new_timer: k_itimer pointer
* @cur_setting: itimerspec data to fill * @cur_setting: itimerspec data to fill
* *
* Copies the itimerspec data out from the k_itimer * Copies out the current itimerspec data
*/ */
static void alarm_timer_get(struct k_itimer *timr, static void alarm_timer_get(struct k_itimer *timr,
struct itimerspec *cur_setting) struct itimerspec *cur_setting)
{ {
memset(cur_setting, 0, sizeof(struct itimerspec)); ktime_t relative_expiry_time =
alarm_expires_remaining(&(timr->it.alarm.alarmtimer));
if (ktime_to_ns(relative_expiry_time) > 0) {
cur_setting->it_value = ktime_to_timespec(relative_expiry_time);
} else {
cur_setting->it_value.tv_sec = 0;
cur_setting->it_value.tv_nsec = 0;
}
cur_setting->it_interval = cur_setting->it_interval = ktime_to_timespec(timr->it.alarm.interval);
ktime_to_timespec(timr->it.alarm.interval);
cur_setting->it_value =
ktime_to_timespec(timr->it.alarm.alarmtimer.node.expires);
return;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment