diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched.c | 8 | ||||
| -rw-r--r-- | kernel/sched_fair.c | 35 | ||||
| -rw-r--r-- | kernel/sched_rt.c | 11 |
3 files changed, 28 insertions, 26 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 96e9b82246d2..6798328a2e0e 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -2180,12 +2180,6 @@ int can_migrate_task(struct task_struct *p, struct rq *rq, int this_cpu, | |||
| 2180 | if (task_running(rq, p)) | 2180 | if (task_running(rq, p)) |
| 2181 | return 0; | 2181 | return 0; |
| 2182 | 2182 | ||
| 2183 | /* | ||
| 2184 | * Aggressive migration if too many balance attempts have failed: | ||
| 2185 | */ | ||
| 2186 | if (sd->nr_balance_failed > sd->cache_nice_tries) | ||
| 2187 | return 1; | ||
| 2188 | |||
| 2189 | return 1; | 2183 | return 1; |
| 2190 | } | 2184 | } |
| 2191 | 2185 | ||
| @@ -4923,7 +4917,7 @@ static inline void sched_init_granularity(void) | |||
| 4923 | if (sysctl_sched_granularity > gran_limit) | 4917 | if (sysctl_sched_granularity > gran_limit) |
| 4924 | sysctl_sched_granularity = gran_limit; | 4918 | sysctl_sched_granularity = gran_limit; |
| 4925 | 4919 | ||
| 4926 | sysctl_sched_runtime_limit = sysctl_sched_granularity * 8; | 4920 | sysctl_sched_runtime_limit = sysctl_sched_granularity * 5; |
| 4927 | sysctl_sched_wakeup_granularity = sysctl_sched_granularity / 2; | 4921 | sysctl_sched_wakeup_granularity = sysctl_sched_granularity / 2; |
| 4928 | } | 4922 | } |
| 4929 | 4923 | ||
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index fedbb51bba96..4d6b7e2df2aa 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | /* | 20 | /* |
| 21 | * Preemption granularity: | 21 | * Preemption granularity: |
| 22 | * (default: 2 msec, units: nanoseconds) | 22 | * (default: 10 msec, units: nanoseconds) |
| 23 | * | 23 | * |
| 24 | * NOTE: this granularity value is not the same as the concept of | 24 | * NOTE: this granularity value is not the same as the concept of |
| 25 | * 'timeslice length' - timeslices in CFS will typically be somewhat | 25 | * 'timeslice length' - timeslices in CFS will typically be somewhat |
| @@ -31,18 +31,17 @@ | |||
| 31 | * number of CPUs. (i.e. factor 2x on 2-way systems, 3x on 4-way | 31 | * number of CPUs. (i.e. factor 2x on 2-way systems, 3x on 4-way |
| 32 | * systems, 4x on 8-way systems, 5x on 16-way systems, etc.) | 32 | * systems, 4x on 8-way systems, 5x on 16-way systems, etc.) |
| 33 | */ | 33 | */ |
| 34 | unsigned int sysctl_sched_granularity __read_mostly = 2000000000ULL/HZ; | 34 | unsigned int sysctl_sched_granularity __read_mostly = 10000000UL; |
| 35 | 35 | ||
| 36 | /* | 36 | /* |
| 37 | * SCHED_BATCH wake-up granularity. | 37 | * SCHED_BATCH wake-up granularity. |
| 38 | * (default: 10 msec, units: nanoseconds) | 38 | * (default: 25 msec, units: nanoseconds) |
| 39 | * | 39 | * |
| 40 | * This option delays the preemption effects of decoupled workloads | 40 | * This option delays the preemption effects of decoupled workloads |
| 41 | * and reduces their over-scheduling. Synchronous workloads will still | 41 | * and reduces their over-scheduling. Synchronous workloads will still |
| 42 | * have immediate wakeup/sleep latencies. | 42 | * have immediate wakeup/sleep latencies. |
| 43 | */ | 43 | */ |
| 44 | unsigned int sysctl_sched_batch_wakeup_granularity __read_mostly = | 44 | unsigned int sysctl_sched_batch_wakeup_granularity __read_mostly = 25000000UL; |
| 45 | 10000000000ULL/HZ; | ||
| 46 | 45 | ||
| 47 | /* | 46 | /* |
| 48 | * SCHED_OTHER wake-up granularity. | 47 | * SCHED_OTHER wake-up granularity. |
| @@ -52,12 +51,12 @@ unsigned int sysctl_sched_batch_wakeup_granularity __read_mostly = | |||
| 52 | * and reduces their over-scheduling. Synchronous workloads will still | 51 | * and reduces their over-scheduling. Synchronous workloads will still |
| 53 | * have immediate wakeup/sleep latencies. | 52 | * have immediate wakeup/sleep latencies. |
| 54 | */ | 53 | */ |
| 55 | unsigned int sysctl_sched_wakeup_granularity __read_mostly = 1000000000ULL/HZ; | 54 | unsigned int sysctl_sched_wakeup_granularity __read_mostly = 1000000UL; |
| 56 | 55 | ||
| 57 | unsigned int sysctl_sched_stat_granularity __read_mostly; | 56 | unsigned int sysctl_sched_stat_granularity __read_mostly; |
| 58 | 57 | ||
| 59 | /* | 58 | /* |
| 60 | * Initialized in sched_init_granularity(): | 59 | * Initialized in sched_init_granularity() [to 5 times the base granularity]: |
| 61 | */ | 60 | */ |
| 62 | unsigned int sysctl_sched_runtime_limit __read_mostly; | 61 | unsigned int sysctl_sched_runtime_limit __read_mostly; |
| 63 | 62 | ||
| @@ -304,9 +303,9 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr) | |||
| 304 | delta_mine = calc_delta_mine(delta_exec, curr->load.weight, lw); | 303 | delta_mine = calc_delta_mine(delta_exec, curr->load.weight, lw); |
| 305 | 304 | ||
| 306 | if (cfs_rq->sleeper_bonus > sysctl_sched_granularity) { | 305 | if (cfs_rq->sleeper_bonus > sysctl_sched_granularity) { |
| 307 | delta = min(cfs_rq->sleeper_bonus, (u64)delta_exec); | 306 | delta = min((u64)delta_mine, cfs_rq->sleeper_bonus); |
| 308 | delta = calc_delta_mine(delta, curr->load.weight, lw); | 307 | delta = min(delta, (unsigned long)( |
| 309 | delta = min((u64)delta, cfs_rq->sleeper_bonus); | 308 | (long)sysctl_sched_runtime_limit - curr->wait_runtime)); |
| 310 | cfs_rq->sleeper_bonus -= delta; | 309 | cfs_rq->sleeper_bonus -= delta; |
| 311 | delta_mine -= delta; | 310 | delta_mine -= delta; |
| 312 | } | 311 | } |
| @@ -494,6 +493,13 @@ static void __enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 494 | unsigned long load = cfs_rq->load.weight, delta_fair; | 493 | unsigned long load = cfs_rq->load.weight, delta_fair; |
| 495 | long prev_runtime; | 494 | long prev_runtime; |
| 496 | 495 | ||
| 496 | /* | ||
| 497 | * Do not boost sleepers if there's too much bonus 'in flight' | ||
| 498 | * already: | ||
| 499 | */ | ||
| 500 | if (unlikely(cfs_rq->sleeper_bonus > sysctl_sched_runtime_limit)) | ||
| 501 | return; | ||
| 502 | |||
| 497 | if (sysctl_sched_features & SCHED_FEAT_SLEEPER_LOAD_AVG) | 503 | if (sysctl_sched_features & SCHED_FEAT_SLEEPER_LOAD_AVG) |
| 498 | load = rq_of(cfs_rq)->cpu_load[2]; | 504 | load = rq_of(cfs_rq)->cpu_load[2]; |
| 499 | 505 | ||
| @@ -513,16 +519,13 @@ static void __enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 513 | 519 | ||
| 514 | prev_runtime = se->wait_runtime; | 520 | prev_runtime = se->wait_runtime; |
| 515 | __add_wait_runtime(cfs_rq, se, delta_fair); | 521 | __add_wait_runtime(cfs_rq, se, delta_fair); |
| 522 | schedstat_add(cfs_rq, wait_runtime, se->wait_runtime); | ||
| 516 | delta_fair = se->wait_runtime - prev_runtime; | 523 | delta_fair = se->wait_runtime - prev_runtime; |
| 517 | 524 | ||
| 518 | /* | 525 | /* |
| 519 | * Track the amount of bonus we've given to sleepers: | 526 | * Track the amount of bonus we've given to sleepers: |
| 520 | */ | 527 | */ |
| 521 | cfs_rq->sleeper_bonus += delta_fair; | 528 | cfs_rq->sleeper_bonus += delta_fair; |
| 522 | if (unlikely(cfs_rq->sleeper_bonus > sysctl_sched_runtime_limit)) | ||
| 523 | cfs_rq->sleeper_bonus = sysctl_sched_runtime_limit; | ||
| 524 | |||
| 525 | schedstat_add(cfs_rq, wait_runtime, se->wait_runtime); | ||
| 526 | } | 529 | } |
| 527 | 530 | ||
| 528 | static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | 531 | static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) |
| @@ -1044,7 +1047,7 @@ static void task_new_fair(struct rq *rq, struct task_struct *p) | |||
| 1044 | * -granularity/2, so initialize the task with that: | 1047 | * -granularity/2, so initialize the task with that: |
| 1045 | */ | 1048 | */ |
| 1046 | if (sysctl_sched_features & SCHED_FEAT_START_DEBIT) | 1049 | if (sysctl_sched_features & SCHED_FEAT_START_DEBIT) |
| 1047 | p->se.wait_runtime = -(sysctl_sched_granularity / 2); | 1050 | p->se.wait_runtime = -((long)sysctl_sched_granularity / 2); |
| 1048 | 1051 | ||
| 1049 | __enqueue_entity(cfs_rq, se); | 1052 | __enqueue_entity(cfs_rq, se); |
| 1050 | } | 1053 | } |
| @@ -1057,7 +1060,7 @@ static void task_new_fair(struct rq *rq, struct task_struct *p) | |||
| 1057 | */ | 1060 | */ |
| 1058 | static void set_curr_task_fair(struct rq *rq) | 1061 | static void set_curr_task_fair(struct rq *rq) |
| 1059 | { | 1062 | { |
| 1060 | struct sched_entity *se = &rq->curr.se; | 1063 | struct sched_entity *se = &rq->curr->se; |
| 1061 | 1064 | ||
| 1062 | for_each_sched_entity(se) | 1065 | for_each_sched_entity(se) |
| 1063 | set_next_entity(cfs_rq_of(se), se); | 1066 | set_next_entity(cfs_rq_of(se), se); |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index dcdcad632fd9..4b87476a02d0 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -207,10 +207,15 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p) | |||
| 207 | return; | 207 | return; |
| 208 | 208 | ||
| 209 | p->time_slice = static_prio_timeslice(p->static_prio); | 209 | p->time_slice = static_prio_timeslice(p->static_prio); |
| 210 | set_tsk_need_resched(p); | ||
| 211 | 210 | ||
| 212 | /* put it at the end of the queue: */ | 211 | /* |
| 213 | requeue_task_rt(rq, p); | 212 | * Requeue to the end of queue if we are not the only element |
| 213 | * on the queue: | ||
| 214 | */ | ||
| 215 | if (p->run_list.prev != p->run_list.next) { | ||
| 216 | requeue_task_rt(rq, p); | ||
| 217 | set_tsk_need_resched(p); | ||
| 218 | } | ||
| 214 | } | 219 | } |
| 215 | 220 | ||
| 216 | static struct sched_class rt_sched_class __read_mostly = { | 221 | static struct sched_class rt_sched_class __read_mostly = { |
