1 #ifndef _LINUX_KERNEL_VTIME_H 2 #define _LINUX_KERNEL_VTIME_H 3 4 #include <linux/context_tracking_state.h> 5 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 6 #include <asm/vtime.h> 7 #endif 8 9 10 struct task_struct; 11 12 /* 13 * vtime_accounting_cpu_enabled() definitions/declarations 14 */ 15 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 16 static inline bool vtime_accounting_cpu_enabled(void) { return true; } 17 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ 18 19 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 20 /* 21 * Checks if vtime is enabled on some CPU. Cputime readers want to be careful 22 * in that case and compute the tickless cputime. 23 * For now vtime state is tied to context tracking. We might want to decouple 24 * those later if necessary. 25 */ 26 static inline bool vtime_accounting_enabled(void) 27 { 28 return context_tracking_is_enabled(); 29 } 30 31 static inline bool vtime_accounting_cpu_enabled(void) 32 { 33 if (vtime_accounting_enabled()) { 34 if (context_tracking_cpu_is_enabled()) 35 return true; 36 } 37 38 return false; 39 } 40 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ 41 42 #ifndef CONFIG_VIRT_CPU_ACCOUNTING 43 static inline bool vtime_accounting_cpu_enabled(void) { return false; } 44 #endif /* !CONFIG_VIRT_CPU_ACCOUNTING */ 45 46 47 /* 48 * Common vtime APIs 49 */ 50 #ifdef CONFIG_VIRT_CPU_ACCOUNTING 51 52 #ifdef __ARCH_HAS_VTIME_TASK_SWITCH 53 extern void vtime_task_switch(struct task_struct *prev); 54 #else 55 extern void vtime_common_task_switch(struct task_struct *prev); 56 static inline void vtime_task_switch(struct task_struct *prev) 57 { 58 if (vtime_accounting_cpu_enabled()) 59 vtime_common_task_switch(prev); 60 } 61 #endif /* __ARCH_HAS_VTIME_TASK_SWITCH */ 62 63 extern void vtime_account_system(struct task_struct *tsk); 64 extern void vtime_account_idle(struct task_struct *tsk); 65 extern void vtime_account_user(struct task_struct *tsk); 66 67 #ifdef __ARCH_HAS_VTIME_ACCOUNT 68 extern void vtime_account_irq_enter(struct task_struct *tsk); 69 #else 70 extern void vtime_common_account_irq_enter(struct task_struct *tsk); 71 static inline void vtime_account_irq_enter(struct task_struct *tsk) 72 { 73 if (vtime_accounting_cpu_enabled()) 74 vtime_common_account_irq_enter(tsk); 75 } 76 #endif /* __ARCH_HAS_VTIME_ACCOUNT */ 77 78 #else /* !CONFIG_VIRT_CPU_ACCOUNTING */ 79 80 static inline void vtime_task_switch(struct task_struct *prev) { } 81 static inline void vtime_account_system(struct task_struct *tsk) { } 82 static inline void vtime_account_user(struct task_struct *tsk) { } 83 static inline void vtime_account_irq_enter(struct task_struct *tsk) { } 84 #endif /* !CONFIG_VIRT_CPU_ACCOUNTING */ 85 86 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 87 extern void arch_vtime_task_switch(struct task_struct *tsk); 88 extern void vtime_gen_account_irq_exit(struct task_struct *tsk); 89 90 static inline void vtime_account_irq_exit(struct task_struct *tsk) 91 { 92 if (vtime_accounting_cpu_enabled()) 93 vtime_gen_account_irq_exit(tsk); 94 } 95 96 extern void vtime_user_enter(struct task_struct *tsk); 97 98 static inline void vtime_user_exit(struct task_struct *tsk) 99 { 100 vtime_account_user(tsk); 101 } 102 extern void vtime_guest_enter(struct task_struct *tsk); 103 extern void vtime_guest_exit(struct task_struct *tsk); 104 extern void vtime_init_idle(struct task_struct *tsk, int cpu); 105 #else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */ 106 static inline void vtime_account_irq_exit(struct task_struct *tsk) 107 { 108 /* On hard|softirq exit we always account to hard|softirq cputime */ 109 vtime_account_system(tsk); 110 } 111 static inline void vtime_user_enter(struct task_struct *tsk) { } 112 static inline void vtime_user_exit(struct task_struct *tsk) { } 113 static inline void vtime_guest_enter(struct task_struct *tsk) { } 114 static inline void vtime_guest_exit(struct task_struct *tsk) { } 115 static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { } 116 #endif 117 118 #ifdef CONFIG_IRQ_TIME_ACCOUNTING 119 extern void irqtime_account_irq(struct task_struct *tsk); 120 #else 121 static inline void irqtime_account_irq(struct task_struct *tsk) { } 122 #endif 123 124 static inline void account_irq_enter_time(struct task_struct *tsk) 125 { 126 vtime_account_irq_enter(tsk); 127 irqtime_account_irq(tsk); 128 } 129 130 static inline void account_irq_exit_time(struct task_struct *tsk) 131 { 132 vtime_account_irq_exit(tsk); 133 irqtime_account_irq(tsk); 134 } 135 136 #endif /* _LINUX_KERNEL_VTIME_H */ 137