Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : #ifndef _LINUX_TIMERQUEUE_H 3 : #define _LINUX_TIMERQUEUE_H 4 : 5 : #include <linux/rbtree.h> 6 : #include <linux/ktime.h> 7 : 8 : 9 : struct timerqueue_node { 10 : struct rb_node node; 11 : ktime_t expires; 12 : }; 13 : 14 : struct timerqueue_head { 15 : struct rb_root_cached rb_root; 16 : }; 17 : 18 : 19 : extern bool timerqueue_add(struct timerqueue_head *head, 20 : struct timerqueue_node *node); 21 : extern bool timerqueue_del(struct timerqueue_head *head, 22 : struct timerqueue_node *node); 23 : extern struct timerqueue_node *timerqueue_iterate_next( 24 : struct timerqueue_node *node); 25 : 26 : /** 27 : * timerqueue_getnext - Returns the timer with the earliest expiration time 28 : * 29 : * @head: head of timerqueue 30 : * 31 : * Returns a pointer to the timer node that has the earliest expiration time. 32 : */ 33 : static inline 34 : struct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head) 35 : { 36 960 : struct rb_node *leftmost = rb_first_cached(&head->rb_root); 37 : 38 960 : return rb_entry_safe(leftmost, struct timerqueue_node, node); 39 : } 40 : 41 : static inline void timerqueue_init(struct timerqueue_node *node) 42 : { 43 1073 : RB_CLEAR_NODE(&node->node); 44 : } 45 : 46 : static inline bool timerqueue_node_queued(struct timerqueue_node *node) 47 : { 48 0 : return !RB_EMPTY_NODE(&node->node); 49 : } 50 : 51 : static inline bool timerqueue_node_expires(struct timerqueue_node *node) 52 : { 53 : return node->expires; 54 : } 55 : 56 : static inline void timerqueue_init_head(struct timerqueue_head *head) 57 : { 58 10 : head->rb_root = RB_ROOT_CACHED; 59 : } 60 : #endif /* _LINUX_TIMERQUEUE_H */