Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66c48107 authored by Arve Hjønnevåg's avatar Arve Hjønnevåg Committed by Greg Kroah-Hartman
Browse files

staging: android-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.

CC: Arve Hjønnevåg <arve@android.com>
CC: Android Kernel Team <kernel-team@android.com>
Change-Id: If379f8dd92b0bdb3173bd8d057adfe0dc1d15259
Signed-off-by: default avatarArve Hjønnevåg <arve@android.com>
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 58a38ff3
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -119,12 +119,15 @@ static void alarm_enqueue_locked(struct android_alarm *alarm)
	struct rb_node *parent = NULL;
	struct android_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);
@@ -144,10 +147,10 @@ static void alarm_enqueue_locked(struct android_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);