OSDN Git Service

rtc: alarm: Update hrtimer if alarm at the head of the queue is reprogrammed
authorArve Hjønnevåg <arve@android.com>
Sat, 8 Jan 2011 03:00:01 +0000 (19:00 -0800)
committerBrian Swetland <swetland@google.com>
Tue, 29 Mar 2011 20:58:02 +0000 (13:58 -0700)
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>
drivers/rtc/alarm.c

index 084ef64..e0e98dd 100644 (file)
@@ -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);