cputime: Separate irqtime accounting from generic vtime
vtime_account() doesn't have the same role in CONFIG_VIRT_CPU_ACCOUNTING and CONFIG_IRQ_TIME_ACCOUNTING. In the first case it handles time accounting in any context. In the second case it only handles irq time accounting. So when vtime_account() is called from outside vtime_account_irq_*() this call is pointless to CONFIG_IRQ_TIME_ACCOUNTING. To fix the confusion, change vtime_account() to irqtime_account_irq() in CONFIG_IRQ_TIME_ACCOUNTING. This way we ensure future account_vtime() calls won't waste useless cycles in the irqtime APIs. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
This commit is contained in:
parent
fa5058f3b6
commit
3e1df4f506
@ -8,17 +8,18 @@ extern void vtime_task_switch(struct task_struct *prev);
|
||||
extern void __vtime_account_system(struct task_struct *tsk);
|
||||
extern void vtime_account_system(struct task_struct *tsk);
|
||||
extern void __vtime_account_idle(struct task_struct *tsk);
|
||||
extern void vtime_account(struct task_struct *tsk);
|
||||
#else
|
||||
static inline void vtime_task_switch(struct task_struct *prev) { }
|
||||
static inline void __vtime_account_system(struct task_struct *tsk) { }
|
||||
static inline void vtime_account_system(struct task_struct *tsk) { }
|
||||
static inline void vtime_account(struct task_struct *tsk) { }
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_VIRT_CPU_ACCOUNTING) && !defined(CONFIG_IRQ_TIME_ACCOUNTING)
|
||||
static inline void vtime_account(struct task_struct *tsk)
|
||||
{
|
||||
}
|
||||
#ifdef CONFIG_IRQ_TIME_ACCOUNTING
|
||||
extern void irqtime_account_irq(struct task_struct *tsk);
|
||||
#else
|
||||
extern void vtime_account(struct task_struct *tsk);
|
||||
static inline void irqtime_account_irq(struct task_struct *tsk) { }
|
||||
#endif
|
||||
|
||||
static inline void vtime_account_irq_enter(struct task_struct *tsk)
|
||||
@ -33,17 +34,14 @@ static inline void vtime_account_irq_enter(struct task_struct *tsk)
|
||||
* the idle time is flushed on hardirq time already.
|
||||
*/
|
||||
vtime_account(tsk);
|
||||
irqtime_account_irq(tsk);
|
||||
}
|
||||
|
||||
static inline void vtime_account_irq_exit(struct task_struct *tsk)
|
||||
{
|
||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||
/* On hard|softirq exit we always account to hard|softirq cputime */
|
||||
__vtime_account_system(tsk);
|
||||
#endif
|
||||
#ifdef CONFIG_IRQ_TIME_ACCOUNTING
|
||||
vtime_account(tsk);
|
||||
#endif
|
||||
irqtime_account_irq(tsk);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_KERNEL_VTIME_H */
|
||||
|
@ -43,7 +43,7 @@ DEFINE_PER_CPU(seqcount_t, irq_time_seq);
|
||||
* Called before incrementing preempt_count on {soft,}irq_enter
|
||||
* and before decrementing preempt_count on {soft,}irq_exit.
|
||||
*/
|
||||
void vtime_account(struct task_struct *curr)
|
||||
void irqtime_account_irq(struct task_struct *curr)
|
||||
{
|
||||
unsigned long flags;
|
||||
s64 delta;
|
||||
@ -73,7 +73,7 @@ void vtime_account(struct task_struct *curr)
|
||||
irq_time_write_end();
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vtime_account);
|
||||
EXPORT_SYMBOL_GPL(irqtime_account_irq);
|
||||
|
||||
static int irqtime_account_hi_update(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user