diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-03-31 14:21:19 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-03-31 14:21:19 -0400 |
| commit | 971eae7c99212dd67b425a603f1fe3b763359907 (patch) | |
| tree | 2ff002ecc759275cbecee123a230f90ea7452b18 /kernel | |
| parent | 8c292f11744297dfb3a69f4a0bccbe4a6417b50d (diff) | |
| parent | 6037dd1a49f95092824fa8ba75c717ff7805e317 (diff) | |
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler changes from Ingo Molnar:
"Bigger changes:
- sched/idle restructuring: they are WIP preparation for deeper
integration between the scheduler and idle state selection, by
Nicolas Pitre.
- add NUMA scheduling pseudo-interleaving, by Rik van Riel.
- optimize cgroup context switches, by Peter Zijlstra.
- RT scheduling enhancements, by Thomas Gleixner.
The rest is smaller changes, non-urgnt fixes and cleanups"
* 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (68 commits)
sched: Clean up the task_hot() function
sched: Remove double calculation in fix_small_imbalance()
sched: Fix broken setscheduler()
sparc64, sched: Remove unused sparc64_multi_core
sched: Remove unused mc_capable() and smt_capable()
sched/numa: Move task_numa_free() to __put_task_struct()
sched/fair: Fix endless loop in idle_balance()
sched/core: Fix endless loop in pick_next_task()
sched/fair: Push down check for high priority class task into idle_balance()
sched/rt: Fix picking RT and DL tasks from empty queue
trace: Replace hardcoding of 19 with MAX_NICE
sched: Guarantee task priority in pick_next_task()
sched/idle: Remove stale old file
sched: Put rq's sched_avg under CONFIG_FAIR_GROUP_SCHED
cpuidle/arm64: Remove redundant cpuidle_idle_call()
cpuidle/powernv: Remove redundant cpuidle_idle_call()
sched, nohz: Exclude isolated cores from load balancing
sched: Fix select_task_rq_fair() description comments
workqueue: Replace hardcoding of -20 and 19 with MIN_NICE and MAX_NICE
sys: Replace hardcoding of -20 and 19 with MIN_NICE and MAX_NICE
...
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/cpu/Makefile | 1 | ||||
| -rw-r--r-- | kernel/fork.c | 1 | ||||
| -rw-r--r-- | kernel/locking/rtmutex.c | 12 | ||||
| -rw-r--r-- | kernel/rcu/rcutorture.c | 8 | ||||
| -rw-r--r-- | kernel/sched/Makefile | 2 | ||||
| -rw-r--r-- | kernel/sched/auto_group.c | 2 | ||||
| -rw-r--r-- | kernel/sched/core.c | 207 | ||||
| -rw-r--r-- | kernel/sched/cputime.c | 4 | ||||
| -rw-r--r-- | kernel/sched/deadline.c | 56 | ||||
| -rw-r--r-- | kernel/sched/debug.c | 7 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 600 | ||||
| -rw-r--r-- | kernel/sched/idle.c (renamed from kernel/cpu/idle.c) | 7 | ||||
| -rw-r--r-- | kernel/sched/idle_task.c | 25 | ||||
| -rw-r--r-- | kernel/sched/rt.c | 102 | ||||
| -rw-r--r-- | kernel/sched/sched.h | 65 | ||||
| -rw-r--r-- | kernel/sched/stop_task.c | 15 | ||||
| -rw-r--r-- | kernel/sys.c | 8 | ||||
| -rw-r--r-- | kernel/sysctl.c | 7 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer_benchmark.c | 6 | ||||
| -rw-r--r-- | kernel/workqueue.c | 2 |
21 files changed, 788 insertions, 350 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index 5c0e7666811d..4fd847488b76 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
| @@ -22,7 +22,6 @@ obj-y += sched/ | |||
| 22 | obj-y += locking/ | 22 | obj-y += locking/ |
| 23 | obj-y += power/ | 23 | obj-y += power/ |
| 24 | obj-y += printk/ | 24 | obj-y += printk/ |
| 25 | obj-y += cpu/ | ||
| 26 | obj-y += irq/ | 25 | obj-y += irq/ |
| 27 | obj-y += rcu/ | 26 | obj-y += rcu/ |
| 28 | 27 | ||
diff --git a/kernel/cpu/Makefile b/kernel/cpu/Makefile deleted file mode 100644 index 59ab052ef7a0..000000000000 --- a/kernel/cpu/Makefile +++ /dev/null | |||
| @@ -1 +0,0 @@ | |||
| 1 | obj-y = idle.o | ||
diff --git a/kernel/fork.c b/kernel/fork.c index a17621c6cd42..332688e5e7b4 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -237,6 +237,7 @@ void __put_task_struct(struct task_struct *tsk) | |||
| 237 | WARN_ON(atomic_read(&tsk->usage)); | 237 | WARN_ON(atomic_read(&tsk->usage)); |
| 238 | WARN_ON(tsk == current); | 238 | WARN_ON(tsk == current); |
| 239 | 239 | ||
| 240 | task_numa_free(tsk); | ||
| 240 | security_task_free(tsk); | 241 | security_task_free(tsk); |
| 241 | exit_creds(tsk); | 242 | exit_creds(tsk); |
| 242 | delayacct_tsk_free(tsk); | 243 | delayacct_tsk_free(tsk); |
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c index 2e960a2bab81..aa4dff04b594 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c | |||
| @@ -213,6 +213,18 @@ struct task_struct *rt_mutex_get_top_task(struct task_struct *task) | |||
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | /* | 215 | /* |
| 216 | * Called by sched_setscheduler() to check whether the priority change | ||
| 217 | * is overruled by a possible priority boosting. | ||
| 218 | */ | ||
| 219 | int rt_mutex_check_prio(struct task_struct *task, int newprio) | ||
| 220 | { | ||
| 221 | if (!task_has_pi_waiters(task)) | ||
| 222 | return 0; | ||
| 223 | |||
| 224 | return task_top_pi_waiter(task)->task->prio <= newprio; | ||
| 225 | } | ||
| 226 | |||
| 227 | /* | ||
| 216 | * Adjust the priority of a task, after its pi_waiters got modified. | 228 | * Adjust the priority of a task, after its pi_waiters got modified. |
| 217 | * | 229 | * |
| 218 | * This can be both boosting and unboosting. task->pi_lock must be held. | 230 | * This can be both boosting and unboosting. task->pi_lock must be held. |
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c index f59d48597dde..bd30bc61bc05 100644 --- a/kernel/rcu/rcutorture.c +++ b/kernel/rcu/rcutorture.c | |||
| @@ -696,7 +696,7 @@ rcu_torture_writer(void *arg) | |||
| 696 | static DEFINE_TORTURE_RANDOM(rand); | 696 | static DEFINE_TORTURE_RANDOM(rand); |
| 697 | 697 | ||
| 698 | VERBOSE_TOROUT_STRING("rcu_torture_writer task started"); | 698 | VERBOSE_TOROUT_STRING("rcu_torture_writer task started"); |
| 699 | set_user_nice(current, 19); | 699 | set_user_nice(current, MAX_NICE); |
| 700 | 700 | ||
| 701 | do { | 701 | do { |
| 702 | schedule_timeout_uninterruptible(1); | 702 | schedule_timeout_uninterruptible(1); |
| @@ -759,7 +759,7 @@ rcu_torture_fakewriter(void *arg) | |||
| 759 | DEFINE_TORTURE_RANDOM(rand); | 759 | DEFINE_TORTURE_RANDOM(rand); |
| 760 | 760 | ||
| 761 | VERBOSE_TOROUT_STRING("rcu_torture_fakewriter task started"); | 761 | VERBOSE_TOROUT_STRING("rcu_torture_fakewriter task started"); |
| 762 | set_user_nice(current, 19); | 762 | set_user_nice(current, MAX_NICE); |
| 763 | 763 | ||
| 764 | do { | 764 | do { |
| 765 | schedule_timeout_uninterruptible(1 + torture_random(&rand)%10); | 765 | schedule_timeout_uninterruptible(1 + torture_random(&rand)%10); |
| @@ -872,7 +872,7 @@ rcu_torture_reader(void *arg) | |||
| 872 | unsigned long long ts; | 872 | unsigned long long ts; |
| 873 | 873 | ||
| 874 | VERBOSE_TOROUT_STRING("rcu_torture_reader task started"); | 874 | VERBOSE_TOROUT_STRING("rcu_torture_reader task started"); |
| 875 | set_user_nice(current, 19); | 875 | set_user_nice(current, MAX_NICE); |
| 876 | if (irqreader && cur_ops->irq_capable) | 876 | if (irqreader && cur_ops->irq_capable) |
| 877 | setup_timer_on_stack(&t, rcu_torture_timer, 0); | 877 | setup_timer_on_stack(&t, rcu_torture_timer, 0); |
| 878 | 878 | ||
| @@ -1161,7 +1161,7 @@ static int rcu_torture_barrier_cbs(void *arg) | |||
| 1161 | 1161 | ||
| 1162 | init_rcu_head_on_stack(&rcu); | 1162 | init_rcu_head_on_stack(&rcu); |
| 1163 | VERBOSE_TOROUT_STRING("rcu_torture_barrier_cbs task started"); | 1163 | VERBOSE_TOROUT_STRING("rcu_torture_barrier_cbs task started"); |
| 1164 | set_user_nice(current, 19); | 1164 | set_user_nice(current, MAX_NICE); |
| 1165 | do { | 1165 | do { |
| 1166 | wait_event(barrier_cbs_wq[myid], | 1166 | wait_event(barrier_cbs_wq[myid], |
| 1167 | (newphase = | 1167 | (newphase = |
diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile index 9a95c8c2af2a..ab32b7b0db5c 100644 --- a/kernel/sched/Makefile +++ b/kernel/sched/Makefile | |||
| @@ -13,7 +13,7 @@ endif | |||
| 13 | 13 | ||
| 14 | obj-y += core.o proc.o clock.o cputime.o | 14 | obj-y += core.o proc.o clock.o cputime.o |
| 15 | obj-y += idle_task.o fair.o rt.o deadline.o stop_task.o | 15 | obj-y += idle_task.o fair.o rt.o deadline.o stop_task.o |
| 16 | obj-y += wait.o completion.o | 16 | obj-y += wait.o completion.o idle.o |
| 17 | obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o | 17 | obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o |
| 18 | obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o | 18 | obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o |
| 19 | obj-$(CONFIG_SCHEDSTATS) += stats.o | 19 | obj-$(CONFIG_SCHEDSTATS) += stats.o |
diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c index 4a073539c58e..e73efba98301 100644 --- a/kernel/sched/auto_group.c +++ b/kernel/sched/auto_group.c | |||
| @@ -203,7 +203,7 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice) | |||
| 203 | struct autogroup *ag; | 203 | struct autogroup *ag; |
| 204 | int err; | 204 | int err; |
| 205 | 205 | ||
| 206 | if (nice < -20 || nice > 19) | 206 | if (nice < MIN_NICE || nice > MAX_NICE) |
| 207 | return -EINVAL; | 207 | return -EINVAL; |
| 208 | 208 | ||
| 209 | err = security_task_setnice(current, nice); | 209 | err = security_task_setnice(current, nice); |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index f5c6635b806c..ae365aaa8181 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -1745,8 +1745,10 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) | |||
| 1745 | p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq : 0; | 1745 | p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq : 0; |
| 1746 | p->numa_scan_period = sysctl_numa_balancing_scan_delay; | 1746 | p->numa_scan_period = sysctl_numa_balancing_scan_delay; |
| 1747 | p->numa_work.next = &p->numa_work; | 1747 | p->numa_work.next = &p->numa_work; |
| 1748 | p->numa_faults = NULL; | 1748 | p->numa_faults_memory = NULL; |
| 1749 | p->numa_faults_buffer = NULL; | 1749 | p->numa_faults_buffer_memory = NULL; |
| 1750 | p->last_task_numa_placement = 0; | ||
| 1751 | p->last_sum_exec_runtime = 0; | ||
| 1750 | 1752 | ||
| 1751 | INIT_LIST_HEAD(&p->numa_entry); | 1753 | INIT_LIST_HEAD(&p->numa_entry); |
| 1752 | p->numa_group = NULL; | 1754 | p->numa_group = NULL; |
| @@ -2149,8 +2151,6 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev) | |||
| 2149 | if (mm) | 2151 | if (mm) |
| 2150 | mmdrop(mm); | 2152 | mmdrop(mm); |
| 2151 | if (unlikely(prev_state == TASK_DEAD)) { | 2153 | if (unlikely(prev_state == TASK_DEAD)) { |
| 2152 | task_numa_free(prev); | ||
| 2153 | |||
| 2154 | if (prev->sched_class->task_dead) | 2154 | if (prev->sched_class->task_dead) |
| 2155 | prev->sched_class->task_dead(prev); | 2155 | prev->sched_class->task_dead(prev); |
| 2156 | 2156 | ||
| @@ -2167,13 +2167,6 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev) | |||
| 2167 | 2167 | ||
| 2168 | #ifdef CONFIG_SMP | 2168 | #ifdef CONFIG_SMP |
| 2169 | 2169 | ||
| 2170 | /* assumes rq->lock is held */ | ||
