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; | |
aed5ed47 | 15 | int recursion; |
e7358b3b | 16 | enum ctx_state { |
f9281648 | 17 | CONTEXT_DISABLED = -1, /* returned by ct_state() if unknown */ |
c467ea76 FW |
18 | CONTEXT_KERNEL = 0, |
19 | CONTEXT_USER, | |
126a6a54 | 20 | CONTEXT_GUEST, |
e7358b3b FW |
21 | } state; |
22 | }; | |
23 | ||
24 | #ifdef CONFIG_CONTEXT_TRACKING | |
ed11a7f1 | 25 | extern struct static_key_false context_tracking_enabled; |
e7358b3b FW |
26 | DECLARE_PER_CPU(struct context_tracking, context_tracking); |
27 | ||
58135f57 FW |
28 | static inline bool context_tracking_is_enabled(void) |
29 | { | |
ed11a7f1 | 30 | return static_branch_unlikely(&context_tracking_enabled); |
58135f57 | 31 | } |
d0df09eb FW |
32 | |
33 | static inline bool context_tracking_cpu_is_enabled(void) | |
e7358b3b | 34 | { |
d0df09eb | 35 | return __this_cpu_read(context_tracking.active); |
e7358b3b FW |
36 | } |
37 | ||
d0df09eb | 38 | static inline bool context_tracking_in_user(void) |
e7358b3b | 39 | { |
c467ea76 | 40 | return __this_cpu_read(context_tracking.state) == CONTEXT_USER; |
e7358b3b FW |
41 | } |
42 | #else | |
43 | static inline bool context_tracking_in_user(void) { return false; } | |
44 | static inline bool context_tracking_active(void) { return false; } | |
a3a9c7df RR |
45 | static inline bool context_tracking_is_enabled(void) { return false; } |
46 | static inline bool context_tracking_cpu_is_enabled(void) { return false; } | |
e7358b3b FW |
47 | #endif /* CONFIG_CONTEXT_TRACKING */ |
48 | ||
49 | #endif |