Commit 11113334 authored by Frederic Weisbecker's avatar Frederic Weisbecker

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: default avatarFrederic 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>
parent dcbf832e
...@@ -106,9 +106,9 @@ void vtime_task_switch(struct task_struct *prev) ...@@ -106,9 +106,9 @@ void vtime_task_switch(struct task_struct *prev)
struct thread_info *ni = task_thread_info(current); struct thread_info *ni = task_thread_info(current);
if (idle_task(smp_processor_id()) != prev) if (idle_task(smp_processor_id()) != prev)
vtime_account_system(prev); __vtime_account_system(prev);
else else
vtime_account_idle(prev); __vtime_account_idle(prev);
vtime_account_user(prev); vtime_account_user(prev);
...@@ -135,14 +135,14 @@ static cputime_t vtime_delta(struct task_struct *tsk) ...@@ -135,14 +135,14 @@ static cputime_t vtime_delta(struct task_struct *tsk)
return delta_stime; 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); cputime_t delta = vtime_delta(tsk);
account_system_time(tsk, 0, delta, delta); 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)); account_idle_time(vtime_delta(tsk));
} }
......
...@@ -336,7 +336,7 @@ static u64 vtime_delta(struct task_struct *tsk, ...@@ -336,7 +336,7 @@ static u64 vtime_delta(struct task_struct *tsk,
return delta; return delta;
} }
void vtime_account_system(struct task_struct *tsk) void __vtime_account_system(struct task_struct *tsk)
{ {
u64 delta, sys_scaled, stolen; u64 delta, sys_scaled, stolen;
...@@ -346,7 +346,7 @@ void vtime_account_system(struct task_struct *tsk) ...@@ -346,7 +346,7 @@ void vtime_account_system(struct task_struct *tsk)
account_steal_time(stolen); 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; u64 delta, sys_scaled, stolen;
......
...@@ -140,6 +140,10 @@ void vtime_account(struct task_struct *tsk) ...@@ -140,6 +140,10 @@ void vtime_account(struct task_struct *tsk)
} }
EXPORT_SYMBOL_GPL(vtime_account); 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) void __kprobes vtime_stop_cpu(void)
{ {
struct s390_idle_data *idle = &__get_cpu_var(s390_idle); struct s390_idle_data *idle = &__get_cpu_var(s390_idle);
......
...@@ -5,10 +5,12 @@ struct task_struct; ...@@ -5,10 +5,12 @@ struct task_struct;
#ifdef CONFIG_VIRT_CPU_ACCOUNTING #ifdef CONFIG_VIRT_CPU_ACCOUNTING
extern void vtime_task_switch(struct task_struct *prev); 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_system(struct task_struct *tsk);
extern void vtime_account_idle(struct task_struct *tsk); extern void __vtime_account_idle(struct task_struct *tsk);
#else #else
static inline void vtime_task_switch(struct task_struct *prev) { } static inline void vtime_task_switch(struct task_struct *prev) { }
static inline void vtime_account_system(struct task_struct *tsk) { }
#endif #endif
#if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING) #if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING)
......
...@@ -433,10 +433,20 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st) ...@@ -433,10 +433,20 @@ void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st)
*st = cputime.stime; *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 * Archs that account the whole time spent in the idle task
* (outside irq) as idle time can rely on this and just implement * (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 * 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 * time spent by the CPU when it's in low power mode) must override
* vtime_account(). * vtime_account().
...@@ -449,9 +459,9 @@ void vtime_account(struct task_struct *tsk) ...@@ -449,9 +459,9 @@ void vtime_account(struct task_struct *tsk)
local_irq_save(flags); local_irq_save(flags);
if (in_interrupt() || !is_idle_task(tsk)) if (in_interrupt() || !is_idle_task(tsk))
vtime_account_system(tsk); __vtime_account_system(tsk);
else else
vtime_account_idle(tsk); __vtime_account_idle(tsk);
local_irq_restore(flags); local_irq_restore(flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment