Merge branch 'pm-cpufreq'
[linux-2.6-block.git] / include / linux / vtime.h
... / ...
CommitLineData
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
10struct task_struct;
11
12/*
13 * vtime_accounting_enabled() definitions/declarations
14 */
15#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
16static inline bool vtime_accounting_enabled(void) { return true; }
17#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
18
19#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
20static 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
32static 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
42extern void vtime_task_switch(struct task_struct *prev);
43#else
44extern void vtime_common_task_switch(struct task_struct *prev);
45static 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
52extern void vtime_account_system(struct task_struct *tsk);
53extern void vtime_account_idle(struct task_struct *tsk);
54extern void vtime_account_user(struct task_struct *tsk);
55
56#ifdef __ARCH_HAS_VTIME_ACCOUNT
57extern void vtime_account_irq_enter(struct task_struct *tsk);
58#else
59extern void vtime_common_account_irq_enter(struct task_struct *tsk);
60static 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
69static inline void vtime_task_switch(struct task_struct *prev) { }
70static inline void vtime_account_system(struct task_struct *tsk) { }
71static inline void vtime_account_user(struct task_struct *tsk) { }
72static inline void vtime_account_irq_enter(struct task_struct *tsk) { }
73#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
74
75#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
76extern void arch_vtime_task_switch(struct task_struct *tsk);
77extern void vtime_gen_account_irq_exit(struct task_struct *tsk);
78
79static 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
85extern void vtime_user_enter(struct task_struct *tsk);
86
87static inline void vtime_user_exit(struct task_struct *tsk)
88{
89 vtime_account_user(tsk);
90}
91extern void vtime_guest_enter(struct task_struct *tsk);
92extern void vtime_guest_exit(struct task_struct *tsk);
93extern void vtime_init_idle(struct task_struct *tsk, int cpu);
94#else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */
95static 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}
100static inline void vtime_user_enter(struct task_struct *tsk) { }
101static inline void vtime_user_exit(struct task_struct *tsk) { }
102static inline void vtime_guest_enter(struct task_struct *tsk) { }
103static inline void vtime_guest_exit(struct task_struct *tsk) { }
104static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { }
105#endif
106
107#ifdef CONFIG_IRQ_TIME_ACCOUNTING
108extern void irqtime_account_irq(struct task_struct *tsk);
109#else
110static inline void irqtime_account_irq(struct task_struct *tsk) { }
111#endif
112
113static inline void account_irq_enter_time(struct task_struct *tsk)
114{
115 vtime_account_irq_enter(tsk);
116 irqtime_account_irq(tsk);
117}
118
119static 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 */