Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 125381
b: refs/heads/master
c: ad273b3
h: refs/heads/master
i:
  125379: b4d88b3
v: v3
  • Loading branch information
Vaidyanathan Srinivasan authored and Ingo Molnar committed Dec 19, 2008
1 parent 9d83640 commit ad9f8a4
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7eb52dfa70dbf5232b5b83ec4357e6bebaa8fde8
refs/heads/master: ad273b32e482cdef306eac32b28d97f513a022f4
54 changes: 54 additions & 0 deletions trunk/kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -3670,10 +3670,64 @@ load_balance_newidle(int this_cpu, struct rq *this_rq, struct sched_domain *sd,
}

if (!ld_moved) {
int active_balance;

schedstat_inc(sd, lb_failed[CPU_NEWLY_IDLE]);
if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER &&
!test_sd_parent(sd, SD_POWERSAVINGS_BALANCE))
return -1;

if (sched_mc_power_savings < POWERSAVINGS_BALANCE_WAKEUP)
return -1;

if (sd->nr_balance_failed++ < 2)
return -1;

/*
* The only task running in a non-idle cpu can be moved to this
* cpu in an attempt to completely freeup the other CPU
* package. The same method used to move task in load_balance()
* have been extended for load_balance_newidle() to speedup
* consolidation at sched_mc=POWERSAVINGS_BALANCE_WAKEUP (2)
*
* The package power saving logic comes from
* find_busiest_group(). If there are no imbalance, then
* f_b_g() will return NULL. However when sched_mc={1,2} then
* f_b_g() will select a group from which a running task may be
* pulled to this cpu in order to make the other package idle.
* If there is no opportunity to make a package idle and if
* there are no imbalance, then f_b_g() will return NULL and no
* action will be taken in load_balance_newidle().
*
* Under normal task pull operation due to imbalance, there
* will be more than one task in the source run queue and
* move_tasks() will succeed. ld_moved will be true and this
* active balance code will not be triggered.
*/

/* Lock busiest in correct order while this_rq is held */
double_lock_balance(this_rq, busiest);

/*
* don't kick the migration_thread, if the curr
* task on busiest cpu can't be moved to this_cpu
*/
if (!cpu_isset(this_cpu, busiest->curr->cpus_allowed)) {
double_unlock_balance(this_rq, busiest);
all_pinned = 1;
return ld_moved;
}

if (!busiest->active_balance) {
busiest->active_balance = 1;
busiest->push_cpu = this_cpu;
active_balance = 1;
}

double_unlock_balance(this_rq, busiest);
if (active_balance)
wake_up_process(busiest->migration_thread);

} else
sd->nr_balance_failed = 0;

Expand Down

0 comments on commit ad9f8a4

Please sign in to comment.