Commit bcebdf84 authored by Frederic Weisbecker's avatar Frederic Weisbecker

vtime: Explicitly account pending user time on process tick

All vtime implementations just flush the user time on process
tick. Consolidate that in generic code by calling a user time
accounting helper. This avoids an indirect call in ia64 and
prepare to also consolidate vtime context switch code.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Reviewed-by: default avatarSteven Rostedt <rostedt@goodmis.org>
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 fd25b4c2
...@@ -83,7 +83,7 @@ static struct clocksource *itc_clocksource; ...@@ -83,7 +83,7 @@ static struct clocksource *itc_clocksource;
extern cputime_t cycle_to_cputime(u64 cyc); extern cputime_t cycle_to_cputime(u64 cyc);
static void vtime_account_user(struct task_struct *tsk) void vtime_account_user(struct task_struct *tsk)
{ {
cputime_t delta_utime; cputime_t delta_utime;
struct thread_info *ti = task_thread_info(tsk); struct thread_info *ti = task_thread_info(tsk);
...@@ -147,15 +147,6 @@ void vtime_account_idle(struct task_struct *tsk) ...@@ -147,15 +147,6 @@ void vtime_account_idle(struct task_struct *tsk)
account_idle_time(vtime_delta(tsk)); account_idle_time(vtime_delta(tsk));
} }
/*
* Called from the timer interrupt handler to charge accumulated user time
* to the current process. Must be called with interrupts disabled.
*/
void account_process_tick(struct task_struct *p, int user_tick)
{
vtime_account_user(p);
}
#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ #endif /* CONFIG_VIRT_CPU_ACCOUNTING */
static irqreturn_t static irqreturn_t
......
...@@ -355,15 +355,15 @@ void vtime_account_idle(struct task_struct *tsk) ...@@ -355,15 +355,15 @@ void vtime_account_idle(struct task_struct *tsk)
} }
/* /*
* Transfer the user and system times accumulated in the paca * Transfer the user time accumulated in the paca
* by the exception entry and exit code to the generic process * by the exception entry and exit code to the generic
* user and system time records. * process user time records.
* Must be called with interrupts disabled. * Must be called with interrupts disabled.
* Assumes that vtime_account() has been called recently * Assumes that vtime_account_system/idle() has been called
* (i.e. since the last entry from usermode) so that * recently (i.e. since the last entry from usermode) so that
* get_paca()->user_time_scaled is up to date. * get_paca()->user_time_scaled is up to date.
*/ */
void account_process_tick(struct task_struct *tsk, int user_tick) void vtime_account_user(struct task_struct *tsk)
{ {
cputime_t utime, utimescaled; cputime_t utime, utimescaled;
...@@ -378,7 +378,7 @@ void account_process_tick(struct task_struct *tsk, int user_tick) ...@@ -378,7 +378,7 @@ void account_process_tick(struct task_struct *tsk, int user_tick)
void vtime_task_switch(struct task_struct *prev) void vtime_task_switch(struct task_struct *prev)
{ {
vtime_account(prev); vtime_account(prev);
account_process_tick(prev, 0); vtime_account_user(prev);
} }
#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */ #else /* ! CONFIG_VIRT_CPU_ACCOUNTING */
......
...@@ -112,7 +112,12 @@ void vtime_task_switch(struct task_struct *prev) ...@@ -112,7 +112,12 @@ void vtime_task_switch(struct task_struct *prev)
S390_lowcore.system_timer = ti->system_timer; S390_lowcore.system_timer = ti->system_timer;
} }
void account_process_tick(struct task_struct *tsk, int user_tick) /*
* In s390, accounting pending user time also implies
* accounting system time in order to correctly compute
* the stolen time accounting.
*/
void vtime_account_user(struct task_struct *tsk)
{ {
if (do_account_vtime(tsk, HARDIRQ_OFFSET)) if (do_account_vtime(tsk, HARDIRQ_OFFSET))
virt_timer_expire(); virt_timer_expire();
......
...@@ -127,7 +127,15 @@ extern void account_system_time(struct task_struct *, int, cputime_t, cputime_t) ...@@ -127,7 +127,15 @@ extern void account_system_time(struct task_struct *, int, cputime_t, cputime_t)
extern void account_steal_time(cputime_t); extern void account_steal_time(cputime_t);
extern void account_idle_time(cputime_t); extern void account_idle_time(cputime_t);
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
static inline void account_process_tick(struct task_struct *tsk, int user)
{
vtime_account_user(tsk);
}
#else
extern void account_process_tick(struct task_struct *, int user); extern void account_process_tick(struct task_struct *, int user);
#endif
extern void account_steal_ticks(unsigned long ticks); extern void account_steal_ticks(unsigned long ticks);
extern void account_idle_ticks(unsigned long ticks); extern void account_idle_ticks(unsigned long ticks);
......
...@@ -8,6 +8,7 @@ extern void vtime_task_switch(struct task_struct *prev); ...@@ -8,6 +8,7 @@ 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_irqsafe(struct task_struct *tsk); extern void vtime_account_system_irqsafe(struct task_struct *tsk);
extern void vtime_account_idle(struct task_struct *tsk); extern void vtime_account_idle(struct task_struct *tsk);
extern void vtime_account_user(struct task_struct *tsk);
extern void vtime_account(struct task_struct *tsk); extern void vtime_account(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) { }
......
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