blob: 21ef703d1b25c1856712c4d02996741a117b2185 [file] [log] [blame]
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +02001#ifndef _LINUX_KERNEL_VTIME_H
2#define _LINUX_KERNEL_VTIME_H
3
4struct task_struct;
5
6#ifdef CONFIG_VIRT_CPU_ACCOUNTING
7extern void vtime_task_switch(struct task_struct *prev);
8extern void vtime_account_system(struct task_struct *tsk);
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +01009extern void vtime_account_system_irqsafe(struct task_struct *tsk);
10extern void vtime_account_idle(struct task_struct *tsk);
Frederic Weisbeckerbcebdf82012-11-13 23:51:06 +010011extern void vtime_account_user(struct task_struct *tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020012extern void vtime_account(struct task_struct *tsk);
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020013#else
14static inline void vtime_task_switch(struct task_struct *prev) { }
Frederic Weisbecker11113332012-10-24 18:05:51 +020015static inline void vtime_account_system(struct task_struct *tsk) { }
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +010016static inline void vtime_account_system_irqsafe(struct task_struct *tsk) { }
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020017static inline void vtime_account_user(struct task_struct *tsk) { }
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020018static inline void vtime_account(struct task_struct *tsk) { }
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020019#endif
20
Frederic Weisbeckerabf917c2012-07-25 07:56:04 +020021#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
22static inline void arch_vtime_task_switch(struct task_struct *tsk) { }
23static inline void vtime_user_enter(struct task_struct *tsk)
24{
25 vtime_account_system(tsk);
26}
27static inline void vtime_user_exit(struct task_struct *tsk)
28{
29 vtime_account_user(tsk);
30}
31#else
32static inline void vtime_user_enter(struct task_struct *tsk) { }
33static inline void vtime_user_exit(struct task_struct *tsk) { }
34#endif
35
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020036#ifdef CONFIG_IRQ_TIME_ACCOUNTING
37extern void irqtime_account_irq(struct task_struct *tsk);
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020038#else
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020039static inline void irqtime_account_irq(struct task_struct *tsk) { }
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020040#endif
41
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +020042static inline void vtime_account_irq_enter(struct task_struct *tsk)
43{
44 /*
45 * Hardirq can interrupt idle task anytime. So we need vtime_account()
46 * that performs the idle check in CONFIG_VIRT_CPU_ACCOUNTING.
47 * Softirq can also interrupt idle task directly if it calls
48 * local_bh_enable(). Such case probably don't exist but we never know.
49 * Ksoftirqd is not concerned because idle time is flushed on context
50 * switch. Softirqs in the end of hardirqs are also not a problem because
51 * the idle time is flushed on hardirq time already.
52 */
53 vtime_account(tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020054 irqtime_account_irq(tsk);
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +020055}
56
57static inline void vtime_account_irq_exit(struct task_struct *tsk)
58{
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +020059 /* On hard|softirq exit we always account to hard|softirq cputime */
Frederic Weisbeckerfd25b4c2012-11-13 18:21:22 +010060 vtime_account_system(tsk);
Frederic Weisbecker3e1df4f52012-10-06 05:23:22 +020061 irqtime_account_irq(tsk);
Frederic Weisbeckerfa5058f2012-10-06 04:07:19 +020062}
63
Frederic Weisbeckerdcbf8322012-10-05 23:07:19 +020064#endif /* _LINUX_KERNEL_VTIME_H */