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: Frederic Weisbecker <fweisbec@gmail.com> Reviewed-by: Steven 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>
This commit is contained in:
Родитель
fd25b4c2f2
Коммит
bcebdf8465
|
@ -83,7 +83,7 @@ static struct clocksource *itc_clocksource;
|
|||
|
||||
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;
|
||||
struct thread_info *ti = task_thread_info(tsk);
|
||||
|
@ -147,15 +147,6 @@ void vtime_account_idle(struct task_struct *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 */
|
||||
|
||||
static irqreturn_t
|
||||
|
|
|
@ -355,15 +355,15 @@ void vtime_account_idle(struct task_struct *tsk)
|
|||
}
|
||||
|
||||
/*
|
||||
* Transfer the user and system times accumulated in the paca
|
||||
* by the exception entry and exit code to the generic process
|
||||
* user and system time records.
|
||||
* Transfer the user time accumulated in the paca
|
||||
* by the exception entry and exit code to the generic
|
||||
* process user time records.
|
||||
* Must be called with interrupts disabled.
|
||||
* Assumes that vtime_account() has been called recently
|
||||
* (i.e. since the last entry from usermode) so that
|
||||
* Assumes that vtime_account_system/idle() has been called
|
||||
* recently (i.e. since the last entry from usermode) so that
|
||||
* 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;
|
||||
|
||||
|
@ -378,7 +378,7 @@ void account_process_tick(struct task_struct *tsk, int user_tick)
|
|||
void vtime_task_switch(struct task_struct *prev)
|
||||
{
|
||||
vtime_account(prev);
|
||||
account_process_tick(prev, 0);
|
||||
vtime_account_user(prev);
|
||||
}
|
||||
|
||||
#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */
|
||||
|
|
|
@ -112,7 +112,12 @@ void vtime_task_switch(struct task_struct *prev)
|
|||
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))
|
||||
virt_timer_expire();
|
||||
|
|
|
@ -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_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);
|
||||
#endif
|
||||
|
||||
extern void account_steal_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);
|
|||
extern void vtime_account_system(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_user(struct task_struct *tsk);
|
||||
extern void vtime_account(struct task_struct *tsk);
|
||||
#else
|
||||
static inline void vtime_task_switch(struct task_struct *prev) { }
|
||||
|
|
Загрузка…
Ссылка в новой задаче