xref: /linux/include/linux/vtime.h (revision 564eb714f5f09ac733c26860d5f0831f213fbdf1)
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_enabled() definitions/declarations
14  */
15 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
16 static inline bool vtime_accounting_enabled(void) { return true; }
17 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
18 
19 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
20 static inline bool vtime_accounting_enabled(void)
21 {
22 	if (static_key_false(&context_tracking_enabled)) {
23 		if (context_tracking_active())
24 			return true;
25 	}
26 
27 	return false;
28 }
29 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */
30 
31 #ifndef CONFIG_VIRT_CPU_ACCOUNTING
32 static inline bool vtime_accounting_enabled(void) { return false; }
33 #endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
34 
35 
36 /*
37  * Common vtime APIs
38  */
39 #ifdef CONFIG_VIRT_CPU_ACCOUNTING
40 
41 #ifdef __ARCH_HAS_VTIME_TASK_SWITCH
42 extern void vtime_task_switch(struct task_struct *prev);
43 #else
44 extern void vtime_common_task_switch(struct task_struct *prev);
45 static inline void vtime_task_switch(struct task_struct *prev)
46 {
47 	if (vtime_accounting_enabled())
48 		vtime_common_task_switch(prev);
49 }
50 #endif /* __ARCH_HAS_VTIME_TASK_SWITCH */
51 
52 extern void vtime_account_system(struct task_struct *tsk);
53 extern void vtime_account_idle(struct task_struct *tsk);
54 extern void vtime_account_user(struct task_struct *tsk);
55 
56 #ifdef __ARCH_HAS_VTIME_ACCOUNT
57 extern void vtime_account_irq_enter(struct task_struct *tsk);
58 #else
59 extern void vtime_common_account_irq_enter(struct task_struct *tsk);
60 static inline void vtime_account_irq_enter(struct task_struct *tsk)
61 {
62 	if (vtime_accounting_enabled())
63 		vtime_common_account_irq_enter(tsk);
64 }
65 #endif /* __ARCH_HAS_VTIME_ACCOUNT */
66 
67 #else /* !CONFIG_VIRT_CPU_ACCOUNTING */
68 
69 static inline void vtime_task_switch(struct task_struct *prev) { }
70 static inline void vtime_account_system(struct task_struct *tsk) { }
71 static inline void vtime_account_user(struct task_struct *tsk) { }
72 static inline void vtime_account_irq_enter(struct task_struct *tsk) { }
73 #endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
74 
75 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
76 extern void arch_vtime_task_switch(struct task_struct *tsk);
77 extern void vtime_gen_account_irq_exit(struct task_struct *tsk);
78 
79 static inline void vtime_account_irq_exit(struct task_struct *tsk)
80 {
81 	if (vtime_accounting_enabled())
82 		vtime_gen_account_irq_exit(tsk);
83 }
84 
85 extern void vtime_user_enter(struct task_struct *tsk);
86 
87 static inline void vtime_user_exit(struct task_struct *tsk)
88 {
89 	vtime_account_user(tsk);
90 }
91 extern void vtime_guest_enter(struct task_struct *tsk);
92 extern void vtime_guest_exit(struct task_struct *tsk);
93 extern void vtime_init_idle(struct task_struct *tsk, int cpu);
94 #else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN  */
95 static inline void vtime_account_irq_exit(struct task_struct *tsk)
96 {
97 	/* On hard|softirq exit we always account to hard|softirq cputime */
98 	vtime_account_system(tsk);
99 }
100 static inline void vtime_user_enter(struct task_struct *tsk) { }
101 static inline void vtime_user_exit(struct task_struct *tsk) { }
102 static inline void vtime_guest_enter(struct task_struct *tsk) { }
103 static inline void vtime_guest_exit(struct task_struct *tsk) { }
104 static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { }
105 #endif
106 
107 #ifdef CONFIG_IRQ_TIME_ACCOUNTING
108 extern void irqtime_account_irq(struct task_struct *tsk);
109 #else
110 static inline void irqtime_account_irq(struct task_struct *tsk) { }
111 #endif
112 
113 static inline void account_irq_enter_time(struct task_struct *tsk)
114 {
115 	vtime_account_irq_enter(tsk);
116 	irqtime_account_irq(tsk);
117 }
118 
119 static inline void account_irq_exit_time(struct task_struct *tsk)
120 {
121 	vtime_account_irq_exit(tsk);
122 	irqtime_account_irq(tsk);
123 }
124 
125 #endif /* _LINUX_KERNEL_VTIME_H */
126