aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2013-07-11 21:10:15 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2013-08-14 11:14:54 -0400
commitb04934061330a4a449cfce703c97d887c3e11cd7 (patch)
tree5f031cb20338cc3972e7339be17046553b186573 /kernel
parenta5725ac23bf4ff79656ac2c317c323e261327fb3 (diff)
vtime: Optimize full dynticks accounting off case with static keys
If no CPU is in the full dynticks range, we can avoid the full dynticks cputime accounting through generic vtime along with its overhead and use the traditional tick based accounting instead. Let's do this and nope the off case with static keys. 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 'kernel')
-rw-r--r--kernel/sched/cputime.c22
1 files changed, 4 insertions, 18 deletions
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index b62d5c027c7e..0831b06aab97 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -378,11 +378,8 @@ static inline void irqtime_account_process_tick(struct task_struct *p, int user_
378#ifdef CONFIG_VIRT_CPU_ACCOUNTING 378#ifdef CONFIG_VIRT_CPU_ACCOUNTING
379 379
380#ifndef __ARCH_HAS_VTIME_TASK_SWITCH 380#ifndef __ARCH_HAS_VTIME_TASK_SWITCH
381void vtime_task_switch(struct task_struct *prev) 381void vtime_common_task_switch(struct task_struct *prev)
382{ 382{
383 if (!vtime_accounting_enabled())
384 return;
385
386 if (is_idle_task(prev)) 383 if (is_idle_task(prev))
387 vtime_account_idle(prev); 384 vtime_account_idle(prev);
388 else 385 else
@@ -404,11 +401,8 @@ void vtime_task_switch(struct task_struct *prev)
404 * vtime_account(). 401 * vtime_account().
405 */ 402 */
406#ifndef __ARCH_HAS_VTIME_ACCOUNT 403#ifndef __ARCH_HAS_VTIME_ACCOUNT
407void vtime_account_irq_enter(struct task_struct *tsk) 404void vtime_common_account_irq_enter(struct task_struct *tsk)
408{ 405{
409 if (!vtime_accounting_enabled())
410 return;
411
412 if (!in_interrupt()) { 406 if (!in_interrupt()) {
413 /* 407 /*
414 * If we interrupted user, context_tracking_in_user() 408 * If we interrupted user, context_tracking_in_user()
@@ -428,7 +422,7 @@ void vtime_account_irq_enter(struct task_struct *tsk)
428 } 422 }
429 vtime_account_system(tsk); 423 vtime_account_system(tsk);
430} 424}
431EXPORT_SYMBOL_GPL(vtime_account_irq_enter); 425EXPORT_SYMBOL_GPL(vtime_common_account_irq_enter);
432#endif /* __ARCH_HAS_VTIME_ACCOUNT */ 426#endif /* __ARCH_HAS_VTIME_ACCOUNT */
433#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ 427#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
434 428
@@ -669,11 +663,8 @@ void vtime_account_system(struct task_struct *tsk)
669 write_sequnlock(&tsk->vtime_seqlock); 663 write_sequnlock(&tsk->vtime_seqlock);
670} 664}
671 665
672void vtime_account_irq_exit(struct task_struct *tsk) 666void vtime_gen_account_irq_exit(struct task_struct *tsk)
673{ 667{
674 if (!vtime_accounting_enabled())
675 return;
676
677 write_seqlock(&tsk->vtime_seqlock); 668 write_seqlock(&tsk->vtime_seqlock);
678 if (context_tracking_in_user()) 669 if (context_tracking_in_user())
679 tsk->vtime_snap_whence = VTIME_USER; 670 tsk->vtime_snap_whence = VTIME_USER;
@@ -732,11 +723,6 @@ void vtime_account_idle(struct task_struct *tsk)
732 account_idle_time(delta_cpu); 723 account_idle_time(delta_cpu);
733} 724}
734 725
735bool vtime_accounting_enabled(void)
736{
737 return context_tracking_active();
738}
739
740void arch_vtime_task_switch(struct task_struct *prev) 726void arch_vtime_task_switch(struct task_struct *prev)
741{ 727{
742 write_seqlock(&prev->vtime_seqlock); 728 write_seqlock(&prev->vtime_seqlock);