Use the new tick_suspend/resume_local() and get rid of the homebrewn implementation of these in the ARM bL switcher. The check for the cpumask is completely pointless. There is no harm to suspend a per cpu tick device unconditionally. If that's a real issue then we fix it proper at the core level and not with some completely undocumented hacks in some random core code. Move the tick internals to the core code, now that this nuisance is gone. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> [ rjw: Rebase, changelog ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Cc: Nicolas Pitre <nicolas.pitre@linaro.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Russell King <rmk+kernel@arm.linux.org.uk> Link: http://lkml.kernel.org/r/1655112.Ws17YsMfN7@vostro.rjw.lan Signed-off-by: Ingo Molnar <mingo@kernel.org>
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _TICK_SCHED_H
 | |
| #define _TICK_SCHED_H
 | |
| 
 | |
| #include <linux/hrtimer.h>
 | |
| 
 | |
| 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
 | |
|  * @last_tick:		Store the last tick expiry time when the tick
 | |
|  *			timer is modified for nohz sleeps. This is necessary
 | |
|  *			to resume the tick timer operation in the timeline
 | |
|  *			when the CPU returns from nohz sleep.
 | |
|  * @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_waketime:	Time when the idle was interrupted
 | |
|  * @idle_exittime:	Time when the idle state was left
 | |
|  * @idle_sleeptime:	Sum of the time slept in idle with sched tick stopped
 | |
|  * @iowait_sleeptime:	Sum of the time slept in idle with sched tick stopped, with IO outstanding
 | |
|  * @sleep_length:	Duration of the current idle sleep
 | |
|  * @do_timer_lst:	CPU was the last one doing do_timer before going idle
 | |
|  */
 | |
| struct tick_sched {
 | |
| 	struct hrtimer			sched_timer;
 | |
| 	unsigned long			check_clocks;
 | |
| 	enum tick_nohz_mode		nohz_mode;
 | |
| 	ktime_t				last_tick;
 | |
| 	int				inidle;
 | |
| 	int				tick_stopped;
 | |
| 	unsigned long			idle_jiffies;
 | |
| 	unsigned long			idle_calls;
 | |
| 	unsigned long			idle_sleeps;
 | |
| 	int				idle_active;
 | |
| 	ktime_t				idle_entrytime;
 | |
| 	ktime_t				idle_waketime;
 | |
| 	ktime_t				idle_exittime;
 | |
| 	ktime_t				idle_sleeptime;
 | |
| 	ktime_t				iowait_sleeptime;
 | |
| 	ktime_t				sleep_length;
 | |
| 	unsigned long			last_jiffies;
 | |
| 	unsigned long			next_jiffies;
 | |
| 	ktime_t				idle_expires;
 | |
| 	int				do_timer_last;
 | |
| };
 | |
| 
 | |
| extern struct tick_sched *tick_get_tick_sched(int cpu);
 | |
| 
 | |
| extern void tick_setup_sched_timer(void);
 | |
| #if defined CONFIG_NO_HZ_COMMON || defined CONFIG_HIGH_RES_TIMERS
 | |
| extern void tick_cancel_sched_timer(int cpu);
 | |
| #else
 | |
| static inline void tick_cancel_sched_timer(int cpu) { }
 | |
| #endif
 | |
| 
 | |
| #endif
 |