blob: 0fc7f11f7aa4224106d42602c3dc01231554a5f0 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +02002#ifndef _LINUX_KERNEL_VTIME_H
3#define _LINUX_KERNEL_VTIME_H
4
Frederic Weisbeckerb0493402013-07-12 03:10:15 +02005#include <linux/context_tracking_state.h>
Frederic Weisbeckera5725ac2013-07-16 18:50:52 +02006#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
7#include <asm/vtime.h>
8#endif
9
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020010
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020011struct task_struct;
12
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020013/*
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010014 * vtime_accounting_cpu_enabled() definitions/declarations
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020015 */
Frederic Weisbecker8612f172016-07-13 16:50:04 +020016#if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE)
Frederic Weisbecker8d495472019-10-03 18:17:45 +020017
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010018static inline bool vtime_accounting_cpu_enabled(void) { return true; }
Frederic Weisbecker8d495472019-10-03 18:17:45 +020019extern void vtime_task_switch(struct task_struct *prev);
20
Frederic Weisbecker8612f172016-07-13 16:50:04 +020021#elif defined(CONFIG_VIRT_CPU_ACCOUNTING_GEN)
Frederic Weisbecker8d495472019-10-03 18:17:45 +020022
Frederic Weisbeckere5925392015-11-19 16:47:33 +010023/*
24 * Checks if vtime is enabled on some CPU. Cputime readers want to be careful
25 * in that case and compute the tickless cputime.
26 * For now vtime state is tied to context tracking. We might want to decouple
27 * those later if necessary.
28 */
29static inline bool vtime_accounting_enabled(void)
30{
Frederic Weisbecker74c57872019-10-16 04:56:51 +020031 return context_tracking_enabled();
Frederic Weisbeckere5925392015-11-19 16:47:33 +010032}
33
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010034static inline bool vtime_accounting_cpu_enabled(void)
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020035{
Frederic Weisbeckere5925392015-11-19 16:47:33 +010036 if (vtime_accounting_enabled()) {
Frederic Weisbeckerd0df09e2013-11-06 15:11:57 +010037 if (context_tracking_cpu_is_enabled())
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020038 return true;
39 }
40
41 return false;
42}
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020043
Frederic Weisbecker8d495472019-10-03 18:17:45 +020044extern void vtime_task_switch_generic(struct task_struct *prev);
45
46static inline void vtime_task_switch(struct task_struct *prev)
47{
48 if (vtime_accounting_cpu_enabled())
49 vtime_task_switch_generic(prev);
50}
51
52#else /* !CONFIG_VIRT_CPU_ACCOUNTING */
53
54static inline bool vtime_accounting_cpu_enabled(void) { return false; }
55static inline void vtime_task_switch(struct task_struct *prev) { }
56
57#endif
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020058
59/*
60 * Common vtime APIs
61 */
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020062#ifdef CONFIG_VIRT_CPU_ACCOUNTING
Frederic Weisbeckerf83eeb12019-10-03 18:17:44 +020063extern void vtime_account_kernel(struct task_struct *tsk);
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +010064extern void vtime_account_idle(struct task_struct *tsk);
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +020065#else /* !CONFIG_VIRT_CPU_ACCOUNTING */
Frederic Weisbeckerf83eeb12019-10-03 18:17:44 +020066static inline void vtime_account_kernel(struct task_struct *tsk) { }
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020067#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020068
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020069#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
Frederic Weisbecker6a616712012-12-16 20:00:34 +010070extern void arch_vtime_task_switch(struct task_struct *tsk);
Frederic Weisbecker6a616712012-12-16 20:00:34 +010071extern void vtime_user_enter(struct task_struct *tsk);
Frederic Weisbecker1c3eda02017-06-29 19:15:07 +020072extern void vtime_user_exit(struct task_struct *tsk);
Frederic Weisbecker6a616712012-12-16 20:00:34 +010073extern void vtime_guest_enter(struct task_struct *tsk);
74extern void vtime_guest_exit(struct task_struct *tsk);
Frederic Weisbecker45eacc62013-05-15 22:16:32 +020075extern void vtime_init_idle(struct task_struct *tsk, int cpu);
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020076#else /* !CONFIG_VIRT_CPU_ACCOUNTING_GEN */
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020077static inline void vtime_user_enter(struct task_struct *tsk) { }
78static inline void vtime_user_exit(struct task_struct *tsk) { }
Frederic Weisbecker6a616712012-12-16 20:00:34 +010079static inline void vtime_guest_enter(struct task_struct *tsk) { }
80static inline void vtime_guest_exit(struct task_struct *tsk) { }
Frederic Weisbecker45eacc62013-05-15 22:16:32 +020081static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { }
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020082#endif
83
Frederic Weisbecker8612f172016-07-13 16:50:04 +020084#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
85extern void vtime_account_irq_enter(struct task_struct *tsk);
86static inline void vtime_account_irq_exit(struct task_struct *tsk)
87{
88 /* On hard|softirq exit we always account to hard|softirq cputime */
Frederic Weisbeckerf83eeb12019-10-03 18:17:44 +020089 vtime_account_kernel(tsk);
Frederic Weisbecker8612f172016-07-13 16:50:04 +020090}
Frederic Weisbeckerc8d7dab2017-01-05 18:11:50 +010091extern void vtime_flush(struct task_struct *tsk);
Frederic Weisbecker8612f172016-07-13 16:50:04 +020092#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
93static inline void vtime_account_irq_enter(struct task_struct *tsk) { }
94static inline void vtime_account_irq_exit(struct task_struct *tsk) { }
Frederic Weisbeckerc8d7dab2017-01-05 18:11:50 +010095static inline void vtime_flush(struct task_struct *tsk) { }
Frederic Weisbecker8612f172016-07-13 16:50:04 +020096#endif
97
98
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020099#ifdef CONFIG_IRQ_TIME_ACCOUNTING
100extern void irqtime_account_irq(struct task_struct *tsk);
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +0200101#else
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200102static inline void irqtime_account_irq(struct task_struct *tsk) { }
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +0200103#endif
104
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100105static inline void account_irq_enter_time(struct task_struct *tsk)
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200106{
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100107 vtime_account_irq_enter(tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200108 irqtime_account_irq(tsk);
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200109}
110
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100111static inline void account_irq_exit_time(struct task_struct *tsk)
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200112{
Frederic Weisbecker6a616712012-12-16 20:00:34 +0100113 vtime_account_irq_exit(tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +0200114 irqtime_account_irq(tsk);
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +0200115}
116
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +0200117#endif /* _LINUX_KERNEL_VTIME_H */