aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2013-07-11 20:15:49 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2013-08-14 11:14:51 -0400
commite7358b3bc0d7fcec0e7a724477f06db2b0c68e21 (patch)
treec572630fa67687845330d53a2fd12d24c7d83014 /include/linux
parent54461562c90e0ac104764c5a9de637fd9151a1c1 (diff)
context_tracking: Split low level state headers
We plan to use the context tracking static key on inline vtime APIs. For this we need to include the context tracking headers from those of vtime. However vtime headers need to stay low level because they are included in hardirq.h that mostly contains standalone definitions. But context_tracking.h includes sched.h for a few task_struct references, therefore it wouldn't be sensible to include it from vtime.h To solve this, lets split the context tracking headers and move out the pure state definitions that only require a few low level headers. We can safely include that small part in vtime.h later. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Li Zhong <zhong@linux.vnet.ibm.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Kevin Hilman <khilman@linaro.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/context_tracking.h31
-rw-r--r--include/linux/context_tracking_state.h39
2 files changed, 40 insertions, 30 deletions
diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h
index e070ea5dadac..82ec4870e064 100644
--- a/include/linux/context_tracking.h
+++ b/include/linux/context_tracking.h
@@ -2,40 +2,12 @@
2#define _LINUX_CONTEXT_TRACKING_H 2#define _LINUX_CONTEXT_TRACKING_H
3 3
4#include <linux/sched.h> 4#include <linux/sched.h>
5#include <linux/percpu.h>
6#include <linux/vtime.h> 5#include <linux/vtime.h>
7#include <linux/static_key.h> 6#include <linux/context_tracking_state.h>
8#include <asm/ptrace.h> 7#include <asm/ptrace.h>
9 8
10struct context_tracking {
11 /*
12 * When active is false, probes are unset in order
13 * to minimize overhead: TIF flags are cleared
14 * and calls to user_enter/exit are ignored. This
15 * may be further optimized using static keys.
16 */
17 bool active;
18 enum ctx_state {
19 IN_KERNEL = 0,
20 IN_USER,
21 } state;
22};
23
24 9
25#ifdef CONFIG_CONTEXT_TRACKING 10#ifdef CONFIG_CONTEXT_TRACKING
26extern struct static_key context_tracking_enabled;
27DECLARE_PER_CPU(struct context_tracking, context_tracking);
28
29static inline bool context_tracking_in_user(void)
30{
31 return __this_cpu_read(context_tracking.state) == IN_USER;
32}
33
34static inline bool context_tracking_active(void)
35{
36 return __this_cpu_read(context_tracking.active);
37}
38
39extern void context_tracking_cpu_set(int cpu); 11extern void context_tracking_cpu_set(int cpu);
40 12
41extern void context_tracking_user_enter(void); 13extern void context_tracking_user_enter(void);
@@ -83,7 +55,6 @@ static inline void context_tracking_task_switch(struct task_struct *prev,
83 __context_tracking_task_switch(prev, next); 55 __context_tracking_task_switch(prev, next);
84} 56}
85#else 57#else
86static inline bool context_tracking_in_user(void) { return false; }
87static inline void user_enter(void) { } 58static inline void user_enter(void) { }
88static inline void user_exit(void) { } 59static inline void user_exit(void) { }
89static inline enum ctx_state exception_enter(void) { return 0; } 60static inline enum ctx_state exception_enter(void) { return 0; }
diff --git a/include/linux/context_tracking_state.h b/include/linux/context_tracking_state.h
new file mode 100644
index 000000000000..0f1979d0674f
--- /dev/null
+++ b/include/linux/context_tracking_state.h
@@ -0,0 +1,39 @@
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 enum ctx_state {
16 IN_KERNEL = 0,
17 IN_USER,
18 } state;
19};
20
21#ifdef CONFIG_CONTEXT_TRACKING
22extern struct static_key context_tracking_enabled;
23DECLARE_PER_CPU(struct context_tracking, context_tracking);
24
25static inline bool context_tracking_in_user(void)
26{
27 return __this_cpu_read(context_tracking.state) == IN_USER;
28}
29
30static inline bool context_tracking_active(void)
31{
32 return __this_cpu_read(context_tracking.active);
33}
34#else
35static inline bool context_tracking_in_user(void) { return false; }
36static inline bool context_tracking_active(void) { return false; }
37#endif /* CONFIG_CONTEXT_TRACKING */
38
39#endif