| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | #ifndef _LINUX_KERNEL_VTIME_H
 | 
					
						
							|  |  |  | #define _LINUX_KERNEL_VTIME_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | #include <linux/context_tracking_state.h>
 | 
					
						
							| 
									
										
										
										
											2013-07-16 18:50:52 +02:00
										 |  |  | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
 | 
					
						
							|  |  |  | #include <asm/vtime.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | struct task_struct; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * vtime_accounting_enabled() definitions/declarations | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
 | 
					
						
							|  |  |  | static inline bool vtime_accounting_enabled(void) { return true; } | 
					
						
							|  |  |  | #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
 | 
					
						
							|  |  |  | static inline bool vtime_accounting_enabled(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-06 14:45:57 +01:00
										 |  |  | 	if (context_tracking_is_enabled()) { | 
					
						
							| 
									
										
										
										
											2013-11-06 15:11:57 +01:00
										 |  |  | 		if (context_tracking_cpu_is_enabled()) | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef CONFIG_VIRT_CPU_ACCOUNTING
 | 
					
						
							|  |  |  | static inline bool vtime_accounting_enabled(void) { return false; } | 
					
						
							|  |  |  | #endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Common vtime APIs | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | #ifdef CONFIG_VIRT_CPU_ACCOUNTING
 | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __ARCH_HAS_VTIME_TASK_SWITCH
 | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | extern void vtime_task_switch(struct task_struct *prev); | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  | extern void vtime_common_task_switch(struct task_struct *prev); | 
					
						
							|  |  |  | static inline void vtime_task_switch(struct task_struct *prev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (vtime_accounting_enabled()) | 
					
						
							|  |  |  | 		vtime_common_task_switch(prev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* __ARCH_HAS_VTIME_TASK_SWITCH */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | extern void vtime_account_system(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2012-11-13 18:21:22 +01:00
										 |  |  | extern void vtime_account_idle(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2012-11-13 23:51:06 +01:00
										 |  |  | extern void vtime_account_user(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2012-07-16 18:00:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | #ifdef __ARCH_HAS_VTIME_ACCOUNT
 | 
					
						
							|  |  |  | extern void vtime_account_irq_enter(struct task_struct *tsk); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | extern void vtime_common_account_irq_enter(struct task_struct *tsk); | 
					
						
							|  |  |  | static inline void vtime_account_irq_enter(struct task_struct *tsk) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (vtime_accounting_enabled()) | 
					
						
							|  |  |  | 		vtime_common_account_irq_enter(tsk); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* __ARCH_HAS_VTIME_ACCOUNT */
 | 
					
						
							| 
									
										
										
										
											2012-07-16 18:00:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else /* !CONFIG_VIRT_CPU_ACCOUNTING */
 | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | static inline void vtime_task_switch(struct task_struct *prev) { } | 
					
						
							| 
									
										
										
										
											2012-10-24 18:05:51 +02:00
										 |  |  | static inline void vtime_account_system(struct task_struct *tsk) { } | 
					
						
							| 
									
										
										
										
											2012-07-25 07:56:04 +02:00
										 |  |  | static inline void vtime_account_user(struct task_struct *tsk) { } | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | static inline void vtime_account_irq_enter(struct task_struct *tsk) { } | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | #endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
 | 
					
						
							| 
									
										
										
										
											2012-07-25 07:56:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
 | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | extern void arch_vtime_task_switch(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | extern void vtime_gen_account_irq_exit(struct task_struct *tsk); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void vtime_account_irq_exit(struct task_struct *tsk) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (vtime_accounting_enabled()) | 
					
						
							|  |  |  | 		vtime_gen_account_irq_exit(tsk); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | extern void vtime_user_enter(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 07:56:04 +02:00
										 |  |  | static inline void vtime_user_exit(struct task_struct *tsk) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	vtime_account_user(tsk); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | extern void vtime_guest_enter(struct task_struct *tsk); | 
					
						
							|  |  |  | extern void vtime_guest_exit(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2013-05-15 22:16:32 +02:00
										 |  |  | extern void vtime_init_idle(struct task_struct *tsk, int cpu); | 
					
						
							| 
									
										
										
										
											2013-07-12 03:10:15 +02:00
										 |  |  | #else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN  */
 | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | static inline void vtime_account_irq_exit(struct task_struct *tsk) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* On hard|softirq exit we always account to hard|softirq cputime */ | 
					
						
							|  |  |  | 	vtime_account_system(tsk); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-07-25 07:56:04 +02:00
										 |  |  | static inline void vtime_user_enter(struct task_struct *tsk) { } | 
					
						
							|  |  |  | static inline void vtime_user_exit(struct task_struct *tsk) { } | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | static inline void vtime_guest_enter(struct task_struct *tsk) { } | 
					
						
							|  |  |  | static inline void vtime_guest_exit(struct task_struct *tsk) { } | 
					
						
							| 
									
										
										
										
											2013-05-15 22:16:32 +02:00
										 |  |  | static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { } | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-06 05:23:22 +02:00
										 |  |  | #ifdef CONFIG_IRQ_TIME_ACCOUNTING
 | 
					
						
							|  |  |  | extern void irqtime_account_irq(struct task_struct *tsk); | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-10-06 05:23:22 +02:00
										 |  |  | static inline void irqtime_account_irq(struct task_struct *tsk) { } | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | static inline void account_irq_enter_time(struct task_struct *tsk) | 
					
						
							| 
									
										
										
										
											2012-10-06 04:07:19 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | 	vtime_account_irq_enter(tsk); | 
					
						
							| 
									
										
										
										
											2012-10-06 05:23:22 +02:00
										 |  |  | 	irqtime_account_irq(tsk); | 
					
						
							| 
									
										
										
										
											2012-10-06 04:07:19 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | static inline void account_irq_exit_time(struct task_struct *tsk) | 
					
						
							| 
									
										
										
										
											2012-10-06 04:07:19 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-12-16 20:00:34 +01:00
										 |  |  | 	vtime_account_irq_exit(tsk); | 
					
						
							| 
									
										
										
										
											2012-10-06 05:23:22 +02:00
										 |  |  | 	irqtime_account_irq(tsk); | 
					
						
							| 
									
										
										
										
											2012-10-06 04:07:19 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-05 23:07:19 +02:00
										 |  |  | #endif /* _LINUX_KERNEL_VTIME_H */
 |