linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] Fix hardware IRQ time accounting problem.
@ 2007-12-04  5:51 Tony Breeds
  2007-12-04 16:44 ` Johannes Berg
  2007-12-05 11:39 ` Frederik Himpe
  0 siblings, 2 replies; 3+ messages in thread
From: Tony Breeds @ 2007-12-04  5:51 UTC (permalink / raw)
  To: Paul Mackerras, LinuxPPC-dev, Linux Kernel ML
  Cc: Johannes Berg, Frederik Himpe, linux-usb-devel

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.

Also this patch collapses 2 consecutive '#ifdef CONFIG_VIRT_CPU_ACCOUNTING'
checks in time.h into one for neatness.

Signed-off-by: Tony Breeds <tony@bakeyournoodle.com>
---
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);
-- 
1.5.3.6


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] Fix hardware IRQ time accounting problem.
  2007-12-04  5:51 [PATCH v2] Fix hardware IRQ time accounting problem Tony Breeds
@ 2007-12-04 16:44 ` Johannes Berg
  2007-12-05 11:39 ` Frederik Himpe
  1 sibling, 0 replies; 3+ messages in thread
From: Johannes Berg @ 2007-12-04 16:44 UTC (permalink / raw)
  To: Tony Breeds
  Cc: Paul Mackerras, LinuxPPC-dev, Linux Kernel ML, Frederik Himpe,
	linux-usb-devel

[-- Attachment #1: Type: text/plain, Size: 2594 bytes --]


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@bakeyournoodle.com>
> ---
> 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 #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] Fix hardware IRQ time accounting problem.
  2007-12-04  5:51 [PATCH v2] Fix hardware IRQ time accounting problem Tony Breeds
  2007-12-04 16:44 ` Johannes Berg
@ 2007-12-05 11:39 ` Frederik Himpe
  1 sibling, 0 replies; 3+ messages in thread
From: Frederik Himpe @ 2007-12-05 11:39 UTC (permalink / raw)
  To: linux-kernel; +Cc: linuxppc-dev, linux-usb-devel

On Tue, 04 Dec 2007 16:51:44 +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.
> 
> Also this patch collapses 2 consecutive '#ifdef
> CONFIG_VIRT_CPU_ACCOUNTING' checks in time.h into one for neatness.

I can confirm this patch fixed the problem for me. Thank you!

-- 
Frederik Himpe



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-12-05 11:39 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-12-04  5:51 [PATCH v2] Fix hardware IRQ time accounting problem Tony Breeds
2007-12-04 16:44 ` Johannes Berg
2007-12-05 11:39 ` Frederik Himpe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).