timerqueue: Let timerqueue_add/del return information
The hrtimer code is interested whether the added timer is the first one to expire and whether the removed timer was the last one in the tree. The add/del routines have that information already. So we can return it right away instead of reevaluating it at the call site. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Preeti U Murthy <preeti@linux.vnet.ibm.com> Cc: Viresh Kumar <viresh.kumar@linaro.org> Cc: Marcelo Tosatti <mtosatti@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: John Stultz <john.stultz@linaro.org> Link: http://lkml.kernel.org/r/20150414203501.579063647@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
b8e38413ac
commit
c320642e1c
@ -16,10 +16,10 @@ struct timerqueue_head {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern void timerqueue_add(struct timerqueue_head *head,
|
extern bool timerqueue_add(struct timerqueue_head *head,
|
||||||
struct timerqueue_node *node);
|
struct timerqueue_node *node);
|
||||||
extern void timerqueue_del(struct timerqueue_head *head,
|
extern bool timerqueue_del(struct timerqueue_head *head,
|
||||||
struct timerqueue_node *node);
|
struct timerqueue_node *node);
|
||||||
extern struct timerqueue_node *timerqueue_iterate_next(
|
extern struct timerqueue_node *timerqueue_iterate_next(
|
||||||
struct timerqueue_node *node);
|
struct timerqueue_node *node);
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
* Adds the timer node to the timerqueue, sorted by the
|
* Adds the timer node to the timerqueue, sorted by the
|
||||||
* node's expires value.
|
* node's expires value.
|
||||||
*/
|
*/
|
||||||
void timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
|
bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
|
||||||
{
|
{
|
||||||
struct rb_node **p = &head->head.rb_node;
|
struct rb_node **p = &head->head.rb_node;
|
||||||
struct rb_node *parent = NULL;
|
struct rb_node *parent = NULL;
|
||||||
@ -56,8 +56,11 @@ void timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
|
|||||||
rb_link_node(&node->node, parent, p);
|
rb_link_node(&node->node, parent, p);
|
||||||
rb_insert_color(&node->node, &head->head);
|
rb_insert_color(&node->node, &head->head);
|
||||||
|
|
||||||
if (!head->next || node->expires.tv64 < head->next->expires.tv64)
|
if (!head->next || node->expires.tv64 < head->next->expires.tv64) {
|
||||||
head->next = node;
|
head->next = node;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(timerqueue_add);
|
EXPORT_SYMBOL_GPL(timerqueue_add);
|
||||||
|
|
||||||
@ -69,7 +72,7 @@ EXPORT_SYMBOL_GPL(timerqueue_add);
|
|||||||
*
|
*
|
||||||
* Removes the timer node from the timerqueue.
|
* Removes the timer node from the timerqueue.
|
||||||
*/
|
*/
|
||||||
void timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
|
bool timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
|
||||||
{
|
{
|
||||||
WARN_ON_ONCE(RB_EMPTY_NODE(&node->node));
|
WARN_ON_ONCE(RB_EMPTY_NODE(&node->node));
|
||||||
|
|
||||||
@ -82,6 +85,7 @@ void timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
|
|||||||
}
|
}
|
||||||
rb_erase(&node->node, &head->head);
|
rb_erase(&node->node, &head->head);
|
||||||
RB_CLEAR_NODE(&node->node);
|
RB_CLEAR_NODE(&node->node);
|
||||||
|
return head->next != NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(timerqueue_del);
|
EXPORT_SYMBOL_GPL(timerqueue_del);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user