forked from mirrors/linux
		
	 289f480af8
			
		
	
	
		289f480af8
		
	
	
	
	
		
			
			add /proc/timer_list, which prints all currently pending (high-res) timers, all clock-event sources and their parameters in a human-readable form. Sample output: Timer List Version: v0.1 HRTIMER_MAX_CLOCK_BASES: 2 now at 4246046273872 nsecs cpu: 0 clock 0: .index: 0 .resolution: 1 nsecs .get_time: ktime_get_real .offset: 1273998312645738432 nsecs active timers: clock 1: .index: 1 .resolution: 1 nsecs .get_time: ktime_get .offset: 0 nsecs active timers: #0: <f5a90ec8>, hrtimer_sched_tick, hrtimer_stop_sched_tick, swapper/0 # expires at 4246432689566 nsecs [in 386415694 nsecs] #1: <f5a90ec8>, hrtimer_wakeup, do_nanosleep, pcscd/2050 # expires at 4247018194689 nsecs [in 971920817 nsecs] #2: <f5a90ec8>, hrtimer_wakeup, do_nanosleep, irqbalance/1909 # expires at 4247351358392 nsecs [in 1305084520 nsecs] #3: <f5a90ec8>, hrtimer_wakeup, do_nanosleep, crond/2157 # expires at 4249097614968 nsecs [in 3051341096 nsecs] #4: <f5a90ec8>, it_real_fn, do_setitimer, syslogd/1888 # expires at 4251329900926 nsecs [in 5283627054 nsecs] .expires_next : 4246432689566 nsecs .hres_active : 1 .check_clocks : 0 .nr_events : 31306 .idle_tick : 4246020791890 nsecs .tick_stopped : 1 .idle_jiffies : 986504 .idle_calls : 40700 .idle_sleeps : 36014 .idle_entrytime : 4246019418883 nsecs .idle_sleeptime : 4178181972709 nsecs cpu: 1 clock 0: .index: 0 .resolution: 1 nsecs .get_time: ktime_get_real .offset: 1273998312645738432 nsecs active timers: clock 1: .index: 1 .resolution: 1 nsecs .get_time: ktime_get .offset: 0 nsecs active timers: #0: <f5a90ec8>, hrtimer_sched_tick, hrtimer_restart_sched_tick, swapper/0 # expires at 4246050084568 nsecs [in 3810696 nsecs] #1: <f5a90ec8>, hrtimer_wakeup, do_nanosleep, atd/2227 # expires at 4261010635003 nsecs [in 14964361131 nsecs] #2: <f5a90ec8>, hrtimer_wakeup, do_nanosleep, smartd/2332 # expires at 5469485798970 nsecs [in 1223439525098 nsecs] .expires_next : 4246050084568 nsecs .hres_active : 1 .check_clocks : 0 .nr_events : 24043 .idle_tick : 4246046084568 nsecs .tick_stopped : 0 .idle_jiffies : 986510 .idle_calls : 26360 .idle_sleeps : 22551 .idle_entrytime : 4246043874339 nsecs .idle_sleeptime : 4170763761184 nsecs tick_broadcast_mask: 00000003 event_broadcast_mask: 00000001 CPU#0's local event device: Clock Event Device: lapic capabilities: 0000000e max_delta_ns: 807385544 min_delta_ns: 1443 mult: 44624025 shift: 32 set_next_event: lapic_next_event set_mode: lapic_timer_setup event_handler: hrtimer_interrupt .installed: 1 .expires: 4246432689566 nsecs CPU#1's local event device: Clock Event Device: lapic capabilities: 0000000e max_delta_ns: 807385544 min_delta_ns: 1443 mult: 44624025 shift: 32 set_next_event: lapic_next_event set_mode: lapic_timer_setup event_handler: hrtimer_interrupt .installed: 1 .expires: 4246050084568 nsecs Clock Event Device: hpet capabilities: 00000007 max_delta_ns: 2147483647 min_delta_ns: 3352 mult: 61496110 shift: 32 set_next_event: hpet_next_event set_mode: hpet_set_mode event_handler: handle_nextevt_broadcast Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*  linux/include/linux/tick.h
 | |
|  *
 | |
|  *  This file contains the structure definitions for tick related functions
 | |
|  *
 | |
|  */
 | |
| #ifndef _LINUX_TICK_H
 | |
| #define _LINUX_TICK_H
 | |
| 
 | |
| #include <linux/clockchips.h>
 | |
| 
 | |
| #ifdef CONFIG_GENERIC_CLOCKEVENTS
 | |
| 
 | |
| enum tick_device_mode {
 | |
| 	TICKDEV_MODE_PERIODIC,
 | |
| 	TICKDEV_MODE_ONESHOT,
 | |
| };
 | |
| 
 | |
| struct tick_device {
 | |
| 	struct clock_event_device *evtdev;
 | |
| 	enum tick_device_mode mode;
 | |
| };
 | |
| 
 | |
| enum tick_nohz_mode {
 | |
| 	NOHZ_MODE_INACTIVE,
 | |
| 	NOHZ_MODE_LOWRES,
 | |
| 	NOHZ_MODE_HIGHRES,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct tick_sched - sched tick emulation and no idle tick control/stats
 | |
|  * @sched_timer:	hrtimer to schedule the periodic tick in high
 | |
|  *			resolution mode
 | |
|  * @idle_tick:		Store the last idle tick expiry time when the tick
 | |
|  *			timer is modified for idle sleeps. This is necessary
 | |
|  *			to resume the tick timer operation in the timeline
 | |
|  *			when the CPU returns from idle
 | |
|  * @tick_stopped:	Indicator that the idle tick has been stopped
 | |
|  * @idle_jiffies:	jiffies at the entry to idle for idle time accounting
 | |
|  * @idle_calls:		Total number of idle calls
 | |
|  * @idle_sleeps:	Number of idle calls, where the sched tick was stopped
 | |
|  * @idle_entrytime:	Time when the idle call was entered
 | |
|  * @idle_sleeptime:	Sum of the time slept in idle with sched tick stopped
 | |
|  */
 | |
| struct tick_sched {
 | |
| 	struct hrtimer			sched_timer;
 | |
| 	unsigned long			check_clocks;
 | |
| 	enum tick_nohz_mode		nohz_mode;
 | |
| 	ktime_t				idle_tick;
 | |
| 	int				tick_stopped;
 | |
| 	unsigned long			idle_jiffies;
 | |
| 	unsigned long			idle_calls;
 | |
| 	unsigned long			idle_sleeps;
 | |
| 	ktime_t				idle_entrytime;
 | |
| 	ktime_t				idle_sleeptime;
 | |
| 	unsigned long			last_jiffies;
 | |
| 	unsigned long			next_jiffies;
 | |
| 	ktime_t				idle_expires;
 | |
| };
 | |
| 
 | |
| extern void __init tick_init(void);
 | |
| extern int tick_is_oneshot_available(void);
 | |
| extern struct tick_device *tick_get_device(int cpu);
 | |
| 
 | |
| # ifdef CONFIG_HIGH_RES_TIMERS
 | |
| extern int tick_init_highres(void);
 | |
| extern int tick_program_event(ktime_t expires, int force);
 | |
| extern void tick_setup_sched_timer(void);
 | |
| extern void tick_cancel_sched_timer(int cpu);
 | |
| # else
 | |
| static inline void tick_cancel_sched_timer(int cpu) { }
 | |
| # endif /* HIGHRES */
 | |
| 
 | |
| # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
 | |
| extern struct tick_device *tick_get_broadcast_device(void);
 | |
| extern cpumask_t *tick_get_broadcast_mask(void);
 | |
| 
 | |
| #  ifdef CONFIG_TICK_ONESHOT
 | |
| extern cpumask_t *tick_get_broadcast_oneshot_mask(void);
 | |
| #  endif
 | |
| 
 | |
| # endif /* BROADCAST */
 | |
| 
 | |
| # ifdef CONFIG_TICK_ONESHOT
 | |
| extern void tick_clock_notify(void);
 | |
| extern int tick_check_oneshot_change(int allow_nohz);
 | |
| extern struct tick_sched *tick_get_tick_sched(int cpu);
 | |
| # else
 | |
| static inline void tick_clock_notify(void) { }
 | |
| static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
 | |
| # endif
 | |
| 
 | |
| #else /* CONFIG_GENERIC_CLOCKEVENTS */
 | |
| static inline void tick_init(void) { }
 | |
| static inline void tick_cancel_sched_timer(int cpu) { }
 | |
| static inline void tick_clock_notify(void) { }
 | |
| static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
 | |
| #endif /* !CONFIG_GENERIC_CLOCKEVENTS */
 | |
| 
 | |
| # ifdef CONFIG_NO_HZ
 | |
| extern void tick_nohz_stop_sched_tick(void);
 | |
| extern void tick_nohz_restart_sched_tick(void);
 | |
| extern void tick_nohz_update_jiffies(void);
 | |
| # else
 | |
| static inline void tick_nohz_stop_sched_tick(void) { }
 | |
| static inline void tick_nohz_restart_sched_tick(void) { }
 | |
| static inline void tick_nohz_update_jiffies(void) { }
 | |
| # endif /* !NO_HZ */
 | |
| 
 | |
| #endif
 |