scheduler fixes
Subsystems (2)
Linus,
Please pull the latest sched-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git sched-urgent-for-linus
Thanks,
Ingo
------------------>
KOSAKI Motohiro (1):
cpuset: Fix cpuset_cpus_allowed_fallback(), don't update tsk->rt.nr_cpus_allowed
Peter Zijlstra (2):
sched: Fix ttwu() for __ARCH_WANT_INTERRUPTS_ON_CTXSW
sched: Fix ->min_vruntime calculation in dequeue_entity()
Xiaotian Feng (1):
sched: More sched_domain iterations fixes
include/linux/cpuset.h | 2 +- include/linux/sched.h | 7 ++++++ kernel/cpuset.c | 4 +- kernel/kthread.c | 4 +- kernel/sched.c | 56 ++++++++++++++++++++++++++++++++++------------- kernel/sched_fair.c | 5 ++- kernel/sched_rt.c | 10 ++++++- kernel/sched_stats.h | 4 +- 8 files changed, 65 insertions(+), 27 deletions(-)
include/linux/cpuset.h +1 -1
@@ -146,7 +146,7 @@ static inline void cpuset_cpus_allowed(struct task_struct *p,static inline int cpuset_cpus_allowed_fallback (struct task_struct *p) { -cpumask_copy (&p->cpus_allowed, cpu_possible_mask); +do_set_cpus_allowed (p, cpu_possible_mask);return cpumask_any (cpu_active_mask); }
include/linux/sched.h +7 -0
@@ -1841,9 +1841,16 @@ static inline void rcu_copy_process(struct task_struct *p)#endif #ifdef CONFIG_SMP +extern void do_set_cpus_allowed (struct task_struct *p, +const struct cpumask *new_mask); +extern int set_cpus_allowed_ptr (struct task_struct *p,const struct cpumask *new_mask);#else +static inline void do_set_cpus_allowed (struct task_struct *p, +const struct cpumask *new_mask) +{ +}static inline int set_cpus_allowed_ptr (struct task_struct *p,const struct cpumask *new_mask) {
kernel/cpuset.c +2 -2
@@ -2190,7 +2190,7 @@ int cpuset_cpus_allowed_fallback(struct task_struct *tsk)rcu_read_lock (); cs =task_cs (tsk);if (cs) -cpumask_copy (&tsk->cpus_allowed, cs->cpus_allowed); +do_set_cpus_allowed (tsk, cs->cpus_allowed);rcu_read_unlock ();/*
@@ -2217,7 +2217,7 @@ int cpuset_cpus_allowed_fallback(struct task_struct *tsk)* Like above we can temporary set any mask and rely on * set_cpus_allowed_ptr() as synchronization point. */ -cpumask_copy (&tsk->cpus_allowed, cpu_possible_mask); +do_set_cpus_allowed (tsk, cpu_possible_mask); cpu =cpumask_any (cpu_active_mask); }
kernel/kthread.c +2 -2
@@ -202,8 +202,8 @@ void kthread_bind(struct task_struct *p, unsigned int cpu)return ; } - p->cpus_allowed =cpumask_of_cpu (cpu); - p->rt.nr_cpus_allowed =1 ; +/* It's safe because the task is inactive. */ +do_set_cpus_allowed (p,cpumask_of (cpu)); p->flags |=PF_THREAD_BOUND ; }EXPORT_SYMBOL (kthread_bind);
kernel/sched.c +40 -16
89 lines not on this page · raw message
kernel/sched_fair.c +3 -2
@@ -1076,8 +1076,6 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) se->on_rq =0 ;update_cfs_load (cfs_rq,0 );account_entity_dequeue (cfs_rq, se); -update_min_vruntime (cfs_rq); -update_cfs_shares (cfs_rq);/* * Normalize the entity after updating the min_vruntime because the
@@ -1086,6 +1084,9 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)*/ if (!(flags &DEQUEUE_SLEEP )) se->vruntime -= cfs_rq->min_vruntime; + +update_min_vruntime (cfs_rq); +update_cfs_shares (cfs_rq); }/*
kernel/sched_rt.c +8 -2
@@ -1263,6 +1263,7 @@ static int find_lowest_rq(struct task_struct *task)if (!cpumask_test_cpu (this_cpu, lowest_mask)) this_cpu =-1 ;/* Skip this_cpu opt if not among lowest */ +rcu_read_lock ();for_each_domain (cpu, sd) {if (sd->flags &SD_WAKE_AFFINE ) {int best_cpu;
@@ -1272,15 +1273,20 @@ static int find_lowest_rq(struct task_struct *task)* remote processor. */ if (this_cpu !=-1 && -cpumask_test_cpu (this_cpu,sched_domain_span (sd))) +cpumask_test_cpu (this_cpu,sched_domain_span (sd))) { +rcu_read_unlock ();return this_cpu; + } best_cpu =cpumask_first_and (lowest_mask,sched_domain_span (sd)); -if (best_cpu < nr_cpu_ids) +if (best_cpu < nr_cpu_ids) { +rcu_read_unlock ();return best_cpu; + } } } +rcu_read_unlock ();/* * And finally, if there were no matches within the domains
kernel/sched_stats.h +2 -2
@@ -37,7 +37,7 @@ static int show_schedstat(struct seq_file *seq, void *v)#ifdef CONFIG_SMP /* domain-specific stats */ -preempt_disable (); +rcu_read_lock ();for_each_domain (cpu, sd) {enum cpu_idle_type itype;
@@ -64,7 +64,7 @@ static int show_schedstat(struct seq_file *seq, void *v) sd->ttwu_wake_remote, sd->ttwu_move_affine, sd->ttwu_move_balance); } -preempt_enable (); +rcu_read_unlock ();#endif }kfree (mask_str);