Commit | Line | Data |
---|---|---|
91d1aa43 FW |
1 | #ifndef _LINUX_CONTEXT_TRACKING_H |
2 | #define _LINUX_CONTEXT_TRACKING_H | |
3 | ||
91d1aa43 | 4 | #include <linux/sched.h> |
521921ba | 5 | #include <linux/vtime.h> |
e7358b3b | 6 | #include <linux/context_tracking_state.h> |
56dd9470 | 7 | #include <asm/ptrace.h> |
95a79fd4 | 8 | |
521921ba | 9 | |
6c1e0256 | 10 | #ifdef CONFIG_CONTEXT_TRACKING |
2e709338 FW |
11 | extern void context_tracking_cpu_set(int cpu); |
12 | ||
ad65782f FW |
13 | extern void context_tracking_user_enter(void); |
14 | extern void context_tracking_user_exit(void); | |
73d424f9 FW |
15 | extern void __context_tracking_task_switch(struct task_struct *prev, |
16 | struct task_struct *next); | |
ad65782f FW |
17 | |
18 | static inline void user_enter(void) | |
19 | { | |
20 | if (static_key_false(&context_tracking_enabled)) | |
21 | context_tracking_user_enter(); | |
22 | ||
23 | } | |
24 | static inline void user_exit(void) | |
25 | { | |
26 | if (static_key_false(&context_tracking_enabled)) | |
27 | context_tracking_user_exit(); | |
28 | } | |
56dd9470 | 29 | |
6c1e0256 | 30 | static inline enum ctx_state exception_enter(void) |
56dd9470 | 31 | { |
6c1e0256 FW |
32 | enum ctx_state prev_ctx; |
33 | ||
ad65782f FW |
34 | if (!static_key_false(&context_tracking_enabled)) |
35 | return 0; | |
36 | ||
6c1e0256 | 37 | prev_ctx = this_cpu_read(context_tracking.state); |
ad65782f | 38 | context_tracking_user_exit(); |
6c1e0256 FW |
39 | |
40 | return prev_ctx; | |
56dd9470 FW |
41 | } |
42 | ||
6c1e0256 | 43 | static inline void exception_exit(enum ctx_state prev_ctx) |
56dd9470 | 44 | { |
ad65782f FW |
45 | if (static_key_false(&context_tracking_enabled)) { |
46 | if (prev_ctx == IN_USER) | |
47 | context_tracking_user_enter(); | |
48 | } | |
56dd9470 FW |
49 | } |
50 | ||
73d424f9 FW |
51 | static inline void context_tracking_task_switch(struct task_struct *prev, |
52 | struct task_struct *next) | |
53 | { | |
54 | if (static_key_false(&context_tracking_enabled)) | |
55 | __context_tracking_task_switch(prev, next); | |
56 | } | |
91d1aa43 FW |
57 | #else |
58 | static inline void user_enter(void) { } | |
59 | static inline void user_exit(void) { } | |
2d854e57 FW |
60 | static inline enum ctx_state exception_enter(void) { return 0; } |
61 | static inline void exception_exit(enum ctx_state prev_ctx) { } | |
62 | static inline void context_tracking_task_switch(struct task_struct *prev, | |
63 | struct task_struct *next) { } | |
64 | #endif /* !CONFIG_CONTEXT_TRACKING */ | |
521921ba | 65 | |
65f382fd FW |
66 | |
67 | #ifdef CONFIG_CONTEXT_TRACKING_FORCE | |
68 | extern void context_tracking_init(void); | |
69 | #else | |
70 | static inline void context_tracking_init(void) { } | |
71 | #endif /* CONFIG_CONTEXT_TRACKING_FORCE */ | |
72 | ||
73 | ||
2d854e57 | 74 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN |
48d6a816 FW |
75 | static inline void guest_enter(void) |
76 | { | |
b0493406 | 77 | if (vtime_accounting_enabled()) |
48d6a816 FW |
78 | vtime_guest_enter(current); |
79 | else | |
80 | current->flags |= PF_VCPU; | |
81 | } | |
82 | ||
83 | static inline void guest_exit(void) | |
84 | { | |
b0493406 | 85 | if (vtime_accounting_enabled()) |
48d6a816 FW |
86 | vtime_guest_exit(current); |
87 | else | |
88 | current->flags &= ~PF_VCPU; | |
89 | } | |
73d424f9 | 90 | |
2d854e57 | 91 | #else |
521921ba FW |
92 | static inline void guest_enter(void) |
93 | { | |
2d854e57 | 94 | /* |
5b206d48 FW |
95 | * This is running in ioctl context so its safe |
96 | * to assume that it's the stime pending cputime | |
97 | * to flush. | |
2d854e57 FW |
98 | */ |
99 | vtime_account_system(current); | |
100 | current->flags |= PF_VCPU; | |
521921ba FW |
101 | } |
102 | ||
103 | static inline void guest_exit(void) | |
104 | { | |
5b206d48 | 105 | /* Flush the guest cputime we spent on the guest */ |
2d854e57 FW |
106 | vtime_account_system(current); |
107 | current->flags &= ~PF_VCPU; | |
521921ba | 108 | } |
2d854e57 | 109 | #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ |
91d1aa43 FW |
110 | |
111 | #endif |