diff options
| -rw-r--r-- | arch/blackfin/kernel/process.c | 2 | ||||
| -rw-r--r-- | include/linux/init_task.h | 2 | ||||
| -rw-r--r-- | include/linux/sched.h | 2 | ||||
| -rw-r--r-- | kernel/sched/core.c | 2 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 2 | ||||
| -rw-r--r-- | kernel/sched/rt.c | 36 |
6 files changed, 26 insertions, 20 deletions
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index 2e3994b20169..62bcea7dcc6d 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c | |||
| @@ -173,7 +173,7 @@ asmlinkage int bfin_clone(struct pt_regs *regs) | |||
| 173 | unsigned long newsp; | 173 | unsigned long newsp; |
| 174 | 174 | ||
| 175 | #ifdef __ARCH_SYNC_CORE_DCACHE | 175 | #ifdef __ARCH_SYNC_CORE_DCACHE |
| 176 | if (current->rt.nr_cpus_allowed == num_possible_cpus()) | 176 | if (current->nr_cpus_allowed == num_possible_cpus()) |
| 177 | set_cpus_allowed_ptr(current, cpumask_of(smp_processor_id())); | 177 | set_cpus_allowed_ptr(current, cpumask_of(smp_processor_id())); |
| 178 | #endif | 178 | #endif |
| 179 | 179 | ||
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index e4baff5f7ff4..9e65eff6af3b 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -149,6 +149,7 @@ extern struct cred init_cred; | |||
| 149 | .normal_prio = MAX_PRIO-20, \ | 149 | .normal_prio = MAX_PRIO-20, \ |
| 150 | .policy = SCHED_NORMAL, \ | 150 | .policy = SCHED_NORMAL, \ |
| 151 | .cpus_allowed = CPU_MASK_ALL, \ | 151 | .cpus_allowed = CPU_MASK_ALL, \ |
| 152 | .nr_cpus_allowed= NR_CPUS, \ | ||
| 152 | .mm = NULL, \ | 153 | .mm = NULL, \ |
| 153 | .active_mm = &init_mm, \ | 154 | .active_mm = &init_mm, \ |
| 154 | .se = { \ | 155 | .se = { \ |
| @@ -157,7 +158,6 @@ extern struct cred init_cred; | |||
| 157 | .rt = { \ | 158 | .rt = { \ |
| 158 | .run_list = LIST_HEAD_INIT(tsk.rt.run_list), \ | 159 | .run_list = LIST_HEAD_INIT(tsk.rt.run_list), \ |
| 159 | .time_slice = RR_TIMESLICE, \ | 160 | .time_slice = RR_TIMESLICE, \ |
| 160 | .nr_cpus_allowed = NR_CPUS, \ | ||
| 161 | }, \ | 161 | }, \ |
| 162 | .tasks = LIST_HEAD_INIT(tsk.tasks), \ | 162 | .tasks = LIST_HEAD_INIT(tsk.tasks), \ |
| 163 | INIT_PUSHABLE_TASKS(tsk) \ | 163 | INIT_PUSHABLE_TASKS(tsk) \ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index d61e5977e517..0f50e78f7f44 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1188,7 +1188,6 @@ struct sched_rt_entity { | |||
| 1188 | struct list_head run_list; | 1188 | struct list_head run_list; |
| 1189 | unsigned long timeout; | 1189 | unsigned long timeout; |
| 1190 | unsigned int time_slice; | 1190 | unsigned int time_slice; |
| 1191 | int nr_cpus_allowed; | ||
| 1192 | 1191 | ||
| 1193 | struct sched_rt_entity *back; | 1192 | struct sched_rt_entity *back; |
| 1194 | #ifdef CONFIG_RT_GROUP_SCHED | 1193 | #ifdef CONFIG_RT_GROUP_SCHED |
| @@ -1253,6 +1252,7 @@ struct task_struct { | |||
| 1253 | #endif | 1252 | #endif |
| 1254 | 1253 | ||
| 1255 | unsigned int policy; | 1254 | unsigned int policy; |
| 1255 | int nr_cpus_allowed; | ||
| 1256 | cpumask_t cpus_allowed; | 1256 | cpumask_t cpus_allowed; |
| 1257 | 1257 | ||
| 1258 | #ifdef CONFIG_PREEMPT_RCU | 1258 | #ifdef CONFIG_PREEMPT_RCU |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 3a69374fb427..70cc36a6073f 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -5015,7 +5015,7 @@ void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) | |||
| 5015 | p->sched_class->set_cpus_allowed(p, new_mask); | 5015 | p->sched_class->set_cpus_allowed(p, new_mask); |
| 5016 | 5016 | ||
| 5017 | cpumask_copy(&p->cpus_allowed, new_mask); | 5017 | cpumask_copy(&p->cpus_allowed, new_mask); |
| 5018 | p->rt.nr_cpus_allowed = cpumask_weight(new_mask); | 5018 | p->nr_cpus_allowed = cpumask_weight(new_mask); |
| 5019 | } | 5019 | } |
| 5020 | 5020 | ||
| 5021 | /* | 5021 | /* |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 2b449a762074..b2a2d236f27b 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -2703,7 +2703,7 @@ select_task_rq_fair(struct task_struct *p, int sd_flag, int wake_flags) | |||
| 2703 | int want_sd = 1; | 2703 | int want_sd = 1; |
| 2704 | int sync = wake_flags & WF_SYNC; | 2704 | int sync = wake_flags & WF_SYNC; |
| 2705 | 2705 | ||
| 2706 | if (p->rt.nr_cpus_allowed == 1) | 2706 | if (p->nr_cpus_allowed == 1) |
| 2707 | return prev_cpu; | 2707 | return prev_cpu; |
| 2708 | 2708 | ||
| 2709 | if (sd_flag & SD_BALANCE_WAKE) { | 2709 | if (sd_flag & SD_BALANCE_WAKE) { |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index c5565c3c515f..295da737b6fe 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -274,13 +274,16 @@ static void update_rt_migration(struct rt_rq *rt_rq) | |||
| 274 | 274 | ||
| 275 | static void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | 275 | static void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) |
| 276 | { | 276 | { |
| 277 | struct task_struct *p; | ||
| 278 | |||
| 277 | if (!rt_entity_is_task(rt_se)) | 279 | if (!rt_entity_is_task(rt_se)) |
| 278 | return; | 280 | return; |
| 279 | 281 | ||
| 282 | p = rt_task_of(rt_se); | ||
| 280 | rt_rq = &rq_of_rt_rq(rt_rq)->rt; | 283 | rt_rq = &rq_of_rt_rq(rt_rq)->rt; |
| 281 | 284 | ||
| 282 | rt_rq->rt_nr_total++; | 285 | rt_rq->rt_nr_total++; |
| 283 | if (rt_se->nr_cpus_allowed > 1) | 286 | if (p->nr_cpus_allowed > 1) |
| 284 | rt_rq->rt_nr_migratory++; | 287 | rt_rq->rt_nr_migratory++; |
| 285 | 288 | ||
| 286 | update_rt_migration(rt_rq); | 289 | update_rt_migration(rt_rq); |
| @@ -288,13 +291,16 @@ static void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | |||
| 288 | 291 | ||
| 289 | static void dec_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | 292 | static void dec_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) |
| 290 | { | 293 | { |
| 294 | struct task_struct *p; | ||
| 295 | |||
| 291 | if (!rt_entity_is_task(rt_se)) | 296 | if (!rt_entity_is_task(rt_se)) |
| 292 | return; | 297 | return; |
| 293 | 298 | ||
| 299 | p = rt_task_of(rt_se); | ||
| 294 | rt_rq = &rq_of_rt_rq(rt_rq)->rt; | 300 | rt_rq = &rq_of_rt_rq(rt_rq)->rt; |
| 295 | 301 | ||
| 296 | rt_rq->rt_nr_total--; | 302 | rt_rq->rt_nr_total--; |
| 297 | if (rt_se->nr_cpus_allowed > 1) | 303 | if (p->nr_cpus_allowed > 1) |
| 298 | rt_rq->rt_nr_migratory--; | 304 | rt_rq->rt_nr_migratory--; |
| 299 | 305 | ||
| 300 | update_rt_migration(rt_rq); | 306 | update_rt_migration(rt_rq); |
| @@ -1161,7 +1167,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) | |||
| 1161 | 1167 | ||
| 1162 | enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); | 1168 | enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); |
| 1163 | 1169 | ||
| 1164 | if (!task_current(rq, p) && p->rt.nr_cpus_allowed > 1) | 1170 | if (!task_current(rq, p) && p->nr_cpus_allowed > 1) |
| 1165 | enqueue_pushable_task(rq, p); | 1171 | enqueue_pushable_task(rq, p); |
| 1166 | 1172 | ||
| 1167 | inc_nr_running(rq); | 1173 | inc_nr_running(rq); |
| @@ -1225,7 +1231,7 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags) | |||
| 1225 | 1231 | ||
| 1226 | cpu = task_cpu(p); | 1232 | cpu = task_cpu(p); |
| 1227 | 1233 | ||
| 1228 | if (p->rt.nr_cpus_allowed == 1) | 1234 | if (p->nr_cpus_allowed == 1) |
| 1229 | goto out; | 1235 | goto out; |
| 1230 | 1236 | ||
| 1231 | /* For anything but wake ups, just return the task_cpu */ | 1237 | /* For anything but wake ups, just return the task_cpu */ |
| @@ -1260,9 +1266,9 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags) | |||
| 1260 | * will have to sort it out. | 1266 | * will have to sort it out. |
| 1261 | */ | 1267 | */ |
| 1262 | if (curr && unlikely(rt_task(curr)) && | 1268 | if (curr && unlikely(rt_task(curr)) && |
| 1263 | (curr->rt.nr_cpus_allowed < 2 || | 1269 | (curr->nr_cpus_allowed < 2 || |
| 1264 | curr->prio <= p->prio) && | 1270 | curr->prio <= p->prio) && |
| 1265 | (p->rt.nr_cpus_allowed > 1)) { | 1271 | (p->nr_cpus_allowed > 1)) { |
| 1266 | int target = find_lowest_rq(p); | 1272 | int target = find_lowest_rq(p); |
| 1267 | 1273 | ||
| 1268 | if (target != -1) | 1274 | if (target != -1) |
| @@ -1276,10 +1282,10 @@ out: | |||
| 1276 | 1282 | ||
| 1277 | static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) | 1283 | static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) |
| 1278 | { | 1284 | { |
| 1279 | if (rq->curr->rt.nr_cpus_allowed == 1) | 1285 | if (rq->curr->nr_cpus_allowed == 1) |
| 1280 | return; | 1286 | return; |
| 1281 | 1287 | ||
| 1282 | if (p->rt.nr_cpus_allowed != 1 | 1288 | if (p->nr_cpus_allowed != 1 |
| 1283 | && cpupri_find(&rq->rd->cpupri, p, NULL)) | 1289 | && cpupri_find(&rq->rd->cpupri, p, NULL)) |
| 1284 | return; | 1290 | return; |
| 1285 | 1291 | ||
| @@ -1395,7 +1401,7 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p) | |||
| 1395 | * The previous task needs to be made eligible for pushing | 1401 | * The previous task needs to be made eligible for pushing |
| 1396 | * if it is still active | 1402 | * if it is still active |
| 1397 | */ | 1403 | */ |
| 1398 | if (on_rt_rq(&p->rt) && p->rt.nr_cpus_allowed > 1) | 1404 | if (on_rt_rq(&p->rt) && p->nr_cpus_allowed > 1) |
| 1399 | enqueue_pushable_task(rq, p); | 1405 | enqueue_pushable_task(rq, p); |
| 1400 | } | 1406 | } |
| 1401 | 1407 | ||
| @@ -1408,7 +1414,7 @@ static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu) | |||
| 1408 | { | 1414 | { |
| 1409 | if (!task_running(rq, p) && | 1415 | if (!task_running(rq, p) && |
| 1410 | (cpu < 0 || cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) && | 1416 | (cpu < 0 || cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) && |
| 1411 | (p->rt.nr_cpus_allowed > 1)) | 1417 | (p->nr_cpus_allowed > 1)) |
| 1412 | return 1; | 1418 | return 1; |
| 1413 | return 0; | 1419 | return 0; |
| 1414 | } | 1420 | } |
| @@ -1464,7 +1470,7 @@ static int find_lowest_rq(struct task_struct *task) | |||
| 1464 | if (unlikely(!lowest_mask)) | 1470 | if (unlikely(!lowest_mask)) |
| 1465 | return -1; | 1471 | return -1; |
| 1466 | 1472 | ||
| 1467 | if (task->rt.nr_cpus_allowed == 1) | 1473 | if (task->nr_cpus_allowed == 1) |
| 1468 | return -1; /* No other targets possible */ | 1474 | return -1; /* No other targets possible */ |
| 1469 | 1475 | ||
| 1470 | if (!cpupri_find(&task_rq(task)->rd->cpupri, task, lowest_mask)) | 1476 | if (!cpupri_find(&task_rq(task)->rd->cpupri, task, lowest_mask)) |
| @@ -1586,7 +1592,7 @@ static struct task_struct *pick_next_pushable_task(struct rq *rq) | |||
| 1586 | 1592 | ||
| 1587 | BUG_ON(rq->cpu != task_cpu(p)); | 1593 | BUG_ON(rq->cpu != task_cpu(p)); |
| 1588 | BUG_ON(task_current(rq, p)); | 1594 | BUG_ON(task_current(rq, p)); |
| 1589 | BUG_ON(p->rt.nr_cpus_allowed <= 1); | 1595 | BUG_ON(p->nr_cpus_allowed <= 1); |
| 1590 | 1596 | ||
| 1591 | BUG_ON(!p->on_rq); | 1597 | BUG_ON(!p->on_rq); |
| 1592 | BUG_ON(!rt_task(p)); | 1598 | BUG_ON(!rt_task(p)); |
| @@ -1793,9 +1799,9 @@ static void task_woken_rt(struct rq *rq, struct task_struct *p) | |||
| 1793 | if (!task_running(rq, p) && | 1799 | if (!task_running(rq, p) && |
| 1794 | !test_tsk_need_resched(rq->curr) && | 1800 | !test_tsk_need_resched(rq->curr) && |
| 1795 | has_pushable_tasks(rq) && | 1801 | has_pushable_tasks(rq) && |
| 1796 | p->rt.nr_cpus_allowed > 1 && | 1802 | p->nr_cpus_allowed > 1 && |
| 1797 | rt_task(rq->curr) && | 1803 | rt_task(rq->curr) && |
| 1798 | (rq->curr->rt.nr_cpus_allowed < 2 || | 1804 | (rq->curr->nr_cpus_allowed < 2 || |
| 1799 | rq->curr->prio <= p->prio)) | 1805 | rq->curr->prio <= p->prio)) |
| 1800 | push_rt_tasks(rq); | 1806 | push_rt_tasks(rq); |
| 1801 | } | 1807 | } |
| @@ -1817,7 +1823,7 @@ static void set_cpus_allowed_rt(struct task_struct *p, | |||
| 1817 | * Only update if the process changes its state from whether it | 1823 | * Only update if the process changes its state from whether it |
| 1818 | * can migrate or not. | 1824 | * can migrate or not. |
| 1819 | */ | 1825 | */ |
| 1820 | if ((p->rt.nr_cpus_allowed > 1) == (weight > 1)) | 1826 | if ((p->nr_cpus_allowed > 1) == (weight > 1)) |
| 1821 | return; | 1827 | return; |
| 1822 | 1828 | ||
| 1823 | rq = task_rq(p); | 1829 | rq = task_rq(p); |
