xref: /linux-6.15/include/linux/timerqueue.h (revision e84c6003)
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 Gleixner struct 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 Stultz static 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 Gleixner static 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 Stultz static 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