aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2012-10-24 12:05:51 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2012-10-29 16:31:31 -0400
commit11113334d1c5dd5355c86e531c29f1202a855c86 (patch)
tree259c7c3344733444ca39263b1a79f40b243b155f
parentdcbf832e5823156e8f155359b47bd108cac8ad68 (diff)
vtime: Make vtime_account_system() irqsafe
vtime_account_system() currently has only one caller with vtime_account() which is irq safe. Now we are going to call it from other places like kvm where irqs are not always disabled by the time we account the cputime. So let's make it irqsafe. The arch implementation part is now prefixed with "__". vtime_account_idle() arch implementation is prefixed accordingly to stay consistent. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Paul Gortmaker <paul.gortmaker@windriver.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
-rw-r--r--arch/ia64/kernel/time.c8
-rw-r--r--arch/powerpc/kernel/time.c4
-rw-r--r--arch/s390/kernel/vtime.c4
-rw-r--r--include/linux/vtime.h4
-rw-r--r--kernel/sched/cputime.c16
5 files changed, 26 insertions, 10 deletions
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
index f6388216080d..5e4850305d3f 100644
--- a/arch/ia64/kernel/time.c
+++ b/arch/ia64/kernel/time.c
@@ -106,9 +106,9 @@ void vtime_task_switch(struct task_struct *prev)
106 struct thread_info *ni = task_thread_info(current); 106 struct thread_info *ni = task_thread_info(current);
107 107
108 if (idle_task(smp_processor_id()) != prev) 108 if (idle_task(smp_processor_id()) != prev)
109 vtime_account_system(prev); 109 __vtime_account_system(prev);
110 else 110 else
111 vtime_account_idle(prev); 111 __vtime_account_idle(prev);
112 112
113 vtime_account_user(prev); 113 vtime_account_user(prev);
114 114
@@ -135,14 +135,14 @@ static cputime_t vtime_delta(struct task_struct *tsk)
135 return delta_stime; 135 return delta_stime;
136} 136}
137 137
138void vtime_account_system(struct task_struct *tsk) 138void __vtime_account_system(struct task_struct *tsk)
139{ 139{
140 cputime_t delta = vtime_delta(tsk); 140 cputime_t delta = vtime_delta(tsk);
141 141
142 account_system_time(tsk, 0, delta, delta); 142 account_system_time(tsk, 0, delta, delta);
143} 143}
144 144
145void vtime_account_idle(struct task_struct *tsk) 145void __vtime_account_idle(struct task_struct *tsk)
146{ 146{
147 account_idle_time(vtime_delta(tsk)); 147 account_idle_time(vtime_delta(tsk));
148} 148}
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index ce4cb772dc78..0db456f30d45 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -336,7 +336,7 @@ static u64 vtime_delta(struct task_struct *tsk,
336 return delta; 336 return delta;
337} 337}
338 338
339void vtime_account_system(struct task_struct *tsk) 339void __vtime_account_system(struct task_struct *tsk)
340{ 340{
341 u64 delta, sys_scaled, stolen; 341 u64 delta, sys_scaled, stolen;
342 342
@@ -346,7 +346,7 @@ void vtime_account_system(struct task_struct *tsk)
346 account_steal_time(stolen); 346 account_steal_time(stolen);
347} 347}
348 348
349void vtime_account_idle(struct task_struct *tsk) 349void __vtime_account_idle(struct task_struct *tsk)
350{ 350{
351 u64 delta, sys_scaled, stolen; 351 u64 delta, sys_scaled, stolen;
352 352
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c
index 790334427895..783e988c4e1e 100644
--- a/arch/s390/kernel/vtime.c
+++ b/arch/s390/kernel/vtime.c
@@ -140,6 +140,10 @@ void vtime_account(struct task_struct *tsk)
140} 140}
141EXPORT_SYMBOL_GPL(vtime_account); 141EXPORT_SYMBOL_GPL(vtime_account);
142 142
143void __vtime_account_system(struct task_struct *tsk)
144__attribute__((alias("vtime_account")));
145EXPORT_SYMBOL_GPL(__vtime_account_system);
146
143void __kprobes vtime_stop_cpu(void) 147void __kprobes vtime_stop_cpu(void)
144{ 148{
145 struct s390_idle_data *idle = &__get_cpu_var(s390_idle); 149 struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
diff --git a/include/linux/vtime.h b/include/linux/vtime.h
index 7199c24c8204..b9fc4f9ab470 100644
--- a/include/linux/vtime.h
+++ b/include/linux/vtime.h
@@ -5,10 +5,12 @@ struct task_struct;
5 5
6#ifdef CONFIG_VIRT_CPU_ACCOUNTING 6#ifdef CONFIG_VIRT_CPU_ACCOUNTING
7extern void vtime_task_switch(struct task_struct *prev); 7extern void vtime_task_switch(struct task_struct *prev);
8extern void __vtime_account_system(struct task_struct *tsk);
8extern void vtime_account_system(struct task_struct *tsk); 9extern void vtime_account_system(struct task_struct *tsk);
9extern void vtime_account_idle(struct task_struct *tsk); 10extern void __vtime_account_idle(struct task_struct *tsk);
10#else 11#else
11static inline void vtime_task_switch(struct task_struct *prev) { } 12static inline void vtime_task_switch(struct task_struct *prev) { }
13static inline void vtime_account_system(struct task_struct *tsk) { }
12#endif 14#endif
13 15
14#if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING) 16#if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING)
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index 81b763ba58a6..0359f47b0ae4 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -433,10 +433,20 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
433 *st = cputime.stime; 433 *st = cputime.stime;
434} 434}
435 435
436void vtime_account_system(struct task_struct *tsk)
437{
438 unsigned long flags;
439
440 local_irq_save(flags);
441 __vtime_account_system(tsk);
442 local_irq_restore(flags);
443}
444EXPORT_SYMBOL_GPL(vtime_account_system);
445
436/* 446/*
437 * Archs that account the whole time spent in the idle task 447 * Archs that account the whole time spent in the idle task
438 * (outside irq) as idle time can rely on this and just implement 448 * (outside irq) as idle time can rely on this and just implement
439 * vtime_account_system() and vtime_account_idle(). Archs that 449 * __vtime_account_system() and __vtime_account_idle(). Archs that
440 * have other meaning of the idle time (s390 only includes the 450 * have other meaning of the idle time (s390 only includes the
441 * time spent by the CPU when it's in low power mode) must override 451 * time spent by the CPU when it's in low power mode) must override
442 * vtime_account(). 452 * vtime_account().
@@ -449,9 +459,9 @@ void vtime_account(struct task_struct *tsk)
449 local_irq_save(flags); 459 local_irq_save(flags);
450 460
451 if (in_interrupt() || !is_idle_task(tsk)) 461 if (in_interrupt() || !is_idle_task(tsk))
452 vtime_account_system(tsk); 462 __vtime_account_system(tsk);
453 else 463 else
454 vtime_account_idle(tsk); 464 __vtime_account_idle(tsk);
455 465
456 local_irq_restore(flags); 466 local_irq_restore(flags);
457} 467}