diff options
| -rw-r--r-- | include/linux/cpu.h | 2 | ||||
| -rw-r--r-- | kernel/sched.c | 48 | ||||
| -rw-r--r-- | kernel/sched_fair.c | 12 |
3 files changed, 30 insertions, 32 deletions
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index c2236bbff412..1d5ded0836ee 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
| @@ -41,8 +41,6 @@ extern void cpu_remove_sysdev_attr(struct sysdev_attribute *attr); | |||
| 41 | extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs); | 41 | extern int cpu_add_sysdev_attr_group(struct attribute_group *attrs); |
| 42 | extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs); | 42 | extern void cpu_remove_sysdev_attr_group(struct attribute_group *attrs); |
| 43 | 43 | ||
| 44 | extern struct sysdev_attribute attr_sched_mc_power_savings; | ||
| 45 | extern struct sysdev_attribute attr_sched_smt_power_savings; | ||
| 46 | extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); | 44 | extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); |
| 47 | 45 | ||
| 48 | #ifdef CONFIG_HOTPLUG_CPU | 46 | #ifdef CONFIG_HOTPLUG_CPU |
diff --git a/kernel/sched.c b/kernel/sched.c index 6247e4a8350f..45e17b83b7f1 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -3106,7 +3106,7 @@ static void run_rebalance_domains(struct softirq_action *h) | |||
| 3106 | if (need_resched()) | 3106 | if (need_resched()) |
| 3107 | break; | 3107 | break; |
| 3108 | 3108 | ||
| 3109 | rebalance_domains(balance_cpu, SCHED_IDLE); | 3109 | rebalance_domains(balance_cpu, CPU_IDLE); |
| 3110 | 3110 | ||
| 3111 | rq = cpu_rq(balance_cpu); | 3111 | rq = cpu_rq(balance_cpu); |
| 3112 | if (time_after(this_rq->next_balance, rq->next_balance)) | 3112 | if (time_after(this_rq->next_balance, rq->next_balance)) |
| @@ -6328,7 +6328,7 @@ int partition_sched_domains(cpumask_t *partition1, cpumask_t *partition2) | |||
| 6328 | } | 6328 | } |
| 6329 | 6329 | ||
| 6330 | #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) | 6330 | #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) |
| 6331 | int arch_reinit_sched_domains(void) | 6331 | static int arch_reinit_sched_domains(void) |
| 6332 | { | 6332 | { |
| 6333 | int err; | 6333 | int err; |
| 6334 | 6334 | ||
| @@ -6357,24 +6357,6 @@ static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt) | |||
| 6357 | return ret ? ret : count; | 6357 | return ret ? ret : count; |
| 6358 | } | 6358 | } |
| 6359 | 6359 | ||
| 6360 | int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls) | ||
| 6361 | { | ||
| 6362 | int err = 0; | ||
| 6363 | |||
| 6364 | #ifdef CONFIG_SCHED_SMT | ||
| 6365 | if (smt_capable()) | ||
| 6366 | err = sysfs_create_file(&cls->kset.kobj, | ||
| 6367 | &attr_sched_smt_power_savings.attr); | ||
| 6368 | #endif | ||
| 6369 | #ifdef CONFIG_SCHED_MC | ||
| 6370 | if (!err && mc_capable()) | ||
| 6371 | err = sysfs_create_file(&cls->kset.kobj, | ||
| 6372 | &attr_sched_mc_power_savings.attr); | ||
| 6373 | #endif | ||
| 6374 | return err; | ||
| 6375 | } | ||
| 6376 | #endif | ||
| 6377 | |||
| 6378 | #ifdef CONFIG_SCHED_MC | 6360 | #ifdef CONFIG_SCHED_MC |
| 6379 | static ssize_t sched_mc_power_savings_show(struct sys_device *dev, char *page) | 6361 | static ssize_t sched_mc_power_savings_show(struct sys_device *dev, char *page) |
| 6380 | { | 6362 | { |
| @@ -6385,8 +6367,8 @@ static ssize_t sched_mc_power_savings_store(struct sys_device *dev, | |||
| 6385 | { | 6367 | { |
| 6386 | return sched_power_savings_store(buf, count, 0); | 6368 | return sched_power_savings_store(buf, count, 0); |
| 6387 | } | 6369 | } |
| 6388 | SYSDEV_ATTR(sched_mc_power_savings, 0644, sched_mc_power_savings_show, | 6370 | static SYSDEV_ATTR(sched_mc_power_savings, 0644, sched_mc_power_savings_show, |
| 6389 | sched_mc_power_savings_store); | 6371 | sched_mc_power_savings_store); |
| 6390 | #endif | 6372 | #endif |
| 6391 | 6373 | ||
| 6392 | #ifdef CONFIG_SCHED_SMT | 6374 | #ifdef CONFIG_SCHED_SMT |
| @@ -6399,8 +6381,26 @@ static ssize_t sched_smt_power_savings_store(struct sys_device *dev, | |||
| 6399 | { | 6381 | { |
| 6400 | return sched_power_savings_store(buf, count, 1); | 6382 | return sched_power_savings_store(buf, count, 1); |
| 6401 | } | 6383 | } |
| 6402 | SYSDEV_ATTR(sched_smt_power_savings, 0644, sched_smt_power_savings_show, | 6384 | static SYSDEV_ATTR(sched_smt_power_savings, 0644, sched_smt_power_savings_show, |
| 6403 | sched_smt_power_savings_store); | 6385 | sched_smt_power_savings_store); |
| 6386 | #endif | ||
| 6387 | |||
| 6388 | int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls) | ||
| 6389 | { | ||
| 6390 | int err = 0; | ||
| 6391 | |||
| 6392 | #ifdef CONFIG_SCHED_SMT | ||
| 6393 | if (smt_capable()) | ||
| 6394 | err = sysfs_create_file(&cls->kset.kobj, | ||
| 6395 | &attr_sched_smt_power_savings.attr); | ||
| 6396 | #endif | ||
| 6397 | #ifdef CONFIG_SCHED_MC | ||
| 6398 | if (!err && mc_capable()) | ||
| 6399 | err = sysfs_create_file(&cls->kset.kobj, | ||
| 6400 | &attr_sched_mc_power_savings.attr); | ||
| 6401 | #endif | ||
| 6402 | return err; | ||
| 6403 | } | ||
| 6404 | #endif | 6404 | #endif |
| 6405 | 6405 | ||
| 6406 | /* | 6406 | /* |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index c5af38948a1e..fedbb51bba96 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -75,7 +75,7 @@ enum { | |||
| 75 | 75 | ||
| 76 | unsigned int sysctl_sched_features __read_mostly = | 76 | unsigned int sysctl_sched_features __read_mostly = |
| 77 | SCHED_FEAT_FAIR_SLEEPERS *1 | | 77 | SCHED_FEAT_FAIR_SLEEPERS *1 | |
| 78 | SCHED_FEAT_SLEEPER_AVG *1 | | 78 | SCHED_FEAT_SLEEPER_AVG *0 | |
| 79 | SCHED_FEAT_SLEEPER_LOAD_AVG *1 | | 79 | SCHED_FEAT_SLEEPER_LOAD_AVG *1 | |
| 80 | SCHED_FEAT_PRECISE_CPU_LOAD *1 | | 80 | SCHED_FEAT_PRECISE_CPU_LOAD *1 | |
| 81 | SCHED_FEAT_START_DEBIT *1 | | 81 | SCHED_FEAT_START_DEBIT *1 | |
| @@ -304,11 +304,9 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr) | |||
| 304 | delta_mine = calc_delta_mine(delta_exec, curr->load.weight, lw); | 304 | delta_mine = calc_delta_mine(delta_exec, curr->load.weight, lw); |
| 305 | 305 | ||
| 306 | if (cfs_rq->sleeper_bonus > sysctl_sched_granularity) { | 306 | if (cfs_rq->sleeper_bonus > sysctl_sched_granularity) { |
| 307 | delta = calc_delta_mine(cfs_rq->sleeper_bonus, | 307 | delta = min(cfs_rq->sleeper_bonus, (u64)delta_exec); |
| 308 | curr->load.weight, lw); | 308 | delta = calc_delta_mine(delta, curr->load.weight, lw); |
| 309 | if (unlikely(delta > cfs_rq->sleeper_bonus)) | 309 | delta = min((u64)delta, cfs_rq->sleeper_bonus); |
| 310 | delta = cfs_rq->sleeper_bonus; | ||
| 311 | |||
| 312 | cfs_rq->sleeper_bonus -= delta; | 310 | cfs_rq->sleeper_bonus -= delta; |
| 313 | delta_mine -= delta; | 311 | delta_mine -= delta; |
| 314 | } | 312 | } |
| @@ -521,6 +519,8 @@ static void __enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 521 | * Track the amount of bonus we've given to sleepers: | 519 | * Track the amount of bonus we've given to sleepers: |
| 522 | */ | 520 | */ |
| 523 | cfs_rq->sleeper_bonus += delta_fair; | 521 | 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 | 524 | ||
| 525 | schedstat_add(cfs_rq, wait_runtime, se->wait_runtime); | 525 | schedstat_add(cfs_rq, wait_runtime, se->wait_runtime); |
| 526 | } | 526 | } |
