1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21f5a2479SJohn Stultz #ifndef _LINUX_TIMERQUEUE_H 31f5a2479SJohn Stultz #define _LINUX_TIMERQUEUE_H 41f5a2479SJohn Stultz 51f5a2479SJohn Stultz #include <linux/rbtree.h> 6*eee51b0aSKent Overstreet #include <linux/timerqueue_types.h> 71f5a2479SJohn Stultz 8c320642eSThomas Gleixner extern bool timerqueue_add(struct timerqueue_head *head, 91f5a2479SJohn Stultz struct timerqueue_node *node); 10c320642eSThomas Gleixner extern bool timerqueue_del(struct timerqueue_head *head, 111f5a2479SJohn Stultz struct timerqueue_node *node); 121f5a2479SJohn Stultz extern struct timerqueue_node *timerqueue_iterate_next( 131f5a2479SJohn Stultz struct timerqueue_node *node); 141f5a2479SJohn Stultz 1545f74264SThomas Gleixner /** 1625985edcSLucas De Marchi * timerqueue_getnext - Returns the timer with the earliest expiration time 1745f74264SThomas Gleixner * 1845f74264SThomas Gleixner * @head: head of timerqueue 1945f74264SThomas Gleixner * 20511885d7SDavidlohr Bueso * Returns a pointer to the timer node that has the earliest expiration time. 2145f74264SThomas Gleixner */ 2245f74264SThomas Gleixner static inline timerqueue_getnext(struct timerqueue_head * head)2345f74264SThomas Gleixnerstruct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head) 2445f74264SThomas Gleixner { 25511885d7SDavidlohr Bueso struct rb_node *leftmost = rb_first_cached(&head->rb_root); 26511885d7SDavidlohr Bueso 272f117484SBarnabás Pőcze return rb_entry_safe(leftmost, struct timerqueue_node, node); 2845f74264SThomas Gleixner } 2945f74264SThomas Gleixner timerqueue_init(struct timerqueue_node * node)301f5a2479SJohn Stultzstatic inline void timerqueue_init(struct timerqueue_node *node) 311f5a2479SJohn Stultz { 324c199a93SMichel Lespinasse RB_CLEAR_NODE(&node->node); 331f5a2479SJohn Stultz } 341f5a2479SJohn Stultz timerqueue_node_queued(struct timerqueue_node * node)3560bda037SThomas Gleixnerstatic inline bool timerqueue_node_queued(struct timerqueue_node *node) 3660bda037SThomas Gleixner { 3760bda037SThomas Gleixner return !RB_EMPTY_NODE(&node->node); 3860bda037SThomas Gleixner } 3960bda037SThomas Gleixner timerqueue_init_head(struct timerqueue_head * head)401f5a2479SJohn Stultzstatic inline void timerqueue_init_head(struct timerqueue_head *head) 411f5a2479SJohn Stultz { 42511885d7SDavidlohr Bueso head->rb_root = RB_ROOT_CACHED; 431f5a2479SJohn Stultz } 441f5a2479SJohn Stultz #endif /* _LINUX_TIMERQUEUE_H */ 45