2028 lines · 54.0 KB · C
RawDownload
/* *  linux/kernel/hrtimer.c * *  Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de> *  Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar *  Copyright(C) 2006-2007  Timesys Corp., Thomas Gleixner * *  High-resolution kernel timers * *  In contrast to the low-resolution timeout API implemented in *  kernel/timer.c, hrtimers provide finer resolution and accuracy *  depending on system configuration and capabilities. * *  These timers are currently used for: *   - itimers *   - POSIX timers *   - nanosleep *   - precise in-kernel timing * *  Started by: Thomas Gleixner and Ingo Molnar * *  Credits: *	based on kernel/timer.c * *	Help, testing, suggestions, bugfixes, improvements were *	provided by: * *	George Anzinger, Andrew Morton, Steven Rostedt, Roman Zippel *	et. al. * *  For licencing details see kernel-base/COPYING */ #include <linux/cpu.h>#include <linux/export.h>#include <linux/percpu.h>#include <linux/hrtimer.h>#include <linux/notifier.h>#include <linux/syscalls.h>#include <linux/interrupt.h>#include <linux/tick.h>#include <linux/seq_file.h>#include <linux/err.h>#include <linux/debugobjects.h>#include <linux/sched/signal.h>#include <linux/sched/sysctl.h>#include <linux/sched/rt.h>#include <linux/sched/deadline.h>#include <linux/sched/nohz.h>#include <linux/sched/debug.h>#include <linux/timer.h>#include <linux/freezer.h>#include <linux/compat.h> #include <linux/uaccess.h> #include <trace/events/timer.h> #include "tick-internal.h" /* * Masks for selecting the soft and hard context timers from * cpu_base->active */#define MASK_SHIFT		(HRTIMER_BASE_MONOTONIC_SOFT)#define HRTIMER_ACTIVE_HARD	((1U << MASK_SHIFT) - 1)#define HRTIMER_ACTIVE_SOFT	(HRTIMER_ACTIVE_HARD << MASK_SHIFT)#define HRTIMER_ACTIVE_ALL	(HRTIMER_ACTIVE_SOFT | HRTIMER_ACTIVE_HARD) /* * The timer bases: * * There are more clockids than hrtimer bases. Thus, we index * into the timer bases by the hrtimer_base_type enum. When trying * to reach a base using a clockid, hrtimer_clockid_to_base() * is used to convert from clockid to the proper hrtimer_base_type. */DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) ={	.lock = __RAW_SPIN_LOCK_UNLOCKED(hrtimer_bases.lock),	.clock_base =	{		{			.index = HRTIMER_BASE_MONOTONIC,			.clockid = CLOCK_MONOTONIC,			.get_time = &ktime_get,		},		{			.index = HRTIMER_BASE_REALTIME,			.clockid = CLOCK_REALTIME,			.get_time = &ktime_get_real,		},		{			.index = HRTIMER_BASE_BOOTTIME,			.clockid = CLOCK_BOOTTIME,			.get_time = &ktime_get_boottime,		},		{			.index = HRTIMER_BASE_TAI,			.clockid = CLOCK_TAI,			.get_time = &ktime_get_clocktai,		},		{			.index = HRTIMER_BASE_MONOTONIC_SOFT,			.clockid = CLOCK_MONOTONIC,			.get_time = &ktime_get,		},		{			.index = HRTIMER_BASE_REALTIME_SOFT,			.clockid = CLOCK_REALTIME,			.get_time = &ktime_get_real,		},		{			.index = HRTIMER_BASE_BOOTTIME_SOFT,			.clockid = CLOCK_BOOTTIME,			.get_time = &ktime_get_boottime,		},		{			.index = HRTIMER_BASE_TAI_SOFT,			.clockid = CLOCK_TAI,			.get_time = &ktime_get_clocktai,		},	}}; static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {	/* Make sure we catch unsupported clockids */	[0 ... MAX_CLOCKS - 1]	= HRTIMER_MAX_CLOCK_BASES, 	[CLOCK_REALTIME]	= HRTIMER_BASE_REALTIME,	[CLOCK_MONOTONIC]	= HRTIMER_BASE_MONOTONIC,	[CLOCK_BOOTTIME]	= HRTIMER_BASE_BOOTTIME,	[CLOCK_TAI]		= HRTIMER_BASE_TAI,}; /* * Functions and macros which are different for UP/SMP systems are kept in a * single place */#ifdef CONFIG_SMP /* * We require the migration_base for lock_hrtimer_base()/switch_hrtimer_base() * such that hrtimer_callback_running() can unconditionally dereference * timer->base->cpu_base */static struct hrtimer_cpu_base migration_cpu_base = {	.clock_base = { { .cpu_base = &migration_cpu_base, }, },}; #define migration_base	migration_cpu_base.clock_base[0] /* * We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock * means that all timers which are tied to this base via timer->base are * locked, and the base itself is locked too. * * So __run_timers/migrate_timers can safely modify all timers which could * be found on the lists/queues. * * When the timer's base is locked, and the timer removed from list, it is * possible to set timer->base = &migration_base and drop the lock: the timer * remains locked. */staticstruct hrtimer_clock_base *lock_hrtimer_base(const struct hrtimer *timer,					     unsigned long *flags){	struct hrtimer_clock_base *base; 	for (;;) {		base = timer->base;		if (likely(base != &migration_base)) {			raw_spin_lock_irqsave(&base->cpu_base->lock, *flags);			if (likely(base == timer->base))				return base;			/* The timer has migrated to another CPU: */			raw_spin_unlock_irqrestore(&base->cpu_base->lock, *flags);		}		cpu_relax();	}} /* * We do not migrate the timer when it is expiring before the next * event on the target cpu. When high resolution is enabled, we cannot * reprogram the target cpu hardware and we would cause it to fire * late. To keep it simple, we handle the high resolution enabled and * disabled case similar. * * Called with cpu_base->lock of target cpu held. */static inthrtimer_check_target(struct hrtimer *timer, struct hrtimer_clock_base *new_base){	ktime_t expires; 	expires = ktime_sub(hrtimer_get_expires(timer), new_base->offset);	return expires < new_base->cpu_base->expires_next;} static inlinestruct hrtimer_cpu_base *get_target_base(struct hrtimer_cpu_base *base,					 int pinned){#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)	if (static_branch_likely(&timers_migration_enabled) && !pinned)		return &per_cpu(hrtimer_bases, get_nohz_timer_target());#endif	return base;} /* * We switch the timer base to a power-optimized selected CPU target, * if: *	- NO_HZ_COMMON is enabled *	- timer migration is enabled *	- the timer callback is not running *	- the timer is not the first expiring timer on the new target * * If one of the above requirements is not fulfilled we move the timer * to the current CPU or leave it on the previously assigned CPU if * the timer callback is currently running. */static inline struct hrtimer_clock_base *switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_clock_base *base,		    int pinned){	struct hrtimer_cpu_base *new_cpu_base, *this_cpu_base;	struct hrtimer_clock_base *new_base;	int basenum = base->index; 	this_cpu_base = this_cpu_ptr(&hrtimer_bases);	new_cpu_base = get_target_base(this_cpu_base, pinned);again:	new_base = &new_cpu_base->clock_base[basenum]; 	if (base != new_base) {		/*		 * We are trying to move timer to new_base.		 * However we can't change timer's base while it is running,		 * so we keep it on the same CPU. No hassle vs. reprogramming		 * the event source in the high resolution case. The softirq		 * code will take care of this when the timer function has		 * completed. There is no conflict as we hold the lock until		 * the timer is enqueued.		 */		if (unlikely(hrtimer_callback_running(timer)))			return base; 		/* See the comment in lock_hrtimer_base() */		timer->base = &migration_base;		raw_spin_unlock(&base->cpu_base->lock);		raw_spin_lock(&new_base->cpu_base->lock); 		if (new_cpu_base != this_cpu_base &&		    hrtimer_check_target(timer, new_base)) {			raw_spin_unlock(&new_base->cpu_base->lock);			raw_spin_lock(&base->cpu_base->lock);			new_cpu_base = this_cpu_base;			timer->base = base;			goto again;		}		timer->base = new_base;	} else {		if (new_cpu_base != this_cpu_base &&		    hrtimer_check_target(timer, new_base)) {			new_cpu_base = this_cpu_base;			goto again;		}	}	return new_base;} #else /* CONFIG_SMP */ static inline struct hrtimer_clock_base *lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags){	struct hrtimer_clock_base *base = timer->base; 	raw_spin_lock_irqsave(&base->cpu_base->lock, *flags); 	return base;} # define switch_hrtimer_base(t, b, p)	(b) #endif	/* !CONFIG_SMP */ /* * Functions for the union type storage format of ktime_t which are * too large for inlining: */#if BITS_PER_LONG < 64/* * Divide a ktime value by a nanosecond value */s64 __ktime_divns(const ktime_t kt, s64 div){	int sft = 0;	s64 dclc;	u64 tmp; 	dclc = ktime_to_ns(kt);	tmp = dclc < 0 ? -dclc : dclc; 	/* Make sure the divisor is less than 2^32: */	while (div >> 32) {		sft++;		div >>= 1;	}	tmp >>= sft;	do_div(tmp, (unsigned long) div);	return dclc < 0 ? -tmp : tmp;}EXPORT_SYMBOL_GPL(__ktime_divns);#endif /* BITS_PER_LONG >= 64 */ /* * Add two ktime values and do a safety check for overflow: */ktime_t ktime_add_safe(const ktime_t lhs, const ktime_t rhs){	ktime_t res = ktime_add_unsafe(lhs, rhs); 	/*	 * We use KTIME_SEC_MAX here, the maximum timeout which we can	 * return to user space in a timespec:	 */	if (res < 0 || res < lhs || res < rhs)		res = ktime_set(KTIME_SEC_MAX, 0); 	return res;} EXPORT_SYMBOL_GPL(ktime_add_safe); #ifdef CONFIG_DEBUG_OBJECTS_TIMERS static struct debug_obj_descr hrtimer_debug_descr; static void *hrtimer_debug_hint(void *addr){	return ((struct hrtimer *) addr)->function;} /* * fixup_init is called when: * - an active object is initialized */static bool hrtimer_fixup_init(void *addr, enum debug_obj_state state){	struct hrtimer *timer = addr; 	switch (state) {	case ODEBUG_STATE_ACTIVE:		hrtimer_cancel(timer);		debug_object_init(timer, &hrtimer_debug_descr);		return true;	default:		return false;	}} /* * fixup_activate is called when: * - an active object is activated * - an unknown non-static object is activated */static bool hrtimer_fixup_activate(void *addr, enum debug_obj_state state){	switch (state) {	case ODEBUG_STATE_ACTIVE:		WARN_ON(1); 	default:		return false;	}} /* * fixup_free is called when: * - an active object is freed */static bool hrtimer_fixup_free(void *addr, enum debug_obj_state state){	struct hrtimer *timer = addr; 	switch (state) {	case ODEBUG_STATE_ACTIVE:		hrtimer_cancel(timer);		debug_object_free(timer, &hrtimer_debug_descr);		return true;	default:		return false;	}} static struct debug_obj_descr hrtimer_debug_descr = {	.name		= "hrtimer",	.debug_hint	= hrtimer_debug_hint,	.fixup_init	= hrtimer_fixup_init,	.fixup_activate	= hrtimer_fixup_activate,	.fixup_free	= hrtimer_fixup_free,}; static inline void debug_hrtimer_init(struct hrtimer *timer){	debug_object_init(timer, &hrtimer_debug_descr);} static inline void debug_hrtimer_activate(struct hrtimer *timer,					  enum hrtimer_mode mode){	debug_object_activate(timer, &hrtimer_debug_descr);} static inline void debug_hrtimer_deactivate(struct hrtimer *timer){	debug_object_deactivate(timer, &hrtimer_debug_descr);} static inline void debug_hrtimer_free(struct hrtimer *timer){	debug_object_free(timer, &hrtimer_debug_descr);} static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,			   enum hrtimer_mode mode); void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t clock_id,			   enum hrtimer_mode mode){	debug_object_init_on_stack(timer, &hrtimer_debug_descr);	__hrtimer_init(timer, clock_id, mode);}EXPORT_SYMBOL_GPL(hrtimer_init_on_stack); void destroy_hrtimer_on_stack(struct hrtimer *timer){	debug_object_free(timer, &hrtimer_debug_descr);}EXPORT_SYMBOL_GPL(destroy_hrtimer_on_stack); #else static inline void debug_hrtimer_init(struct hrtimer *timer) { }static inline void debug_hrtimer_activate(struct hrtimer *timer,					  enum hrtimer_mode mode) { }static inline void debug_hrtimer_deactivate(struct hrtimer *timer) { }#endif static inline voiddebug_init(struct hrtimer *timer, clockid_t clockid,	   enum hrtimer_mode mode){	debug_hrtimer_init(timer);	trace_hrtimer_init(timer, clockid, mode);} static inline void debug_activate(struct hrtimer *timer,				  enum hrtimer_mode mode){	debug_hrtimer_activate(timer, mode);	trace_hrtimer_start(timer, mode);} static inline void debug_deactivate(struct hrtimer *timer){	debug_hrtimer_deactivate(timer);	trace_hrtimer_cancel(timer);} static struct hrtimer_clock_base *__next_base(struct hrtimer_cpu_base *cpu_base, unsigned int *active){	unsigned int idx; 	if (!*active)		return NULL; 	idx = __ffs(*active);	*active &= ~(1U << idx); 	return &cpu_base->clock_base[idx];} #define for_each_active_base(base, cpu_base, active)	\	while ((base = __next_base((cpu_base), &(active)))) static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base,					 const struct hrtimer *exclude,					 unsigned int active,					 ktime_t expires_next){	struct hrtimer_clock_base *base;	ktime_t expires; 	for_each_active_base(base, cpu_base, active) {

Lines 1–500 of 2028.