vtime: Make vtime_account_system() irqsafe
authorFrederic Weisbecker <fweisbec@gmail.com>
Wed, 24 Oct 2012 16:05:51 +0000 (18:05 +0200)
committerFrederic Weisbecker <fweisbec@gmail.com>
Mon, 29 Oct 2012 20:31:31 +0000 (21:31 +0100)
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>
arch/ia64/kernel/time.c
arch/powerpc/kernel/time.c
arch/s390/kernel/vtime.c
include/linux/vtime.h
kernel/sched/cputime.c

index f6388216080d72fbd4547beb6e229a0e02cf7eff..5e4850305d3f7925b7f3d403186128ea80c48b0f 100644 (file)
@@ -106,9 +106,9 @@ void vtime_task_switch(struct task_struct *prev)
        struct thread_info *ni = task_thread_info(current);
 
        if (idle_task(smp_processor_id()) != prev)
-               vtime_account_system(prev);
+               __vtime_account_system(prev);
        else
-               vtime_account_idle(prev);
+               __vtime_account_idle(prev);
 
        vtime_account_user(prev);
 
@@ -135,14 +135,14 @@ static cputime_t vtime_delta(struct task_struct *tsk)
        return delta_stime;
 }
 
-void vtime_account_system(struct task_struct *tsk)
+void __vtime_account_system(struct task_struct *tsk)
 {
        cputime_t delta = vtime_delta(tsk);
 
        account_system_time(tsk, 0, delta, delta);
 }
 
-void vtime_account_idle(struct task_struct *tsk)
+void __vtime_account_idle(struct task_struct *tsk)
 {
        account_idle_time(vtime_delta(tsk));
 }
index ce4cb772dc7833f502e8521fe57ed6eb646c46d5..0db456f30d45026c5746f8169931096fab223b7c 100644 (file)
@@ -336,7 +336,7 @@ static u64 vtime_delta(struct task_struct *tsk,
        return delta;
 }
 
-void vtime_account_system(struct task_struct *tsk)
+void __vtime_account_system(struct task_struct *tsk)
 {
        u64 delta, sys_scaled, stolen;
 
@@ -346,7 +346,7 @@ void vtime_account_system(struct task_struct *tsk)
                account_steal_time(stolen);
 }
 
-void vtime_account_idle(struct task_struct *tsk)
+void __vtime_account_idle(struct task_struct *tsk)
 {
        u64 delta, sys_scaled, stolen;
 
index 790334427895039bafa75d898eb1a9763a44f26e..783e988c4e1e439018873fcf836ef239c19d7656 100644 (file)
@@ -140,6 +140,10 @@ void vtime_account(struct task_struct *tsk)
 }
 EXPORT_SYMBOL_GPL(vtime_account);
 
+void __vtime_account_system(struct task_struct *tsk)
+__attribute__((alias("vtime_account")));
+EXPORT_SYMBOL_GPL(__vtime_account_system);
+
 void __kprobes vtime_stop_cpu(void)
 {
        struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
index 7199c24c8204ab397c3ca563bfdfbcbd15537b5e..b9fc4f9ab470032d4a670e56ca9eec5c9bfe2f67 100644 (file)
@@ -5,10 +5,12 @@ struct task_struct;
 
 #ifdef CONFIG_VIRT_CPU_ACCOUNTING
 extern void vtime_task_switch(struct task_struct *prev);
+extern void __vtime_account_system(struct task_struct *tsk);
 extern void vtime_account_system(struct task_struct *tsk);
-extern void vtime_account_idle(struct task_struct *tsk);
+extern void __vtime_account_idle(struct task_struct *tsk);
 #else
 static inline void vtime_task_switch(struct task_struct *prev) { }
+static inline void vtime_account_system(struct task_struct *tsk) { }
 #endif
 
 #if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING)
index 81b763ba58a669e940dd1d9b6aa7c730159c2eab..0359f47b0ae451a3987ba9949ee2e9d1469ceb55 100644 (file)
@@ -433,10 +433,20 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
        *st = cputime.stime;
 }
 
+void vtime_account_system(struct task_struct *tsk)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       __vtime_account_system(tsk);
+       local_irq_restore(flags);
+}
+EXPORT_SYMBOL_GPL(vtime_account_system);
+
 /*
  * Archs that account the whole time spent in the idle task
  * (outside irq) as idle time can rely on this and just implement
- * vtime_account_system() and vtime_account_idle(). Archs that
+ * __vtime_account_system() and __vtime_account_idle(). Archs that
  * have other meaning of the idle time (s390 only includes the
  * time spent by the CPU when it's in low power mode) must override
  * vtime_account().
@@ -449,9 +459,9 @@ void vtime_account(struct task_struct *tsk)
        local_irq_save(flags);
 
        if (in_interrupt() || !is_idle_task(tsk))
-               vtime_account_system(tsk);
+               __vtime_account_system(tsk);
        else
-               vtime_account_idle(tsk);
+               __vtime_account_idle(tsk);
 
        local_irq_restore(flags);
 }
This page took 0.032393 seconds and 5 git commands to generate.