diff options
| -rw-r--r-- | include/linux/vtime.h | 8 | ||||
| -rw-r--r-- | kernel/sched/cputime.c | 41 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 5 | 
3 files changed, 43 insertions, 11 deletions
diff --git a/include/linux/vtime.h b/include/linux/vtime.h index 21ef703d1b2..5368af9bdf0 100644 --- a/include/linux/vtime.h +++ b/include/linux/vtime.h @@ -10,12 +10,20 @@ extern void vtime_account_system_irqsafe(struct task_struct *tsk);  extern void vtime_account_idle(struct task_struct *tsk);  extern void vtime_account_user(struct task_struct *tsk);  extern void vtime_account(struct task_struct *tsk); + +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN +extern bool vtime_accounting_enabled(void);  #else +static inline bool vtime_accounting_enabled(void) { return true; } +#endif + +#else /* !CONFIG_VIRT_CPU_ACCOUNTING */  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_irqsafe(struct task_struct *tsk) { }  static inline void vtime_account_user(struct task_struct *tsk) { }  static inline void vtime_account(struct task_struct *tsk) { } +static inline bool vtime_accounting_enabled(void) { return false; }  #endif  #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index 1c964eced92..e1939d38bf7 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -317,8 +317,6 @@ out:  	rcu_read_unlock();  } -#ifndef CONFIG_VIRT_CPU_ACCOUNTING -  #ifdef CONFIG_IRQ_TIME_ACCOUNTING  /*   * Account a tick to a process and cpustat @@ -383,11 +381,12 @@ static void irqtime_account_idle_ticks(int ticks)  		irqtime_account_process_tick(current, 0, rq);  }  #else /* CONFIG_IRQ_TIME_ACCOUNTING */ -static void irqtime_account_idle_ticks(int ticks) {} -static void irqtime_account_process_tick(struct task_struct *p, int user_tick, +static inline void irqtime_account_idle_ticks(int ticks) {} +static inline void irqtime_account_process_tick(struct task_struct *p, int user_tick,  						struct rq *rq) {}  #endif /* CONFIG_IRQ_TIME_ACCOUNTING */ +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  /*   * Account a single tick of cpu time.   * @p: the process that the cpu time gets accounted to @@ -398,6 +397,9 @@ void account_process_tick(struct task_struct *p, int user_tick)  	cputime_t one_jiffy_scaled = cputime_to_scaled(cputime_one_jiffy);  	struct rq *rq = this_rq(); +	if (vtime_accounting_enabled()) +		return; +  	if (sched_clock_irqtime) {  		irqtime_account_process_tick(p, user_tick, rq);  		return; @@ -439,8 +441,7 @@ void account_idle_ticks(unsigned long ticks)  	account_idle_time(jiffies_to_cputime(ticks));  } - -#endif +#endif /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  /*   * Use precise platform statistics if available: @@ -475,6 +476,9 @@ EXPORT_SYMBOL_GPL(vtime_account_system_irqsafe);  #ifndef __ARCH_HAS_VTIME_TASK_SWITCH  void vtime_task_switch(struct task_struct *prev)  { +	if (!vtime_accounting_enabled()) +		return; +  	if (is_idle_task(prev))  		vtime_account_idle(prev);  	else @@ -498,6 +502,9 @@ void vtime_task_switch(struct task_struct *prev)  #ifndef __ARCH_HAS_VTIME_ACCOUNT  void vtime_account(struct task_struct *tsk)  { +	if (!vtime_accounting_enabled()) +		return; +  	if (!in_interrupt()) {  		/*  		 * If we interrupted user, context_tracking_in_user() @@ -520,7 +527,7 @@ void vtime_account(struct task_struct *tsk)  EXPORT_SYMBOL_GPL(vtime_account);  #endif /* __ARCH_HAS_VTIME_ACCOUNT */ -#else +#else /* !CONFIG_VIRT_CPU_ACCOUNTING */  static cputime_t scale_utime(cputime_t utime, cputime_t rtime, cputime_t total)  { @@ -599,7 +606,7 @@ void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut, cputime  	thread_group_cputime(p, &cputime);  	cputime_adjust(&cputime, &p->signal->prev_cputime, ut, st);  } -#endif +#endif /* !CONFIG_VIRT_CPU_ACCOUNTING */  #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN  static DEFINE_PER_CPU(unsigned long long, cputime_snap); @@ -617,14 +624,23 @@ static cputime_t get_vtime_delta(void)  void vtime_account_system(struct task_struct *tsk)  { -	cputime_t delta_cpu = get_vtime_delta(); +	cputime_t delta_cpu; + +	if (!vtime_accounting_enabled()) +		return; +	delta_cpu = get_vtime_delta();  	account_system_time(tsk, irq_count(), delta_cpu, cputime_to_scaled(delta_cpu));  }  void vtime_account_user(struct task_struct *tsk)  { -	cputime_t delta_cpu = get_vtime_delta(); +	cputime_t delta_cpu; + +	if (!vtime_accounting_enabled()) +		return; + +	delta_cpu = get_vtime_delta();  	account_user_time(tsk, delta_cpu, cputime_to_scaled(delta_cpu));  } @@ -635,4 +651,9 @@ void vtime_account_idle(struct task_struct *tsk)  	account_idle_time(delta_cpu);  } + +bool vtime_accounting_enabled(void) +{ +	return context_tracking_active(); +}  #endif /* CONFIG_VIRT_CPU_ACCOUNTING_GEN */ diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index d58e552d9fd..46dfb6d94b1 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -631,8 +631,11 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now)  static void tick_nohz_account_idle_ticks(struct tick_sched *ts)  { -#ifndef CONFIG_VIRT_CPU_ACCOUNTING +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	unsigned long ticks; + +	if (vtime_accounting_enabled()) +		return;  	/*  	 * We stopped the tick in idle. Update process times would miss the  	 * time we slept as update_process_times does only a 1 tick  |