diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 1085 |
1 files changed, 784 insertions, 301 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 11dd52780ad..bec249885e1 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -331,6 +331,13 @@ static DEFINE_PER_CPU(struct rt_rq, init_rt_rq) ____cacheline_aligned_in_smp; | |||
| 331 | */ | 331 | */ |
| 332 | static DEFINE_SPINLOCK(task_group_lock); | 332 | static DEFINE_SPINLOCK(task_group_lock); |
| 333 | 333 | ||
| 334 | #ifdef CONFIG_SMP | ||
| 335 | static int root_task_group_empty(void) | ||
| 336 | { | ||
| 337 | return list_empty(&root_task_group.children); | ||
| 338 | } | ||
| 339 | #endif | ||
| 340 | |||
| 334 | #ifdef CONFIG_FAIR_GROUP_SCHED | 341 | #ifdef CONFIG_FAIR_GROUP_SCHED |
| 335 | #ifdef CONFIG_USER_SCHED | 342 | #ifdef CONFIG_USER_SCHED |
| 336 | # define INIT_TASK_GROUP_LOAD (2*NICE_0_LOAD) | 343 | # define INIT_TASK_GROUP_LOAD (2*NICE_0_LOAD) |
| @@ -391,6 +398,13 @@ static inline void set_task_rq(struct task_struct *p, unsigned int cpu) | |||
| 391 | 398 | ||
| 392 | #else | 399 | #else |
| 393 | 400 | ||
| 401 | #ifdef CONFIG_SMP | ||
| 402 | static int root_task_group_empty(void) | ||
| 403 | { | ||
| 404 | return 1; | ||
| 405 | } | ||
| 406 | #endif | ||
| 407 | |||
| 394 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) { } | 408 | static inline void set_task_rq(struct task_struct *p, unsigned int cpu) { } |
| 395 | static inline struct task_group *task_group(struct task_struct *p) | 409 | static inline struct task_group *task_group(struct task_struct *p) |
| 396 | { | 410 | { |
| @@ -467,11 +481,17 @@ struct rt_rq { | |||
| 467 | struct rt_prio_array active; | 481 | struct rt_prio_array active; |
| 468 | unsigned long rt_nr_running; | 482 | unsigned long rt_nr_running; |
| 469 | #if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED | 483 | #if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED |
| 470 | int highest_prio; /* highest queued rt task prio */ | 484 | struct { |
| 485 | int curr; /* highest queued rt task prio */ | ||
| 486 | #ifdef CONFIG_SMP | ||
| 487 | int next; /* next highest */ | ||
| 488 | #endif | ||
| 489 | } highest_prio; | ||
| 471 | #endif | 490 | #endif |
| 472 | #ifdef CONFIG_SMP | 491 | #ifdef CONFIG_SMP |
| 473 | unsigned long rt_nr_migratory; | 492 | unsigned long rt_nr_migratory; |
| 474 | int overloaded; | 493 | int overloaded; |
| 494 | struct plist_head pushable_tasks; | ||
| 475 | #endif | 495 | #endif |
| 476 | int rt_throttled; | 496 | int rt_throttled; |
| 477 | u64 rt_time; | 497 | u64 rt_time; |
| @@ -549,7 +569,6 @@ struct rq { | |||
| 549 | unsigned long nr_running; | 569 | unsigned long nr_running; |
| 550 | #define CPU_LOAD_IDX_MAX 5 | 570 | #define CPU_LOAD_IDX_MAX 5 |
| 551 | unsigned long cpu_load[CPU_LOAD_IDX_MAX]; | 571 | unsigned long cpu_load[CPU_LOAD_IDX_MAX]; |
| 552 | unsigned char idle_at_tick; | ||
| 553 | #ifdef CONFIG_NO_HZ | 572 | #ifdef CONFIG_NO_HZ |
| 554 | unsigned long last_tick_seen; | 573 | unsigned long last_tick_seen; |
| 555 | unsigned char in_nohz_recently; | 574 | unsigned char in_nohz_recently; |
| @@ -590,6 +609,7 @@ struct rq { | |||
| 590 | struct root_domain *rd; | 609 | struct root_domain *rd; |
| 591 | struct sched_domain *sd; | 610 | struct sched_domain *sd; |
| 592 | 611 | ||
| 612 | unsigned char idle_at_tick; | ||
| 593 | /* For active balancing */ | 613 | /* For active balancing */ |
| 594 | int active_balance; | 614 | int active_balance; |
| 595 | int push_cpu; | 615 | int push_cpu; |
| @@ -618,9 +638,6 @@ struct rq { | |||
| 618 | /* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */ | 638 | /* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */ |
| 619 | 639 | ||
| 620 | /* sys_sched_yield() stats */ | 640 | /* sys_sched_yield() stats */ |
| 621 | unsigned int yld_exp_empty; | ||
| 622 | unsigned int yld_act_empty; | ||
| 623 | unsigned int yld_both_empty; | ||
| 624 | unsigned int yld_count; | 641 | unsigned int yld_count; |
| 625 | 642 | ||
| 626 | /* schedule() stats */ | 643 | /* schedule() stats */ |
| @@ -1093,7 +1110,7 @@ static void hrtick_start(struct rq *rq, u64 delay) | |||
| 1093 | if (rq == this_rq()) { | 1110 | if (rq == this_rq()) { |
| 1094 | hrtimer_restart(timer); | 1111 | hrtimer_restart(timer); |
| 1095 | } else if (!rq->hrtick_csd_pending) { | 1112 | } else if (!rq->hrtick_csd_pending) { |
| 1096 | __smp_call_function_single(cpu_of(rq), &rq->hrtick_csd); | 1113 | __smp_call_function_single(cpu_of(rq), &rq->hrtick_csd, 0); |
| 1097 | rq->hrtick_csd_pending = 1; | 1114 | rq->hrtick_csd_pending = 1; |
| 1098 | } | 1115 | } |
| 1099 | } | 1116 | } |
| @@ -1183,10 +1200,10 @@ static void resched_task(struct task_struct *p) | |||
| 1183 | 1200 | ||
| 1184 | assert_spin_locked(&task_rq(p)->lock); | 1201 | assert_spin_locked(&task_rq(p)->lock); |
| 1185 | 1202 | ||
| 1186 | if (unlikely(test_tsk_thread_flag(p, TIF_NEED_RESCHED))) | 1203 | if (test_tsk_need_resched(p)) |
| 1187 | return; | 1204 | return; |
| 1188 | 1205 | ||
| 1189 | set_tsk_thread_flag(p, TIF_NEED_RESCHED); | 1206 | set_tsk_need_resched(p); |
| 1190 | 1207 | ||
| 1191 | cpu = task_cpu(p); | 1208 | cpu = task_cpu(p); |
| 1192 | if (cpu == smp_processor_id()) | 1209 | if (cpu == smp_processor_id()) |
| @@ -1242,7 +1259,7 @@ void wake_up_idle_cpu(int cpu) | |||
| 1242 | * lockless. The worst case is that the other CPU runs the | 1259 | * lockless. The worst case is that the other CPU runs the |
| 1243 | * idle task through an additional NOOP schedule() | 1260 | * idle task through an additional NOOP schedule() |
| 1244 | */ | 1261 | */ |
| 1245 | set_tsk_thread_flag(rq->idle, TIF_NEED_RESCHED); | 1262 | set_tsk_need_resched(rq->idle); |
| 1246 | 1263 | ||
| 1247 | /* NEED_RESCHED must be visible before we test polling */ | 1264 | /* NEED_RESCHED must be visible before we test polling */ |
| 1248 | smp_mb(); | 1265 | smp_mb(); |
| @@ -1610,21 +1627,42 @@ static inline void update_shares_locked(struct rq *rq, struct sched_domain *sd) | |||
| 1610 | 1627 | ||
| 1611 | #endif | 1628 | #endif |
| 1612 | 1629 | ||
| 1630 | #ifdef CONFIG_PREEMPT | ||
| 1631 | |||
| 1613 | /* | 1632 | /* |
| 1614 | * double_lock_balance - lock the busiest runqueue, this_rq is locked already. | 1633 | * fair double_lock_balance: Safely acquires both rq->locks in a fair |
| 1634 | * way at the expense of forcing extra atomic operations in all | ||
| 1635 | * invocations. This assures that the double_lock is acquired using the | ||
| 1636 | * same underlying policy as the spinlock_t on this architecture, which | ||
| 1637 | * reduces latency compared to the unfair variant below. However, it | ||
| 1638 | * also adds more overhead and therefore may reduce throughput. | ||
| 1615 | */ | 1639 | */ |
| 1616 | static int double_lock_balance(struct rq *this_rq, struct rq *busiest) | 1640 | static inline int _double_lock_balance(struct rq *this_rq, struct rq *busiest) |
| 1641 | __releases(this_rq->lock) | ||
| 1642 | __acquires(busiest->lock) | ||
| 1643 | __acquires(this_rq->lock) | ||
| 1644 | { | ||
| 1645 | spin_unlock(&this_rq->lock); | ||
| 1646 | double_rq_lock(this_rq, busiest); | ||
| 1647 | |||
| 1648 | return 1; | ||
| 1649 | } | ||
| 1650 | |||
| 1651 | #else | ||
| 1652 | /* | ||
| 1653 | * Unfair double_lock_balance: Optimizes throughput at the expense of | ||
| 1654 | * latency by eliminating extra atomic operations when the locks are | ||
| 1655 | * already in proper order on entry. This favors lower cpu-ids and will | ||
| 1656 | * grant the double lock to lower cpus over higher ids under contention, | ||
| 1657 | * regardless of entry order into the function. | ||
| 1658 | */ | ||
| 1659 | static int _double_lock_balance(struct rq *this_rq, struct rq *busiest) | ||
| 1617 | __releases(this_rq->lock) | 1660 | __releases(this_rq->lock) |
| 1618 | __acquires(busiest->lock) | 1661 | __acquires(busiest->lock) |
| 1619 | __acquires(this_rq->lock) | 1662 | __acquires(this_rq->lock) |
| 1620 | { | 1663 | { |
| 1621 | int ret = 0; | 1664 | int ret = 0; |
| 1622 | 1665 | ||
| 1623 | if (unlikely(!irqs_disabled())) { | ||
| 1624 | /* printk() doesn't work good under rq->lock */ | ||
| 1625 | spin_unlock(&this_rq->lock); | ||
| 1626 | BUG_ON(1); | ||
| 1627 | } | ||
| 1628 | if (unlikely(!spin_trylock(&busiest->lock))) { | 1666 | if (unlikely(!spin_trylock(&busiest->lock))) { |
| 1629 | if (busiest < this_rq) { | 1667 | if (busiest < this_rq) { |
| 1630 | spin_unlock(&this_rq->lock); | 1668 | spin_unlock(&this_rq->lock); |
| @@ -1637,6 +1675,22 @@ static int double_lock_balance(struct rq *this_rq, struct rq *busiest) | |||
| 1637 | return ret; | 1675 | return ret; |
| 1638 | } | 1676 | } |
| 1639 | 1677 | ||
| 1678 | #endif /* CONFIG_PREEMPT */ | ||
| 1679 | |||
| 1680 | /* | ||
| 1681 | * double_lock_balance - lock the busiest runqueue, this_rq is locked already. | ||
| 1682 | */ | ||
| 1683 | static int double_lock_balance(struct rq *this_rq, struct rq *busiest) | ||
| 1684 | { | ||
| 1685 | if (unlikely(!irqs_disabled())) { | ||
| 1686 | /* printk() doesn't work good under rq->lock */ | ||
| 1687 | spin_unlock(&this_rq->lock); | ||
| 1688 | BUG_ON(1); | ||
| 1689 | } | ||
| 1690 | |||
| 1691 | return _double_lock_balance(this_rq, busiest); | ||
| 1692 | } | ||
| 1693 | |||
| 1640 | static inline void double_unlock_balance(struct rq *this_rq, struct rq *busiest) | 1694 | static inline void double_unlock_balance(struct rq *this_rq, struct rq *busiest) |
| 1641 | __releases(busiest->lock) | 1695 | __releases(busiest->lock) |
| 1642 | { | 1696 | { |
| @@ -1705,6 +1759,9 @@ static void update_avg(u64 *avg, u64 sample) | |||
| 1705 | 1759 | ||
| 1706 | static void enqueue_task(struct rq *rq, struct task_struct *p, int wakeup) | 1760 | static void enqueue_task(struct rq *rq, struct task_struct *p, int wakeup) |
| 1707 | { | 1761 | { |
| 1762 | if (wakeup) | ||
| 1763 | p->se.start_runtime = p->se.sum_exec_runtime; | ||
| 1764 | |||
| 1708 | sched_info_queued(p); | ||
