Le 31/03/2026 à 15:16, Frederic Weisbecker a écrit :
Currently the tick subsystem stores the idle cputime accounting in
private fields, allowing cohabitation with architecture idle vtime
accounting. The former is fetched on online CPUs, the latter on offline
CPUs.

For consolidation purpose, architecture vtime accounting will continue
to account the cputime but will make a break when the idle tick is
stopped. The dyntick cputime accounting will then be relayed by the tick
subsystem so that the idle cputime is still seen advancing coherently
even when the tick isn't there to flush the idle vtime.

Prepare for that and introduce three new APIs which will be used in
subsequent patches:

_ vtime_dynticks_start() is deemed to be called when idle enters in
   dyntick mode. The idle cputime that elapsed so far is accumulated.

- vtime_dynticks_stop() is deemed to be called when idle exits from
   dyntick mode. The vtime entry clocks are fast-forward to current time
   so that idle accounting restarts elapsing from now.

- vtime_reset() is deemed to be called from dynticks idle IRQ entry to
   fast-forward the clock to current time so that the IRQ time is still
   accounted by vtime while nohz cputime is paused.

Also accumulated vtime won't be flushed from dyntick-idle ticks to avoid
accounting twice the idle cputime, along with nohz accounting.

Signed-off-by: Frederic Weisbecker <[email protected]>
Reviewed-by: Shrikanth Hegde <[email protected]>
Tested-by: Shrikanth Hegde <[email protected]>
---
  arch/powerpc/kernel/time.c | 41 ++++++++++++++++++++++++++++++++++++++
  include/linux/vtime.h      |  6 ++++++
  2 files changed, 47 insertions(+)


...

diff --git a/include/linux/vtime.h b/include/linux/vtime.h
index 336875bea767..61b94c12d7dd 100644
--- a/include/linux/vtime.h
+++ b/include/linux/vtime.h
@@ -37,11 +37,17 @@ extern void vtime_account_irq(struct task_struct *tsk, 
unsigned int offset);
  extern void vtime_account_softirq(struct task_struct *tsk);
  extern void vtime_account_hardirq(struct task_struct *tsk);
  extern void vtime_flush(struct task_struct *tsk);
+extern void vtime_reset(void);
+extern void vtime_dyntick_start(void);
+extern void vtime_dyntick_stop(void);
  #else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
  static inline void vtime_account_irq(struct task_struct *tsk, unsigned int 
offset) { }
  static inline void vtime_account_softirq(struct task_struct *tsk) { }
  static inline void vtime_account_hardirq(struct task_struct *tsk) { }
  static inline void vtime_flush(struct task_struct *tsk) { }
+static inline void vtime_reset(void) { }
+static inline void vtime_dyntick_start(void) { }
+extern inline void vtime_dyntick_stop(void) { }

You mean 'static' inline, not 'extern' ?

Christophe

  #endif
/*


Reply via email to