diff options
author | Arve Hjønnevåg <arve@android.com> | 2011-01-07 19:00:01 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2011-06-14 09:09:45 -0700 |
commit | 2cd24680f6fa2c06feede9d2f69566de378f4519 (patch) | |
tree | 43009ce92ff0900185c5a2a02b1b0d10c5a83cf4 | |
parent | 677ef29f71cba2017015c5a804e931314dc71df6 (diff) | |
download | kernel_samsung_tuna-2cd24680f6fa2c06feede9d2f69566de378f4519.zip kernel_samsung_tuna-2cd24680f6fa2c06feede9d2f69566de378f4519.tar.gz kernel_samsung_tuna-2cd24680f6fa2c06feede9d2f69566de378f4519.tar.bz2 |
rtc: alarm: Update hrtimer if alarm at the head of the queue is reprogrammed
If an alarm was restarted with a value that moved it away from the head
of a queue, the hrtimer would not be updated. This would cause unnecessary
wakeups.
Change-Id: If379f8dd92b0bdb3173bd8d057adfe0dc1d15259
Signed-off-by: Arve Hjønnevåg <arve@android.com>
-rw-r--r-- | drivers/rtc/alarm.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/rtc/alarm.c b/drivers/rtc/alarm.c index 084ef64..e0e98dd 100644 --- a/drivers/rtc/alarm.c +++ b/drivers/rtc/alarm.c @@ -109,12 +109,15 @@ static void alarm_enqueue_locked(struct alarm *alarm) struct rb_node *parent = NULL; struct alarm *entry; int leftmost = 1; + bool was_first = false; pr_alarm(FLOW, "added alarm, type %d, func %pF at %lld\n", alarm->type, alarm->function, ktime_to_ns(alarm->expires)); - if (base->first == &alarm->node) + if (base->first == &alarm->node) { base->first = rb_next(&alarm->node); + was_first = true; + } if (!RB_EMPTY_NODE(&alarm->node)) { rb_erase(&alarm->node, &base->alarms); RB_CLEAR_NODE(&alarm->node); @@ -134,10 +137,10 @@ static void alarm_enqueue_locked(struct alarm *alarm) leftmost = 0; } } - if (leftmost) { + if (leftmost) base->first = &alarm->node; - update_timer_locked(base, false); - } + if (leftmost || was_first) + update_timer_locked(base, was_first); rb_link_node(&alarm->node, parent, link); rb_insert_color(&alarm->node, &base->alarms); |