Re: [PATCH v2] Fix hardware IRQ time accounting problem.

From: Johannes Berg
Date: Tue Dec 04 2007 - 11:45:42 EST



On Tue, 2007-12-04 at 16:51 +1100, Tony Breeds wrote:
> The commit fa13a5a1f25f671d084d8884be96fc48d9b68275 (sched: restore
> deterministic CPU accounting on powerpc), unconditionally calls
> update_process_tick() in system context. In the deterministic accounting case
> this is the correct thing to do. However, in the non-deterministic accounting
> case we need to not do this, and results in the time accounted as hardware irq
> time being artificially elevated.

Cool, I wouldn't have stood a chance of tracking this down :) Thanks,
I'll apply it to my testing tree later today.

> Signed-off-by: Tony Breeds <tony@xxxxxxxxxxxxxxxxxx>
> ---
> The problem was seen and reported by Johannes Berg and Frederik Himpe.
> Paul, I think this is good for 2.6.24.
>
> Changes since v1:
> - I noticed that the #define was explictly using "current" rather than
> the task passed in. Using tsk is the right thing to do.
> - The whiteapce changes dirty-up the patch and are un-needed with the
> change above.
>
> arch/powerpc/kernel/process.c | 2 +-
> include/asm-powerpc/time.h | 8 ++------
> 2 files changed, 3 insertions(+), 7 deletions(-)
>
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index 41e13f4..b9d8837 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_tick(current, 0);
> + account_process_vtime(current);
> calculate_steal_time();
>
> last = _switch(old_thread, new_thread);
> diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h
> index 780f826..a7281e0 100644
> --- a/include/asm-powerpc/time.h
> +++ b/include/asm-powerpc/time.h
> @@ -237,18 +237,14 @@ struct cpu_usage {
>
> DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array);
>
> -#ifdef CONFIG_VIRT_CPU_ACCOUNTING
> -extern void account_process_vtime(struct task_struct *tsk);
> -#else
> -#define account_process_vtime(tsk) do { } while (0)
> -#endif
> -
> #if defined(CONFIG_VIRT_CPU_ACCOUNTING)
> extern void calculate_steal_time(void);
> extern void snapshot_timebases(void);
> +#define account_process_vtime(tsk) account_process_tick(tsk, 0);
> #else
> #define calculate_steal_time() do { } while (0)
> #define snapshot_timebases() do { } while (0)
> +#define account_process_vtime(tsk) do { } while (0)
> #endif
>
> extern void secondary_cpu_time_init(void);

Attachment: signature.asc
Description: This is a digitally signed message part