Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

alarmtimer: Add functions for timerfd support

Add functions needed for hooking up alarmtimer to timerfd:

* alarm_restart: Similar to hrtimer_restart, restart an alarmtimer after
the expires time has already been updated (as with alarm_forward).

* alarm_forward_now: Similar to hrtimer_forward_now, move the expires
time forward to an interval from the current time of the associated clock.

* alarm_start_relative: Start an alarmtimer with an expires time relative to
the current time of the associated clock.

* alarm_expires_remaining: Similar to hrtimer_expires_remaining, return the
amount of time remaining until alarm expiry.

Signed-off-by: Todd Poynor <toddpoynor@google.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>

authored by

Todd Poynor and committed by
John Stultz
6cffe00f 3565184e

+42 -1
+4
include/linux/alarmtimer.h
··· 44 44 void alarm_init(struct alarm *alarm, enum alarmtimer_type type, 45 45 enum alarmtimer_restart (*function)(struct alarm *, ktime_t)); 46 46 int alarm_start(struct alarm *alarm, ktime_t start); 47 + int alarm_start_relative(struct alarm *alarm, ktime_t start); 48 + void alarm_restart(struct alarm *alarm); 47 49 int alarm_try_to_cancel(struct alarm *alarm); 48 50 int alarm_cancel(struct alarm *alarm); 49 51 50 52 u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval); 53 + u64 alarm_forward_now(struct alarm *alarm, ktime_t interval); 54 + ktime_t alarm_expires_remaining(const struct alarm *alarm); 51 55 52 56 /* Provide way to access the rtc device being used by alarmtimers */ 53 57 struct rtc_device *alarmtimer_get_rtcdev(void);
+38 -1
kernel/time/alarmtimer.c
··· 199 199 200 200 } 201 201 202 + ktime_t alarm_expires_remaining(const struct alarm *alarm) 203 + { 204 + struct alarm_base *base = &alarm_bases[alarm->type]; 205 + return ktime_sub(alarm->node.expires, base->gettime()); 206 + } 207 + 202 208 #ifdef CONFIG_RTC_CLASS 203 209 /** 204 210 * alarmtimer_suspend - Suspend time callback ··· 311 305 } 312 306 313 307 /** 314 - * alarm_start - Sets an alarm to fire 308 + * alarm_start - Sets an absolute alarm to fire 315 309 * @alarm: ptr to alarm to set 316 310 * @start: time to run the alarm 317 311 */ ··· 328 322 HRTIMER_MODE_ABS); 329 323 spin_unlock_irqrestore(&base->lock, flags); 330 324 return ret; 325 + } 326 + 327 + /** 328 + * alarm_start_relative - Sets a relative alarm to fire 329 + * @alarm: ptr to alarm to set 330 + * @start: time relative to now to run the alarm 331 + */ 332 + int alarm_start_relative(struct alarm *alarm, ktime_t start) 333 + { 334 + struct alarm_base *base = &alarm_bases[alarm->type]; 335 + 336 + start = ktime_add(start, base->gettime()); 337 + return alarm_start(alarm, start); 338 + } 339 + 340 + void alarm_restart(struct alarm *alarm) 341 + { 342 + struct alarm_base *base = &alarm_bases[alarm->type]; 343 + unsigned long flags; 344 + 345 + spin_lock_irqsave(&base->lock, flags); 346 + hrtimer_set_expires(&alarm->timer, alarm->node.expires); 347 + hrtimer_restart(&alarm->timer); 348 + alarmtimer_enqueue(base, alarm); 349 + spin_unlock_irqrestore(&base->lock, flags); 331 350 } 332 351 333 352 /** ··· 425 394 return overrun; 426 395 } 427 396 397 + u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) 398 + { 399 + struct alarm_base *base = &alarm_bases[alarm->type]; 400 + 401 + return alarm_forward(alarm, base->gettime(), interval); 402 + } 428 403 429 404 430 405