Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
7struct 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 int recursion;
16 enum ctx_state {
17 CONTEXT_KERNEL = 0,
18 CONTEXT_USER,
19 CONTEXT_GUEST,
20 } state;
21};
22
23#ifdef CONFIG_CONTEXT_TRACKING
24extern struct static_key context_tracking_enabled;
25DECLARE_PER_CPU(struct context_tracking, context_tracking);
26
27static inline bool context_tracking_is_enabled(void)
28{
29 return static_key_false(&context_tracking_enabled);
30}
31
32static inline bool context_tracking_cpu_is_enabled(void)
33{
34 return __this_cpu_read(context_tracking.active);
35}
36
37static inline bool context_tracking_in_user(void)
38{
39 return __this_cpu_read(context_tracking.state) == CONTEXT_USER;
40}
41#else
42static inline bool context_tracking_in_user(void) { return false; }
43static inline bool context_tracking_active(void) { return false; }
44static inline bool context_tracking_is_enabled(void) { return false; }
45static inline bool context_tracking_cpu_is_enabled(void) { return false; }
46#endif /* CONFIG_CONTEXT_TRACKING */
47
48#endif