You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.3 KiB
49 lines
1.3 KiB
#ifndef _LINUX_CONTEXT_TRACKING_STATE_H |
|
#define _LINUX_CONTEXT_TRACKING_STATE_H |
|
|
|
#include <linux/percpu.h> |
|
#include <linux/static_key.h> |
|
|
|
struct context_tracking { |
|
/* |
|
* When active is false, probes are unset in order |
|
* to minimize overhead: TIF flags are cleared |
|
* and calls to user_enter/exit are ignored. This |
|
* may be further optimized using static keys. |
|
*/ |
|
bool active; |
|
int recursion; |
|
enum ctx_state { |
|
CONTEXT_DISABLED = -1, /* returned by ct_state() if unknown */ |
|
CONTEXT_KERNEL = 0, |
|
CONTEXT_USER, |
|
CONTEXT_GUEST, |
|
} state; |
|
}; |
|
|
|
#ifdef CONFIG_CONTEXT_TRACKING |
|
extern struct static_key context_tracking_enabled; |
|
DECLARE_PER_CPU(struct context_tracking, context_tracking); |
|
|
|
static inline bool context_tracking_is_enabled(void) |
|
{ |
|
return static_key_false(&context_tracking_enabled); |
|
} |
|
|
|
static inline bool context_tracking_cpu_is_enabled(void) |
|
{ |
|
return __this_cpu_read(context_tracking.active); |
|
} |
|
|
|
static inline bool context_tracking_in_user(void) |
|
{ |
|
return __this_cpu_read(context_tracking.state) == CONTEXT_USER; |
|
} |
|
#else |
|
static inline bool context_tracking_in_user(void) { return false; } |
|
static inline bool context_tracking_active(void) { return false; } |
|
static inline bool context_tracking_is_enabled(void) { return false; } |
|
static inline bool context_tracking_cpu_is_enabled(void) { return false; } |
|
#endif /* CONFIG_CONTEXT_TRACKING */ |
|
|
|
#endif
|
|
|