Commit | Line | Data |
---|---|---|
e7358b3b FW |
1 | #ifndef _LINUX_CONTEXT_TRACKING_STATE_H |
2 | #define _LINUX_CONTEXT_TRACKING_STATE_H | |
3 | ||
4 | #include <linux/percpu.h> | |
5 | #include <linux/static_key.h> | |
6 | ||
7 | struct context_tracking { | |
8 | /* | |
9 | * When active is false, probes are unset in order | |
10 | * to minimize overhead: TIF flags are cleared | |
11 | * and calls to user_enter/exit are ignored. This | |
12 | * may be further optimized using static keys. | |
13 | */ | |
14 | bool active; | |
15 | enum ctx_state { | |
16 | IN_KERNEL = 0, | |
17 | IN_USER, | |
18 | } state; | |
19 | }; | |
20 | ||
21 | #ifdef CONFIG_CONTEXT_TRACKING | |
22 | extern struct static_key context_tracking_enabled; | |
23 | DECLARE_PER_CPU(struct context_tracking, context_tracking); | |
24 | ||
58135f57 FW |
25 | static inline bool context_tracking_is_enabled(void) |
26 | { | |
27 | return static_key_false(&context_tracking_enabled); | |
28 | } | |
d0df09eb FW |
29 | |
30 | static inline bool context_tracking_cpu_is_enabled(void) | |
e7358b3b | 31 | { |
d0df09eb | 32 | return __this_cpu_read(context_tracking.active); |
e7358b3b FW |
33 | } |
34 | ||
d0df09eb | 35 | static inline bool context_tracking_in_user(void) |
e7358b3b | 36 | { |
d0df09eb | 37 | return __this_cpu_read(context_tracking.state) == IN_USER; |
e7358b3b FW |
38 | } |
39 | #else | |
40 | static inline bool context_tracking_in_user(void) { return false; } | |
41 | static inline bool context_tracking_active(void) { return false; } | |
42 | #endif /* CONFIG_CONTEXT_TRACKING */ | |
43 | ||
44 | #endif |