diff options
Diffstat (limited to 'kernel/sched/sched.h')
| -rw-r--r-- | kernel/sched/sched.h | 69 | 
1 files changed, 63 insertions, 6 deletions
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 0848fa36c38..7a7db09cfab 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -737,11 +737,7 @@ static inline void prepare_lock_switch(struct rq *rq, struct task_struct *next)  	 */  	next->on_cpu = 1;  #endif -#ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW -	raw_spin_unlock_irq(&rq->lock); -#else  	raw_spin_unlock(&rq->lock); -#endif  }  static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev) @@ -755,9 +751,7 @@ static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev)  	smp_wmb();  	prev->on_cpu = 0;  #endif -#ifndef __ARCH_WANT_INTERRUPTS_ON_CTXSW  	local_irq_enable(); -#endif  }  #endif /* __ARCH_WANT_UNLOCKED_CTXSW */ @@ -891,6 +885,9 @@ struct cpuacct {  	struct kernel_cpustat __percpu *cpustat;  }; +extern struct cgroup_subsys cpuacct_subsys; +extern struct cpuacct root_cpuacct; +  /* return cpu accounting group corresponding to this container */  static inline struct cpuacct *cgroup_ca(struct cgroup *cgrp)  { @@ -917,6 +914,16 @@ extern void cpuacct_charge(struct task_struct *tsk, u64 cputime);  static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime) {}  #endif +#ifdef CONFIG_PARAVIRT +static inline u64 steal_ticks(u64 steal) +{ +	if (unlikely(steal > NSEC_PER_SEC)) +		return div_u64(steal, TICK_NSEC); + +	return __iter_div_u64_rem(steal, TICK_NSEC, &steal); +} +#endif +  static inline void inc_nr_running(struct rq *rq)  {  	rq->nr_running++; @@ -1156,3 +1163,53 @@ enum rq_nohz_flag_bits {  #define nohz_flags(cpu)	(&cpu_rq(cpu)->nohz_flags)  #endif + +#ifdef CONFIG_IRQ_TIME_ACCOUNTING + +DECLARE_PER_CPU(u64, cpu_hardirq_time); +DECLARE_PER_CPU(u64, cpu_softirq_time); + +#ifndef CONFIG_64BIT +DECLARE_PER_CPU(seqcount_t, irq_time_seq); + +static inline void irq_time_write_begin(void) +{ +	__this_cpu_inc(irq_time_seq.sequence); +	smp_wmb(); +} + +static inline void irq_time_write_end(void) +{ +	smp_wmb(); +	__this_cpu_inc(irq_time_seq.sequence); +} + +static inline u64 irq_time_read(int cpu) +{ +	u64 irq_time; +	unsigned seq; + +	do { +		seq = read_seqcount_begin(&per_cpu(irq_time_seq, cpu)); +		irq_time = per_cpu(cpu_softirq_time, cpu) + +			   per_cpu(cpu_hardirq_time, cpu); +	} while (read_seqcount_retry(&per_cpu(irq_time_seq, cpu), seq)); + +	return irq_time; +} +#else /* CONFIG_64BIT */ +static inline void irq_time_write_begin(void) +{ +} + +static inline void irq_time_write_end(void) +{ +} + +static inline u64 irq_time_read(int cpu) +{ +	return per_cpu(cpu_softirq_time, cpu) + per_cpu(cpu_hardirq_time, cpu); +} +#endif /* CONFIG_64BIT */ +#endif /* CONFIG_IRQ_TIME_ACCOUNTING */ +  |