132e29396SVincenzo Frascino /* SPDX-License-Identifier: GPL-2.0 */ 232e29396SVincenzo Frascino #ifndef _LINUX_HRTIMER_DEFS_H 332e29396SVincenzo Frascino #define _LINUX_HRTIMER_DEFS_H 432e29396SVincenzo Frascino 532e29396SVincenzo Frascino #include <linux/ktime.h> 61a4729ecSAnna-Maria Behnsen #include <linux/timerqueue.h> 71a4729ecSAnna-Maria Behnsen #include <linux/seqlock.h> 832e29396SVincenzo Frascino 932e29396SVincenzo Frascino #ifdef CONFIG_HIGH_RES_TIMERS 1032e29396SVincenzo Frascino 1132e29396SVincenzo Frascino /* 1232e29396SVincenzo Frascino * The resolution of the clocks. The resolution value is returned in 1332e29396SVincenzo Frascino * the clock_getres() system call to give application programmers an 1432e29396SVincenzo Frascino * idea of the (in)accuracy of timers. Timer values are rounded up to 1532e29396SVincenzo Frascino * this resolution values. 1632e29396SVincenzo Frascino */ 1732e29396SVincenzo Frascino # define HIGH_RES_NSEC 1 1832e29396SVincenzo Frascino # define KTIME_HIGH_RES (HIGH_RES_NSEC) 1932e29396SVincenzo Frascino # define MONOTONIC_RES_NSEC HIGH_RES_NSEC 2032e29396SVincenzo Frascino # define KTIME_MONOTONIC_RES KTIME_HIGH_RES 2132e29396SVincenzo Frascino 2232e29396SVincenzo Frascino #else 2332e29396SVincenzo Frascino 2432e29396SVincenzo Frascino # define MONOTONIC_RES_NSEC LOW_RES_NSEC 2532e29396SVincenzo Frascino # define KTIME_MONOTONIC_RES KTIME_LOW_RES 2632e29396SVincenzo Frascino 2732e29396SVincenzo Frascino #endif 2832e29396SVincenzo Frascino 291a4729ecSAnna-Maria Behnsen #ifdef CONFIG_64BIT 301a4729ecSAnna-Maria Behnsen # define __hrtimer_clock_base_align ____cacheline_aligned 311a4729ecSAnna-Maria Behnsen #else 321a4729ecSAnna-Maria Behnsen # define __hrtimer_clock_base_align 331a4729ecSAnna-Maria Behnsen #endif 341a4729ecSAnna-Maria Behnsen 351a4729ecSAnna-Maria Behnsen /** 361a4729ecSAnna-Maria Behnsen * struct hrtimer_clock_base - the timer base for a specific clock 371a4729ecSAnna-Maria Behnsen * @cpu_base: per cpu clock base 381a4729ecSAnna-Maria Behnsen * @index: clock type index for per_cpu support when moving a 391a4729ecSAnna-Maria Behnsen * timer to a base on another cpu. 401a4729ecSAnna-Maria Behnsen * @clockid: clock id for per_cpu support 411a4729ecSAnna-Maria Behnsen * @seq: seqcount around __run_hrtimer 421a4729ecSAnna-Maria Behnsen * @running: pointer to the currently running hrtimer 431a4729ecSAnna-Maria Behnsen * @active: red black tree root node for the active timers 441a4729ecSAnna-Maria Behnsen * @get_time: function to retrieve the current time of the clock 451a4729ecSAnna-Maria Behnsen * @offset: offset of this clock to the monotonic base 461a4729ecSAnna-Maria Behnsen */ 471a4729ecSAnna-Maria Behnsen struct hrtimer_clock_base { 481a4729ecSAnna-Maria Behnsen struct hrtimer_cpu_base *cpu_base; 491a4729ecSAnna-Maria Behnsen unsigned int index; 501a4729ecSAnna-Maria Behnsen clockid_t clockid; 511a4729ecSAnna-Maria Behnsen seqcount_raw_spinlock_t seq; 521a4729ecSAnna-Maria Behnsen struct hrtimer *running; 531a4729ecSAnna-Maria Behnsen struct timerqueue_head active; 541a4729ecSAnna-Maria Behnsen ktime_t (*get_time)(void); 551a4729ecSAnna-Maria Behnsen ktime_t offset; 561a4729ecSAnna-Maria Behnsen } __hrtimer_clock_base_align; 571a4729ecSAnna-Maria Behnsen 581a4729ecSAnna-Maria Behnsen enum hrtimer_base_type { 591a4729ecSAnna-Maria Behnsen HRTIMER_BASE_MONOTONIC, 601a4729ecSAnna-Maria Behnsen HRTIMER_BASE_REALTIME, 611a4729ecSAnna-Maria Behnsen HRTIMER_BASE_BOOTTIME, 621a4729ecSAnna-Maria Behnsen HRTIMER_BASE_TAI, 631a4729ecSAnna-Maria Behnsen HRTIMER_BASE_MONOTONIC_SOFT, 641a4729ecSAnna-Maria Behnsen HRTIMER_BASE_REALTIME_SOFT, 651a4729ecSAnna-Maria Behnsen HRTIMER_BASE_BOOTTIME_SOFT, 661a4729ecSAnna-Maria Behnsen HRTIMER_BASE_TAI_SOFT, 671a4729ecSAnna-Maria Behnsen HRTIMER_MAX_CLOCK_BASES, 681a4729ecSAnna-Maria Behnsen }; 691a4729ecSAnna-Maria Behnsen 701a4729ecSAnna-Maria Behnsen /** 711a4729ecSAnna-Maria Behnsen * struct hrtimer_cpu_base - the per cpu clock bases 721a4729ecSAnna-Maria Behnsen * @lock: lock protecting the base and associated clock bases 731a4729ecSAnna-Maria Behnsen * and timers 741a4729ecSAnna-Maria Behnsen * @cpu: cpu number 751a4729ecSAnna-Maria Behnsen * @active_bases: Bitfield to mark bases with active timers 761a4729ecSAnna-Maria Behnsen * @clock_was_set_seq: Sequence counter of clock was set events 771a4729ecSAnna-Maria Behnsen * @hres_active: State of high resolution mode 781a4729ecSAnna-Maria Behnsen * @in_hrtirq: hrtimer_interrupt() is currently executing 791a4729ecSAnna-Maria Behnsen * @hang_detected: The last hrtimer interrupt detected a hang 801a4729ecSAnna-Maria Behnsen * @softirq_activated: displays, if the softirq is raised - update of softirq 811a4729ecSAnna-Maria Behnsen * related settings is not required then. 821a4729ecSAnna-Maria Behnsen * @nr_events: Total number of hrtimer interrupt events 831a4729ecSAnna-Maria Behnsen * @nr_retries: Total number of hrtimer interrupt retries 841a4729ecSAnna-Maria Behnsen * @nr_hangs: Total number of hrtimer interrupt hangs 851a4729ecSAnna-Maria Behnsen * @max_hang_time: Maximum time spent in hrtimer_interrupt 861a4729ecSAnna-Maria Behnsen * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are 871a4729ecSAnna-Maria Behnsen * expired 8894bf12afSIngo Molnar * @online: CPU is online from an hrtimers point of view 891a4729ecSAnna-Maria Behnsen * @timer_waiters: A hrtimer_cancel() invocation waits for the timer 901a4729ecSAnna-Maria Behnsen * callback to finish. 911a4729ecSAnna-Maria Behnsen * @expires_next: absolute time of the next event, is required for remote 921a4729ecSAnna-Maria Behnsen * hrtimer enqueue; it is the total first expiry time (hard 931a4729ecSAnna-Maria Behnsen * and soft hrtimer are taken into account) 941a4729ecSAnna-Maria Behnsen * @next_timer: Pointer to the first expiring timer 951a4729ecSAnna-Maria Behnsen * @softirq_expires_next: Time to check, if soft queues needs also to be expired 961a4729ecSAnna-Maria Behnsen * @softirq_next_timer: Pointer to the first expiring softirq based timer 971a4729ecSAnna-Maria Behnsen * @clock_base: array of clock bases for this cpu 981a4729ecSAnna-Maria Behnsen * 991a4729ecSAnna-Maria Behnsen * Note: next_timer is just an optimization for __remove_hrtimer(). 1001a4729ecSAnna-Maria Behnsen * Do not dereference the pointer because it is not reliable on 1011a4729ecSAnna-Maria Behnsen * cross cpu removals. 1021a4729ecSAnna-Maria Behnsen */ 1031a4729ecSAnna-Maria Behnsen struct hrtimer_cpu_base { 1041a4729ecSAnna-Maria Behnsen raw_spinlock_t lock; 1051a4729ecSAnna-Maria Behnsen unsigned int cpu; 1061a4729ecSAnna-Maria Behnsen unsigned int active_bases; 1071a4729ecSAnna-Maria Behnsen unsigned int clock_was_set_seq; 1081a4729ecSAnna-Maria Behnsen unsigned int hres_active : 1, 1091a4729ecSAnna-Maria Behnsen in_hrtirq : 1, 1101a4729ecSAnna-Maria Behnsen hang_detected : 1, 11194bf12afSIngo Molnar softirq_activated : 1, 11294bf12afSIngo Molnar online : 1; 1131a4729ecSAnna-Maria Behnsen #ifdef CONFIG_HIGH_RES_TIMERS 1141a4729ecSAnna-Maria Behnsen unsigned int nr_events; 1151a4729ecSAnna-Maria Behnsen unsigned short nr_retries; 1161a4729ecSAnna-Maria Behnsen unsigned short nr_hangs; 1171a4729ecSAnna-Maria Behnsen unsigned int max_hang_time; 1181a4729ecSAnna-Maria Behnsen #endif 1191a4729ecSAnna-Maria Behnsen #ifdef CONFIG_PREEMPT_RT 1201a4729ecSAnna-Maria Behnsen spinlock_t softirq_expiry_lock; 1211a4729ecSAnna-Maria Behnsen atomic_t timer_waiters; 1221a4729ecSAnna-Maria Behnsen #endif 1231a4729ecSAnna-Maria Behnsen ktime_t expires_next; 1241a4729ecSAnna-Maria Behnsen struct hrtimer *next_timer; 1251a4729ecSAnna-Maria Behnsen ktime_t softirq_expires_next; 1261a4729ecSAnna-Maria Behnsen struct hrtimer *softirq_next_timer; 1271a4729ecSAnna-Maria Behnsen struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; 128*53dac345SFrederic Weisbecker call_single_data_t csd; 1291a4729ecSAnna-Maria Behnsen } ____cacheline_aligned; 1301a4729ecSAnna-Maria Behnsen 1311a4729ecSAnna-Maria Behnsen 13232e29396SVincenzo Frascino #endif 133