diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-19 18:19:48 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-19 18:19:48 -0800 | 
| commit | d652e1eb8e7b739fccbfb503a3da3e9f640fbf3d (patch) | |
| tree | 55ab77bad0cbb045eac0b84b80d63f88f1ae09e6 /kernel/sched/rt.c | |
| parent | 8f55cea410dbc56114bb71a3742032070c8108d0 (diff) | |
| parent | 77852fea6e2442a0e654a9292060489895de18c7 (diff) | |
| download | olio-linux-3.10-d652e1eb8e7b739fccbfb503a3da3e9f640fbf3d.tar.xz olio-linux-3.10-d652e1eb8e7b739fccbfb503a3da3e9f640fbf3d.zip  | |
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler changes from Ingo Molnar:
 "Main changes:
   - scheduler side full-dynticks (user-space execution is undisturbed
     and receives no timer IRQs) preparation changes that convert the
     cputime accounting code to be full-dynticks ready, from Frederic
     Weisbecker.
   - Initial sched.h split-up changes, by Clark Williams
   - select_idle_sibling() performance improvement by Mike Galbraith:
        " 1 tbench pair (worst case) in a 10 core + SMT package:
          pre   15.22 MB/sec 1 procs
          post 252.01 MB/sec 1 procs "
  - sched_rr_get_interval() ABI fix/change.  We think this detail is not
    used by apps (so it's not an ABI in practice), but lets keep it
    under observation.
  - misc RT scheduling cleanups, optimizations"
* 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (24 commits)
  sched/rt: Add <linux/sched/rt.h> header to <linux/init_task.h>
  cputime: Remove irqsave from seqlock readers
  sched, powerpc: Fix sched.h split-up build failure
  cputime: Restore CPU_ACCOUNTING config defaults for PPC64
  sched/rt: Move rt specific bits into new header file
  sched/rt: Add a tuning knob to allow changing SCHED_RR timeslice
  sched: Move sched.h sysctl bits into separate header
  sched: Fix signedness bug in yield_to()
  sched: Fix select_idle_sibling() bouncing cow syndrome
  sched/rt: Further simplify pick_rt_task()
  sched/rt: Do not account zero delta_exec in update_curr_rt()
  cputime: Safely read cputime of full dynticks CPUs
  kvm: Prepare to add generic guest entry/exit callbacks
  cputime: Use accessors to read task cputime stats
  cputime: Allow dynamic switch between tick/virtual based cputime accounting
  cputime: Generic on-demand virtual cputime accounting
  cputime: Move default nsecs_to_cputime() to jiffies based cputime file
  cputime: Librarize per nsecs resolution cputime definitions
  cputime: Avoid multiplication overflow on utime scaling
  context_tracking: Export context state for generic vtime
  ...
Fix up conflict in kernel/context_tracking.c due to comment additions.
Diffstat (limited to 'kernel/sched/rt.c')
| -rw-r--r-- | kernel/sched/rt.c | 26 | 
1 files changed, 17 insertions, 9 deletions
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 4f02b284735..127a2c4cf4a 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -7,6 +7,8 @@  #include <linux/slab.h> +int sched_rr_timeslice = RR_TIMESLICE; +  static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun);  struct rt_bandwidth def_rt_bandwidth; @@ -925,8 +927,8 @@ static void update_curr_rt(struct rq *rq)  		return;  	delta_exec = rq->clock_task - curr->se.exec_start; -	if (unlikely((s64)delta_exec < 0)) -		delta_exec = 0; +	if (unlikely((s64)delta_exec <= 0)) +		return;  	schedstat_set(curr->se.statistics.exec_max,  		      max(curr->se.statistics.exec_max, delta_exec)); @@ -1427,8 +1429,7 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p)  static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu)  {  	if (!task_running(rq, p) && -	    (cpu < 0 || cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) && -	    (p->nr_cpus_allowed > 1)) +	    cpumask_test_cpu(cpu, tsk_cpus_allowed(p)))  		return 1;  	return 0;  } @@ -1889,8 +1890,11 @@ static void switched_from_rt(struct rq *rq, struct task_struct *p)  	 * we may need to handle the pulling of RT tasks  	 * now.  	 */ -	if (p->on_rq && !rq->rt.rt_nr_running) -		pull_rt_task(rq); +	if (!p->on_rq || rq->rt.rt_nr_running) +		return; + +	if (pull_rt_task(rq)) +		resched_task(rq->curr);  }  void init_sched_rt_class(void) @@ -1985,7 +1989,11 @@ static void watchdog(struct rq *rq, struct task_struct *p)  	if (soft != RLIM_INFINITY) {  		unsigned long next; -		p->rt.timeout++; +		if (p->rt.watchdog_stamp != jiffies) { +			p->rt.timeout++; +			p->rt.watchdog_stamp = jiffies; +		} +  		next = DIV_ROUND_UP(min(soft, hard), USEC_PER_SEC/HZ);  		if (p->rt.timeout > next)  			p->cputime_expires.sched_exp = p->se.sum_exec_runtime; @@ -2010,7 +2018,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)  	if (--p->rt.time_slice)  		return; -	p->rt.time_slice = RR_TIMESLICE; +	p->rt.time_slice = sched_rr_timeslice;  	/*  	 * Requeue to the end of queue if we (and all of our ancestors) are the @@ -2041,7 +2049,7 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task)  	 * Time slice is 0 for SCHED_FIFO tasks  	 */  	if (task->policy == SCHED_RR) -		return RR_TIMESLICE; +		return sched_rr_timeslice;  	else  		return 0;  }  |