Merge tag 'pm+acpi-4.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[firefly-linux-kernel-4.4.55.git] / include / linux / vtime.h
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 (context_tracking_is_enabled()) {
23                 if (context_tracking_cpu_is_enabled())
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 */