diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 86be13ee5006..2794c79b9197 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -1632,7 +1632,7 @@ void pull_task(runqueue_t *src_rq, prio_array_t *src_array, task_t *p, | |||
1632 | */ | 1632 | */ |
1633 | static inline | 1633 | static inline |
1634 | int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, | 1634 | int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, |
1635 | struct sched_domain *sd, enum idle_type idle) | 1635 | struct sched_domain *sd, enum idle_type idle, int *all_pinned) |
1636 | { | 1636 | { |
1637 | /* | 1637 | /* |
1638 | * We do not migrate tasks that are: | 1638 | * We do not migrate tasks that are: |
@@ -1640,10 +1640,12 @@ int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, | |||
1640 | * 2) cannot be migrated to this CPU due to cpus_allowed, or | 1640 | * 2) cannot be migrated to this CPU due to cpus_allowed, or |
1641 | * 3) are cache-hot on their current CPU. | 1641 | * 3) are cache-hot on their current CPU. |
1642 | */ | 1642 | */ |
1643 | if (task_running(rq, p)) | ||
1644 | return 0; | ||
1645 | if (!cpu_isset(this_cpu, p->cpus_allowed)) | 1643 | if (!cpu_isset(this_cpu, p->cpus_allowed)) |
1646 | return 0; | 1644 | return 0; |
1645 | *all_pinned = 0; | ||
1646 | |||
1647 | if (task_running(rq, p)) | ||
1648 | return 0; | ||
1647 | 1649 | ||
1648 | /* | 1650 | /* |
1649 | * Aggressive migration if: | 1651 | * Aggressive migration if: |
@@ -1656,7 +1658,7 @@ int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, | |||
1656 | return 1; | 1658 | return 1; |
1657 | 1659 | ||
1658 | if (task_hot(p, rq->timestamp_last_tick, sd)) | 1660 | if (task_hot(p, rq->timestamp_last_tick, sd)) |
1659 | return 0; | 1661 | return 0; |
1660 | return 1; | 1662 | return 1; |
1661 | } | 1663 | } |
1662 | 1664 | ||
@@ -1669,16 +1671,18 @@ int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, | |||
1669 | */ | 1671 | */ |
1670 | static int move_tasks(runqueue_t *this_rq, int this_cpu, runqueue_t *busiest, | 1672 | static int move_tasks(runqueue_t *this_rq, int this_cpu, runqueue_t *busiest, |
1671 | unsigned long max_nr_move, struct sched_domain *sd, | 1673 | unsigned long max_nr_move, struct sched_domain *sd, |
1672 | enum idle_type idle) | 1674 | enum idle_type idle, int *all_pinned) |
1673 | { | 1675 | { |
1674 | prio_array_t *array, *dst_array; | 1676 | prio_array_t *array, *dst_array; |
1675 | struct list_head *head, *curr; | 1677 | struct list_head *head, *curr; |
1676 | int idx, pulled = 0; | 1678 | int idx, pulled = 0, pinned = 0; |
1677 | task_t *tmp; | 1679 | task_t *tmp; |
1678 | 1680 | ||
1679 | if (max_nr_move <= 0 || busiest->nr_running <= 1) | 1681 | if (max_nr_move == 0) |
1680 | goto out; | 1682 | goto out; |
1681 | 1683 | ||
1684 | pinned = 1; | ||
1685 | |||
1682 | /* | 1686 | /* |
1683 | * We first consider expired tasks. Those will likely not be | 1687 | * We first consider expired tasks. Those will likely not be |
1684 | * executed in the near future, and they are most likely to | 1688 | * executed in the near future, and they are most likely to |
@@ -1717,7 +1721,7 @@ skip_queue: | |||
1717 | 1721 | ||
1718 | curr = curr->prev; | 1722 | curr = curr->prev; |
1719 | 1723 | ||
1720 | if (!can_migrate_task(tmp, busiest, this_cpu, sd, idle)) { | 1724 | if (!can_migrate_task(tmp, busiest, this_cpu, sd, idle, &pinned)) { |
1721 | if (curr != head) | 1725 | if (curr != head) |
1722 | goto skip_queue; | 1726 | goto skip_queue; |
1723 | idx++; | 1727 | idx++; |
@@ -1746,6 +1750,9 @@ out: | |||
1746 | * inside pull_task(). | 1750 | * inside pull_task(). |
1747 | */ | 1751 | */ |
1748 | schedstat_add(sd, lb_gained[idle], pulled); | 1752 | schedstat_add(sd, lb_gained[idle], pulled); |
1753 | |||
1754 | if (all_pinned) | ||
1755 | *all_pinned = pinned; | ||
1749 | return pulled; | 1756 | return pulled; |
1750 | } | 1757 | } |
1751 | 1758 | ||
@@ -1917,7 +1924,8 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, | |||
1917 | struct sched_group *group; | 1924 | struct sched_group *group; |
1918 | runqueue_t *busiest; | 1925 | runqueue_t *busiest; |
1919 | unsigned long imbalance; | 1926 | unsigned long imbalance; |
1920 | int nr_moved; | 1927 | int nr_moved, all_pinned; |
1928 | int active_balance = 0; | ||
1921 | 1929 | ||
1922 | spin_lock(&this_rq->lock); | 1930 | spin_lock(&this_rq->lock); |
1923 | schedstat_inc(sd, lb_cnt[idle]); | 1931 | schedstat_inc(sd, lb_cnt[idle]); |
@@ -1956,9 +1964,15 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, | |||
1956 | */ | 1964 | */ |
1957 | double_lock_balance(this_rq, busiest); | 1965 | double_lock_balance(this_rq, busiest); |
1958 | nr_moved = move_tasks(this_rq, this_cpu, busiest, | 1966 | nr_moved = move_tasks(this_rq, this_cpu, busiest, |
1959 | imbalance, sd, idle); | 1967 | imbalance, sd, idle, |
1968 | &all_pinned); | ||
1960 | spin_unlock(&busiest->lock); | 1969 | spin_unlock(&busiest->lock); |
1970 | |||
1971 | /* All tasks on this runqueue were pinned by CPU affinity */ | ||
1972 | if (unlikely(all_pinned)) | ||
1973 | goto out_balanced; | ||
1961 | } | 1974 | } |
1975 | |||
1962 | spin_unlock(&this_rq->lock); | 1976 | spin_unlock(&this_rq->lock); |
1963 | 1977 | ||
1964 | if (!nr_moved) { | 1978 | if (!nr_moved) { |
@@ -1966,16 +1980,15 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, | |||
1966 | sd->nr_balance_failed++; | 1980 | sd->nr_balance_failed++; |
1967 | 1981 | ||
1968 | if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) { | 1982 | if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) { |
1969 | int wake = 0; | ||
1970 | 1983 | ||
1971 | spin_lock(&busiest->lock); | 1984 | spin_lock(&busiest->lock); |
1972 | if (!busiest->active_balance) { | 1985 | if (!busiest->active_balance) { |
1973 | busiest->active_balance = 1; | 1986 | busiest->active_balance = 1; |
1974 | busiest->push_cpu = this_cpu; | 1987 | busiest->push_cpu = this_cpu; |
1975 | wake = 1; | 1988 | active_balance = 1; |
1976 | } | 1989 | } |
1977 | spin_unlock(&busiest->lock); | 1990 | spin_unlock(&busiest->lock); |
1978 | if (wake) | 1991 | if (active_balance) |
1979 | wake_up_process(busiest->migration_thread); | 1992 | wake_up_process(busiest->migration_thread); |
1980 | 1993 | ||
1981 | /* | 1994 | /* |
@@ -1984,18 +1997,21 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, | |||
1984 | */ | 1997 | */ |
1985 | sd->nr_balance_failed = sd->cache_nice_tries; | 1998 | sd->nr_balance_failed = sd->cache_nice_tries; |
1986 | } | 1999 | } |
1987 | 2000 | } else | |
1988 | /* | ||
1989 | * We were unbalanced, but unsuccessful in move_tasks(), | ||
1990 | * so bump the balance_interval to lessen the lock contention. | ||
1991 | */ | ||
1992 | if (sd->balance_interval < sd->max_interval) | ||
1993 | sd->balance_interval++; | ||
1994 | } else { | ||
1995 | sd->nr_balance_failed = 0; | 2001 | sd->nr_balance_failed = 0; |
1996 | 2002 | ||
2003 | if (likely(!active_balance)) { | ||
1997 | /* We were unbalanced, so reset the balancing interval */ | 2004 | /* We were unbalanced, so reset the balancing interval */ |
1998 | sd->balance_interval = sd->min_interval; | 2005 | sd->balance_interval = sd->min_interval; |
2006 | } else { | ||
2007 | /* | ||
2008 | * If we've begun active balancing, start to back off. This | ||
2009 | * case may not be covered by the all_pinned logic if there | ||
2010 | * is only 1 task on the busy runqueue (because we don't call | ||
2011 | * move_tasks). | ||
2012 | */ | ||
2013 | if (sd->balance_interval < sd->max_interval) | ||
2014 | sd->balance_interval *= 2; | ||
1999 | } | 2015 | } |
2000 | 2016 | ||
2001 | return nr_moved; | 2017 | return nr_moved; |
@@ -2047,7 +2063,7 @@ static int load_balance_newidle(int this_cpu, runqueue_t *this_rq, | |||
2047 | 2063 | ||
2048 | schedstat_add(sd, lb_imbalance[NEWLY_IDLE], imbalance); | 2064 | schedstat_add(sd, lb_imbalance[NEWLY_IDLE], imbalance); |
2049 | nr_moved = move_tasks(this_rq, this_cpu, busiest, | 2065 | nr_moved = move_tasks(this_rq, this_cpu, busiest, |
2050 | imbalance, sd, NEWLY_IDLE); | 2066 | imbalance, sd, NEWLY_IDLE, NULL); |
2051 | if (!nr_moved) | 2067 | if (!nr_moved) |
2052 | schedstat_inc(sd, lb_failed[NEWLY_IDLE]); | 2068 | schedstat_inc(sd, lb_failed[NEWLY_IDLE]); |
2053 | 2069 | ||
@@ -2126,7 +2142,7 @@ static void active_load_balance(runqueue_t *busiest_rq, int busiest_cpu) | |||
2126 | /* move a task from busiest_rq to target_rq */ | 2142 | /* move a task from busiest_rq to target_rq */ |
2127 | double_lock_balance(busiest_rq, target_rq); | 2143 | double_lock_balance(busiest_rq, target_rq); |
2128 | if (move_tasks(target_rq, cpu, busiest_rq, | 2144 | if (move_tasks(target_rq, cpu, busiest_rq, |
2129 | 1, sd, SCHED_IDLE)) { | 2145 | 1, sd, SCHED_IDLE, NULL)) { |
2130 | schedstat_inc(sd, alb_pushed); | 2146 | schedstat_inc(sd, alb_pushed); |
2131 | } else { | 2147 | } else { |
2132 | schedstat_inc(sd, alb_failed); | 2148 | schedstat_inc(sd, alb_failed); |