vtime: Consolidate a bit the ctx switch code
On ia64 and powerpc, vtime context switch only consists in flushing system and user pending time, plus a few arch housekeeping. Consolidate that into a generic implementation. s390 is a special case because pending user and system time accounting there is hard to dissociate. So it's keeping its own implementation. 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:
parent
bcebdf8465
commit
e3942ba040
6 changed files with 19 additions and 14 deletions
|
@ -103,5 +103,7 @@ static inline void cputime_to_timeval(const cputime_t ct, struct timeval *val)
|
||||||
#define cputime64_to_clock_t(__ct) \
|
#define cputime64_to_clock_t(__ct) \
|
||||||
cputime_to_clock_t((__force cputime_t)__ct)
|
cputime_to_clock_t((__force cputime_t)__ct)
|
||||||
|
|
||||||
|
extern void arch_vtime_task_switch(struct task_struct *tsk);
|
||||||
|
|
||||||
#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
|
#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
|
||||||
#endif /* __IA64_CPUTIME_H */
|
#endif /* __IA64_CPUTIME_H */
|
||||||
|
|
|
@ -100,18 +100,11 @@ void vtime_account_user(struct task_struct *tsk)
|
||||||
* accumulated times to the current process, and to prepare accounting on
|
* accumulated times to the current process, and to prepare accounting on
|
||||||
* the next process.
|
* the next process.
|
||||||
*/
|
*/
|
||||||
void vtime_task_switch(struct task_struct *prev)
|
void arch_vtime_task_switch(struct task_struct *prev)
|
||||||
{
|
{
|
||||||
struct thread_info *pi = task_thread_info(prev);
|
struct thread_info *pi = task_thread_info(prev);
|
||||||
struct thread_info *ni = task_thread_info(current);
|
struct thread_info *ni = task_thread_info(current);
|
||||||
|
|
||||||
if (idle_task(smp_processor_id()) != prev)
|
|
||||||
vtime_account_system(prev);
|
|
||||||
else
|
|
||||||
vtime_account_idle(prev);
|
|
||||||
|
|
||||||
vtime_account_user(prev);
|
|
||||||
|
|
||||||
pi->ac_stamp = ni->ac_stamp;
|
pi->ac_stamp = ni->ac_stamp;
|
||||||
ni->ac_stime = ni->ac_utime = 0;
|
ni->ac_stime = ni->ac_utime = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,6 +228,8 @@ static inline cputime_t clock_t_to_cputime(const unsigned long clk)
|
||||||
|
|
||||||
#define cputime64_to_clock_t(ct) cputime_to_clock_t((cputime_t)(ct))
|
#define cputime64_to_clock_t(ct) cputime_to_clock_t((cputime_t)(ct))
|
||||||
|
|
||||||
|
static inline void arch_vtime_task_switch(struct task_struct *tsk) { }
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
|
#endif /* CONFIG_VIRT_CPU_ACCOUNTING */
|
||||||
#endif /* __POWERPC_CPUTIME_H */
|
#endif /* __POWERPC_CPUTIME_H */
|
||||||
|
|
|
@ -375,12 +375,6 @@ void vtime_account_user(struct task_struct *tsk)
|
||||||
account_user_time(tsk, utime, utimescaled);
|
account_user_time(tsk, utime, utimescaled);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vtime_task_switch(struct task_struct *prev)
|
|
||||||
{
|
|
||||||
vtime_account(prev);
|
|
||||||
vtime_account_user(prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */
|
#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */
|
||||||
#define calc_cputime_factors()
|
#define calc_cputime_factors()
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
|
|
||||||
#define __ARCH_HAS_VTIME_ACCOUNT
|
#define __ARCH_HAS_VTIME_ACCOUNT
|
||||||
|
#define __ARCH_HAS_VTIME_TASK_SWITCH
|
||||||
|
|
||||||
/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */
|
/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */
|
||||||
|
|
||||||
|
|
|
@ -443,6 +443,19 @@ void vtime_account_system_irqsafe(struct task_struct *tsk)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vtime_account_system_irqsafe);
|
EXPORT_SYMBOL_GPL(vtime_account_system_irqsafe);
|
||||||
|
|
||||||
|
#ifndef __ARCH_HAS_VTIME_TASK_SWITCH
|
||||||
|
void vtime_task_switch(struct task_struct *prev)
|
||||||
|
{
|
||||||
|
if (is_idle_task(prev))
|
||||||
|
vtime_account_idle(prev);
|
||||||
|
else
|
||||||
|
vtime_account_system(prev);
|
||||||
|
|
||||||
|
vtime_account_user(prev);
|
||||||
|
arch_vtime_task_switch(prev);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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
|
||||||
|
|
Loading…
Add table
Reference in a new issue