blob: 65aef5e9d04ea1b58c942a3355e521835c876340 [file] [log] [blame]
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +02001#ifndef _LINUX_KERNEL_VTIME_H
2#define _LINUX_KERNEL_VTIME_H
3
Frederic Weisbeckerb0493402013-07-12 03:10:15 +02004#include <linux/context_tracking_state.h>
Frederic Weisbeckera5725ac2013-07-16 18:50:52 +02005#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
6#include <asm/vtime.h>
7#endif
8
Frederic Weisbeckerb0493402013-07-12 03:10:15 +02009
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020010struct task_struct;
11
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020012/*
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010013 * vtime_accounting_cpu_enabled() definitions/declarations
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020014 */
15#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010016static inline bool vtime_accounting_cpu_enabled(void) { return true; }
Rik van Rielb58c3582016-07-13 16:50:02 +020017extern void vtime_account_irq_enter(struct task_struct *tsk);
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020018#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
19
20#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
Frederic Weisbeckere5925392015-11-19 16:47:33 +010021/*
22 * Checks if vtime is enabled on some CPU. Cputime readers want to be careful
23 * in that case and compute the tickless cputime.
24 * For now vtime state is tied to context tracking. We might want to decouple
25 * those later if necessary.
26 */
27static inline bool vtime_accounting_enabled(void)
28{
29 return context_tracking_is_enabled();
30}
31
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010032static inline bool vtime_accounting_cpu_enabled(void)
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020033{
Frederic Weisbeckere5925392015-11-19 16:47:33 +010034 if (vtime_accounting_enabled()) {
Frederic Weisbeckerd0df09e2013-11-06 15:11:57 +010035 if (context_tracking_cpu_is_enabled())
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020036 return true;
37 }
38
39 return false;
40}
41#endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */
42
43#ifndef CONFIG_VIRT_CPU_ACCOUNTING
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010044static inline bool vtime_accounting_cpu_enabled(void) { return false; }
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020045#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
46
47
48/*
49 * Common vtime APIs
50 */
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020051#ifdef CONFIG_VIRT_CPU_ACCOUNTING
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020052
53#ifdef __ARCH_HAS_VTIME_TASK_SWITCH
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020054extern void vtime_task_switch(struct task_struct *prev);
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020055#else
56extern void vtime_common_task_switch(struct task_struct *prev);
57static inline void vtime_task_switch(struct task_struct *prev)
58{
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010059 if (vtime_accounting_cpu_enabled())
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020060 vtime_common_task_switch(prev);
61}
62#endif /* __ARCH_HAS_VTIME_TASK_SWITCH */
63
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020064extern void vtime_account_system(struct task_struct *tsk);
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +010065extern void vtime_account_idle(struct task_struct *tsk);
Frederic Weisbeckerbcebdf82012-11-13 23:51:06 +010066extern void vtime_account_user(struct task_struct *tsk);
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +020067
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +020068#else /* !CONFIG_VIRT_CPU_ACCOUNTING */
Frederic Weisbecker6a616712012-12-16 20:00:34 +010069
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020070static inline void vtime_task_switch(struct task_struct *prev) { }
Frederic Weisbecker11113332012-10-24 18:05:51 +020071static inline void vtime_account_system(struct task_struct *tsk) { }
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020072static inline void vtime_account_user(struct task_struct *tsk) { }
Frederic Weisbecker6a616712012-12-16 20:00:34 +010073static inline void vtime_account_irq_enter(struct task_struct *tsk) { }
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020074#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020075
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020076#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
Frederic Weisbecker6a616712012-12-16 20:00:34 +010077extern void arch_vtime_task_switch(struct task_struct *tsk);
Rik van Rielb58c3582016-07-13 16:50:02 +020078static inline void vtime_account_irq_enter(struct task_struct *tsk) { }
79static inline void vtime_account_irq_exit(struct task_struct *tsk) { }
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020080
Frederic Weisbecker6a616712012-12-16 20:00:34 +010081extern void vtime_user_enter(struct task_struct *tsk);
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020082
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020083static inline void vtime_user_exit(struct task_struct *tsk)
84{
85 vtime_account_user(tsk);
86}
Frederic Weisbecker6a616712012-12-16 20:00:34 +010087extern void vtime_guest_enter(struct task_struct *tsk);
88extern void vtime_guest_exit(struct task_struct *tsk);
Frederic Weisbecker45eacc62013-05-15 22:16:32 +020089extern void vtime_init_idle(struct task_struct *tsk, int cpu);
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020090#else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */
Frederic Weisbecker6a616712012-12-16 20:00:34 +010091static inline void vtime_account_irq_exit(struct task_struct *tsk)
92{
93 /* On hard|softirq exit we always account to hard|softirq cputime */
94 vtime_account_system(tsk);
95}
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020096static inline void vtime_user_enter(struct task_struct *tsk) { }
97static inline void vtime_user_exit(struct task_struct *tsk) { }
Frederic Weisbecker6a616712012-12-16 20:00:34 +010098static inline void vtime_guest_enter(struct task_struct *tsk) { }
99static inline void vtime_guest_exit(struct task_struct *tsk) { }
Frederic Weisbecker45eacc62013-05-15 22:16:32 +0200100static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { }
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +0200101#endif
102
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200103#ifdef CONFIG_IRQ_TIME_ACCOUNTING
104extern void irqtime_account_irq(struct task_struct *tsk);
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +0200105#else
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200106static inline void irqtime_account_irq(struct task_struct *tsk) { }
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +0200107#endif
108
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100109static inline void account_irq_enter_time(struct task_struct *tsk)
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200110{
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100111 vtime_account_irq_enter(tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200112 irqtime_account_irq(tsk);
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200113}
114
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100115static inline void account_irq_exit_time(struct task_struct *tsk)
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200116{
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100117 vtime_account_irq_exit(tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200118 irqtime_account_irq(tsk);
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200119}
120
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +0200121#endif /* _LINUX_KERNEL_VTIME_H */