1811 lines · 46.3 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/kallsyms.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.h>#include <linux/sched/sysctl.h>#include <linux/sched/rt.h>#include <linux/sched/deadline.h>#include <linux/timer.h>#include <linux/freezer.h> #include <asm/uaccess.h> #include <trace/events/timer.h> #include "tick-internal.h" /* * 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),	.seq = SEQCNT_ZERO(hrtimer_bases.seq),	.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,		},	}}; static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {	[CLOCK_REALTIME]	= HRTIMER_BASE_REALTIME,	[CLOCK_MONOTONIC]	= HRTIMER_BASE_MONOTONIC,	[CLOCK_BOOTTIME]	= HRTIMER_BASE_BOOTTIME,	[CLOCK_TAI]		= HRTIMER_BASE_TAI,}; static inline int hrtimer_clockid_to_base(clockid_t clock_id){	return hrtimer_clock_to_base_table[clock_id];} /* * 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 = {	.seq = SEQCNT_ZERO(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();	}} /* * With HIGHRES=y we do not migrate the timer when it is expiring * before the next event on the target cpu because we cannot reprogram * the target cpu hardware and we would cause it to fire late. * * Called with cpu_base->lock of target cpu held. */static inthrtimer_check_target(struct hrtimer *timer, struct hrtimer_clock_base *new_base){#ifdef CONFIG_HIGH_RES_TIMERS	ktime_t expires; 	if (!new_base->cpu_base->hres_active)		return 0; 	expires = ktime_sub(hrtimer_get_expires(timer), new_base->offset);	return expires.tv64 <= new_base->cpu_base->expires_next.tv64;#else	return 0;#endif} #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)static inlinestruct hrtimer_cpu_base *get_target_base(struct hrtimer_cpu_base *base,					 int pinned){	if (pinned || !base->migration_enabled)		return base;	return &per_cpu(hrtimer_bases, get_nohz_timer_target());}#elsestatic inlinestruct hrtimer_cpu_base *get_target_base(struct hrtimer_cpu_base *base,					 int pinned){	return base;}#endif /* * 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(lhs, rhs); 	/*	 * We use KTIME_SEC_MAX here, the maximum timeout which we can	 * return to user space in a timespec:	 */	if (res.tv64 < 0 || res.tv64 < lhs.tv64 || res.tv64 < rhs.tv64)		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 int 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 1;	default:		return 0;	}} /* * fixup_activate is called when: * - an active object is activated * - an unknown object is activated (might be a statically initialized object) */static int hrtimer_fixup_activate(void *addr, enum debug_obj_state state){	switch (state) { 	case ODEBUG_STATE_NOTAVAILABLE:		WARN_ON_ONCE(1);		return 0; 	case ODEBUG_STATE_ACTIVE:		WARN_ON(1); 	default:		return 0;	}} /* * fixup_free is called when: * - an active object is freed */static int 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 1;	default:		return 0;	}} 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){	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);} #elsestatic inline void debug_hrtimer_init(struct hrtimer *timer) { }static inline void debug_hrtimer_activate(struct hrtimer *timer) { }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){	debug_hrtimer_activate(timer);	trace_hrtimer_start(timer);} static inline void debug_deactivate(struct hrtimer *timer){	debug_hrtimer_deactivate(timer);	trace_hrtimer_cancel(timer);} #if defined(CONFIG_NO_HZ_COMMON) || defined(CONFIG_HIGH_RES_TIMERS)static inline void hrtimer_update_next_timer(struct hrtimer_cpu_base *cpu_base,					     struct hrtimer *timer){#ifdef CONFIG_HIGH_RES_TIMERS	cpu_base->next_timer = timer;#endif} static ktime_t __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base){	struct hrtimer_clock_base *base = cpu_base->clock_base;	ktime_t expires, expires_next = { .tv64 = KTIME_MAX };	unsigned int active = cpu_base->active_bases; 	hrtimer_update_next_timer(cpu_base, NULL);	for (; active; base++, active >>= 1) {		struct timerqueue_node *next;		struct hrtimer *timer; 		if (!(active & 0x01))			continue; 		next = timerqueue_getnext(&base->active);		timer = container_of(next, struct hrtimer, node);		expires = ktime_sub(hrtimer_get_expires(timer), base->offset);		if (expires.tv64 < expires_next.tv64) {			expires_next = expires;			hrtimer_update_next_timer(cpu_base, timer);		}	}	/*	 * clock_was_set() might have changed base->offset of any of	 * the clock bases so the result might be negative. Fix it up	 * to prevent a false positive in clockevents_program_event().	 */	if (expires_next.tv64 < 0)		expires_next.tv64 = 0;	return expires_next;}#endif

Lines 1–500 of 1811.