xref: /linux-6.15/include/linux/hrtimer_defs.h (revision 53dac345)
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