aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2013-07-11 13:12:32 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2013-08-14 11:12:46 -0400
commit65f382fd0c8fa483713c0971de9f1dfb4cf1ad9c (patch)
treedec89c43fcfb4934611bae4855293428382856b9
parentd84d27a491880b9902b45c09be8d9e9464fb9b74 (diff)
context_tracking: Ground setup for static key use
Prepare for using a static key in the context tracking subsystem. This will help optimizing the off case on its many users: * user_enter, user_exit, exception_enter, exception_exit, guest_enter, guest_exit, vtime_*() 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>
-rw-r--r--include/linux/context_tracking.h10
-rw-r--r--init/main.c2
-rw-r--r--kernel/context_tracking.c23
3 files changed, 29 insertions, 6 deletions
diff --git a/include/linux/context_tracking.h b/include/linux/context_tracking.h
index 1ae37c708c63..c138c24bad1a 100644
--- a/include/linux/context_tracking.h
+++ b/include/linux/context_tracking.h
@@ -4,6 +4,7 @@
4#include <linux/sched.h> 4#include <linux/sched.h>
5#include <linux/percpu.h> 5#include <linux/percpu.h>
6#include <linux/vtime.h> 6#include <linux/vtime.h>
7#include <linux/static_key.h>
7#include <asm/ptrace.h> 8#include <asm/ptrace.h>
8 9
9struct context_tracking { 10struct context_tracking {
@@ -22,6 +23,7 @@ struct context_tracking {
22 23
23 24
24#ifdef CONFIG_CONTEXT_TRACKING 25#ifdef CONFIG_CONTEXT_TRACKING
26extern struct static_key context_tracking_enabled;
25DECLARE_PER_CPU(struct context_tracking, context_tracking); 27DECLARE_PER_CPU(struct context_tracking, context_tracking);
26 28
27static inline bool context_tracking_in_user(void) 29static inline bool context_tracking_in_user(void)
@@ -67,6 +69,14 @@ static inline void context_tracking_task_switch(struct task_struct *prev,
67 struct task_struct *next) { } 69 struct task_struct *next) { }
68#endif /* !CONFIG_CONTEXT_TRACKING */ 70#endif /* !CONFIG_CONTEXT_TRACKING */
69 71
72
73#ifdef CONFIG_CONTEXT_TRACKING_FORCE
74extern void context_tracking_init(void);
75#else
76static inline void context_tracking_init(void) { }
77#endif /* CONFIG_CONTEXT_TRACKING_FORCE */
78
79
70#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 80#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
71extern void guest_enter(void); 81extern void guest_enter(void);
72extern void guest_exit(void); 82extern void guest_exit(void);
diff --git a/init/main.c b/init/main.c
index d03d2ec2eacf..af310afbef28 100644
--- a/init/main.c
+++ b/init/main.c
@@ -75,6 +75,7 @@
75#include <linux/blkdev.h> 75#include <linux/blkdev.h>
76#include <linux/elevator.h> 76#include <linux/elevator.h>
77#include <linux/sched_clock.h> 77#include <linux/sched_clock.h>
78#include <linux/context_tracking.h>
78 79
79#include <asm/io.h> 80#include <asm/io.h>
80#include <asm/bugs.h> 81#include <asm/bugs.h>
@@ -545,6 +546,7 @@ asmlinkage void __init start_kernel(void)
545 idr_init_cache(); 546 idr_init_cache();
546 rcu_init(); 547 rcu_init();
547 tick_nohz_init(); 548 tick_nohz_init();
549 context_tracking_init();
548 radix_tree_init(); 550 radix_tree_init();
549 /* init some links before init_ISA_irqs() */ 551 /* init some links before init_ISA_irqs() */
550 early_irq_init(); 552 early_irq_init();
diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c
index 72bcb2570d3e..839d377d0da5 100644
--- a/kernel/context_tracking.c
+++ b/kernel/context_tracking.c
@@ -20,15 +20,16 @@
20#include <linux/hardirq.h> 20#include <linux/hardirq.h>
21#include <linux/export.h> 21#include <linux/export.h>
22 22
23DEFINE_PER_CPU(struct context_tracking, context_tracking) = { 23struct static_key context_tracking_enabled = STATIC_KEY_INIT_FALSE;
24#ifdef CONFIG_CONTEXT_TRACKING_FORCE 24
25 .active = true, 25DEFINE_PER_CPU(struct context_tracking, context_tracking);
26#endif
27};
28 26
29void context_tracking_cpu_set(int cpu) 27void context_tracking_cpu_set(int cpu)
30{ 28{
31 per_cpu(context_tracking.active, cpu) = true; 29 if (!per_cpu(context_tracking.active, cpu)) {
30 per_cpu(context_tracking.active, cpu) = true;
31 static_key_slow_inc(&context_tracking_enabled);
32 }
32} 33}
33 34
34/** 35/**
@@ -202,3 +203,13 @@ void context_tracking_task_switch(struct task_struct *prev,
202 clear_tsk_thread_flag(prev, TIF_NOHZ); 203 clear_tsk_thread_flag(prev, TIF_NOHZ);
203 set_tsk_thread_flag(next, TIF_NOHZ); 204 set_tsk_thread_flag(next, TIF_NOHZ);
204} 205}
206
207#ifdef CONFIG_CONTEXT_TRACKING_FORCE
208void __init context_tracking_init(void)
209{
210 int cpu;
211
212 for_each_possible_cpu(cpu)
213 context_tracking_cpu_set(cpu);
214}
215#endif