int flags; /* See SD_FLAG_* */
/* Runtime fields. */
+ unsigned long last_balance; /* init to jiffies. units in jiffies */
unsigned int balance_interval; /* initialise to 1. units in ms. */
unsigned int nr_balance_failed; /* initialise to 0 */
};
.cache_hot_time = 0, \
.cache_nice_tries = 0, \
.flags = SD_FLAG_FASTMIGRATE | SD_FLAG_NEWIDLE | SD_FLAG_WAKE,\
+ .last_balance = jiffies, \
.balance_interval = 1, \
.nr_balance_failed = 0, \
}
.cache_hot_time = (5*1000000/2), \
.cache_nice_tries = 1, \
.flags = SD_FLAG_FASTMIGRATE | SD_FLAG_NEWIDLE,\
+ .last_balance = jiffies, \
.balance_interval = 1, \
.nr_balance_failed = 0, \
}
.cache_hot_time = (10*1000000), \
.cache_nice_tries = 1, \
.flags = SD_FLAG_EXEC, \
+ .last_balance = jiffies, \
.balance_interval = 1, \
.nr_balance_failed = 0, \
}
/* Run through all this CPU's domains */
do {
- int modulo;
+ unsigned long interval;
if (unlikely(!domain->groups))
break;
- modulo = domain->balance_interval;
-
+ interval = domain->balance_interval;
if (idle != IDLE)
- modulo *= domain->busy_factor;
+ interval *= domain->busy_factor;
/* scale ms to jiffies */
- modulo = modulo * HZ / 1000;
- if (modulo == 0)
- modulo = 1;
+ interval = interval * HZ / 1000;
+ if (unlikely(interval == 0))
+ interval = 1;
- if (!(j % modulo)) {
+ if (j - domain->last_balance >= interval) {
if (load_balance(this_cpu, this_rq, domain, idle)) {
/* We've pulled tasks over so no longer idle */
idle = NOT_IDLE;
}
+ domain->last_balance += interval;
}
domain = domain->parent;