blob: a26ed10a4eac5dd767dc5923a64fc5e8da314304 [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 Weisbecker55dbdcf2015-11-19 16:47:32 +010017static inline bool vtime_accounting_cpu_enabled(void) { return true; }
Frederic Weisbecker8612f172016-07-13 16:50:04 +020018#elif defined(CONFIG_VIRT_CPU_ACCOUNTING_GEN)
Frederic Weisbeckere5925392015-11-19 16:47:33 +010019/*
20 * Checks if vtime is enabled on some CPU. Cputime readers want to be careful
21 * in that case and compute the tickless cputime.
22 * For now vtime state is tied to context tracking. We might want to decouple
23 * those later if necessary.
24 */
25static inline bool vtime_accounting_enabled(void)
26{
27 return context_tracking_is_enabled();
28}
29
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010030static inline bool vtime_accounting_cpu_enabled(void)
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020031{
Frederic Weisbeckere5925392015-11-19 16:47:33 +010032 if (vtime_accounting_enabled()) {
Frederic Weisbeckerd0df09e2013-11-06 15:11:57 +010033 if (context_tracking_cpu_is_enabled())
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020034 return true;
35 }
36
37 return false;
38}
Frederic Weisbecker8612f172016-07-13 16:50:04 +020039#else /* !CONFIG_VIRT_CPU_ACCOUNTING */
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010040static inline bool vtime_accounting_cpu_enabled(void) { return false; }
Frederic Weisbecker8612f172016-07-13 16:50:04 +020041#endif
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020042
43
44/*
45 * Common vtime APIs
46 */
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020047#ifdef CONFIG_VIRT_CPU_ACCOUNTING
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020048
49#ifdef __ARCH_HAS_VTIME_TASK_SWITCH
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020050extern void vtime_task_switch(struct task_struct *prev);
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020051#else
52extern void vtime_common_task_switch(struct task_struct *prev);
53static inline void vtime_task_switch(struct task_struct *prev)
54{
Frederic Weisbecker55dbdcf2015-11-19 16:47:32 +010055 if (vtime_accounting_cpu_enabled())
Frederic Weisbeckerb0493402013-07-12 03:10:15 +020056 vtime_common_task_switch(prev);
57}
58#endif /* __ARCH_HAS_VTIME_TASK_SWITCH */
59
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020060extern void vtime_account_system(struct task_struct *tsk);
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +010061extern void vtime_account_idle(struct task_struct *tsk);
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +020062
Frederic Weisbecker3f4724e2012-07-16 18:00:34 +020063#else /* !CONFIG_VIRT_CPU_ACCOUNTING */
Frederic Weisbecker6a616712012-12-16 20:00:34 +010064
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020065static inline void vtime_task_switch(struct task_struct *prev) { }
Frederic Weisbecker11113332012-10-24 18:05:51 +020066static inline void vtime_account_system(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 */
89 vtime_account_system(tsk);
90}
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 */