sched: restore deterministic CPU accounting on powerpc
Since powerpc started using CONFIG_GENERIC_CLOCKEVENTS, the deterministic CPU accounting (CONFIG_VIRT_CPU_ACCOUNTING) has been broken on powerpc, because we end up counting user time twice: once in timer_interrupt() and once in update_process_times(). This fixes the problem by pulling the code in update_process_times that updates utime and stime into a separate function called account_process_tick. If CONFIG_VIRT_CPU_ACCOUNTING is not defined, there is a version of account_process_tick in kernel/timer.c that simply accounts a whole tick to either utime or stime as before. If CONFIG_VIRT_CPU_ACCOUNTING is defined, then arch code gets to implement account_process_tick. This also lets us simplify the s390 code a bit; it means that the s390 timer interrupt can now call update_process_times even when CONFIG_VIRT_CPU_ACCOUNTING is turned on, and can just implement a suitable account_process_tick(). account_process_tick() now takes the task_struct * as an argument. Tested both with and without CONFIG_VIRT_CPU_ACCOUNTING. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
9a41785cc4
commit
fa13a5a1f2
@@ -32,7 +32,7 @@ static DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer);
|
||||
* Update process times based on virtual cpu times stored by entry.S
|
||||
* to the lowcore fields user_timer, system_timer & steal_clock.
|
||||
*/
|
||||
void account_tick_vtime(struct task_struct *tsk)
|
||||
void account_process_tick(struct task_struct *tsk, int user_tick)
|
||||
{
|
||||
cputime_t cputime;
|
||||
__u64 timer, clock;
|
||||
@@ -64,12 +64,6 @@ void account_tick_vtime(struct task_struct *tsk)
|
||||
S390_lowcore.steal_clock -= cputime << 12;
|
||||
account_steal_time(tsk, cputime);
|
||||
}
|
||||
|
||||
run_local_timers();
|
||||
if (rcu_pending(smp_processor_id()))
|
||||
rcu_check_callbacks(smp_processor_id(), rcu_user_flag);
|
||||
scheduler_tick();
|
||||
run_posix_cpu_timers(tsk);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user