Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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_cpu_enabled() definitions/declarations
14 */
15#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
16static 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 */
26static inline bool vtime_accounting_enabled(void)
27{
28 return context_tracking_is_enabled();
29}
30
31static 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
43static 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
53extern void vtime_task_switch(struct task_struct *prev);
54#else
55extern void vtime_common_task_switch(struct task_struct *prev);
56static 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
63extern void vtime_account_system(struct task_struct *tsk);
64extern void vtime_account_idle(struct task_struct *tsk);
65extern void vtime_account_user(struct task_struct *tsk);
66
67#ifdef __ARCH_HAS_VTIME_ACCOUNT
68extern void vtime_account_irq_enter(struct task_struct *tsk);
69#else
70extern void vtime_common_account_irq_enter(struct task_struct *tsk);
71static 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
80static inline void vtime_task_switch(struct task_struct *prev) { }
81static inline void vtime_account_system(struct task_struct *tsk) { }
82static inline void vtime_account_user(struct task_struct *tsk) { }
83static inline void vtime_account_irq_enter(struct task_struct *tsk) { }
84#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
85
86#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
87extern void arch_vtime_task_switch(struct task_struct *tsk);
88extern void vtime_gen_account_irq_exit(struct task_struct *tsk);
89
90static 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
96extern void vtime_user_enter(struct task_struct *tsk);
97
98static inline void vtime_user_exit(struct task_struct *tsk)
99{
100 vtime_account_user(tsk);
101}
102extern void vtime_guest_enter(struct task_struct *tsk);
103extern void vtime_guest_exit(struct task_struct *tsk);
104extern void vtime_init_idle(struct task_struct *tsk, int cpu);
105#else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */
106static 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}
111static inline void vtime_user_enter(struct task_struct *tsk) { }
112static inline void vtime_user_exit(struct task_struct *tsk) { }
113static inline void vtime_guest_enter(struct task_struct *tsk) { }
114static inline void vtime_guest_exit(struct task_struct *tsk) { }
115static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { }
116#endif
117
118#ifdef CONFIG_IRQ_TIME_ACCOUNTING
119extern void irqtime_account_irq(struct task_struct *tsk);
120#else
121static inline void irqtime_account_irq(struct task_struct *tsk) { }
122#endif
123
124static inline void account_irq_enter_time(struct task_struct *tsk)
125{
126 vtime_account_irq_enter(tsk);
127 irqtime_account_irq(tsk);
128}
129
130static 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 */