[PATCH v2] Restore deterministic CPU accounting on powerpc

Previous thread: 2.6.24-rc1-g74521c28: oops during boot [<ffffffff881c03e4>] :power_supply:power_supply_show_property+0x94/0x150 by Thomas Bächler on Saturday, November 3, 2007 - 7:31 am. (7 messages)

Next thread: Policy on dual licensing? by Remigiusz Modrzejewski on Saturday, November 3, 2007 - 8:14 am. (5 messages)
To: Ingo Molnar <mingo@...>, Peter Zijlstra <a.p.zijlstra@...>, Thomas Gleixner <tglx@...>
Cc: Christian Borntraeger <borntraeger@...>, Martin Schwidefsky <schwidefsky@...>, <linux-kernel@...>, <linuxppc-dev@...>
Date: Saturday, November 3, 2007 - 8:12 am

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().

Signed-off-by: Paul Mackerras <paulus@samba.org>
---
account_process_tick now takes the task_struct * as an argument.
Tested both with and without CONFIG_VIRT_CPU_ACCOUNTING.

arch/powerpc/kernel/process.c | 2 +-
arch/powerpc/kernel/time.c | 25 +------------------------
arch/s390/kernel/time.c | 4 ----
arch/s390/kernel/vtime.c | 8 +-------
include/linux/sched.h | 1 +
kernel/timer.c | 21 ++++++++++++++-------
6 files changed, 18 insertions(+), 43 deletions(-)

diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index b9d8837..41e13f4 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -350,7 +350,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
local_irq_save(flags);

account_system_vtime(current);
- account_process_vtime(current);
+ account_process_tick(current, 0);
calculate_steal_time();

last = _switch(old_thread, new_thread);
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 9eb3284..a70dfb7 100644
--- a/a...

To: Paul Mackerras <paulus@...>
Cc: Peter Zijlstra <a.p.zijlstra@...>, Thomas Gleixner <tglx@...>, Christian Borntraeger <borntraeger@...>, Martin Schwidefsky <schwidefsky@...>, <linux-kernel@...>, <linuxppc-dev@...>
Date: Sunday, November 4, 2007 - 5:55 am

thanks, applied.

Ingo
-

Previous thread: 2.6.24-rc1-g74521c28: oops during boot [<ffffffff881c03e4>] :power_supply:power_supply_show_property+0x94/0x150 by Thomas Bächler on Saturday, November 3, 2007 - 7:31 am. (7 messages)

Next thread: Policy on dual licensing? by Remigiusz Modrzejewski on Saturday, November 3, 2007 - 8:14 am. (5 messages)