On Thu, Aug 11, 2005 at 01:09:10PM +1000, Nick Piggin wrote:
> I have a variation on the 2nd part of your patch which I think
> I would prefer. IMO it kind of generalises the current imbalance
> calculation to handle this case rather than introducing a new
> special case.
There is a difference between our changes.
When the system is lightly loaded, my patch minimizes the number of
groups picking up that load. This will help in power savings for
example in the context of CMP. There are more changes required
(user or kernel) for complete power savings, but this is a direction
towards that.
How about this patch?
--
Don't pull tasks from a group if that would cause the
group's total load to drop below its total cpu_power
(ie. cause the group to start going idle).
Signed-off-by: Suresh Siddha <[email protected]>
Signed-off-by: Nick Piggin <[email protected]>
--- linux-2.6.13-rc5/kernel/sched.c~ 2005-08-09 13:30:19.067072328 -0700
+++ linux-2.6.13-rc5/kernel/sched.c 2005-08-11 09:29:55.937128384 -0700
@@ -1886,6 +1886,7 @@
{
struct sched_group *busiest = NULL, *this = NULL, *group = sd->groups;
unsigned long max_load, avg_load, total_load, this_load, total_pwr;
+ unsigned long excess_load, max_pull;
int load_idx;
max_load = this_load = total_load = total_pwr = 0;
@@ -1932,7 +1933,7 @@
group = group->next;
} while (group != sd->groups);
- if (!busiest || this_load >= max_load)
+ if (!busiest || this_load >= max_load || max_load <= SCHED_LOAD_SCALE)
goto out_balanced;
avg_load = (SCHED_LOAD_SCALE * total_load) / total_pwr;
@@ -1952,9 +1953,19 @@
* by pulling tasks to us. Be careful of negative numbers as they'll
* appear as very large values with unsigned longs.
*/
+
+ /* Don't want to pull so many tasks that a group would go idle */
+ excess_load = min(max_load - avg_load, max_load - SCHED_LOAD_SCALE);
+
+ if (this_load < SCHED_LOAD_SCALE)
+ /* pull as many tasks so that this group is fully utilized */
+ max_pull = max(avg_load - this_load, SCHED_LOAD_SCALE - this_load);
+ else
+ max_pull = avg_load - this_load;
+
/* How much load to actually move to equalise the imbalance */
- *imbalance = min((max_load - avg_load) * busiest->cpu_power,
- (avg_load - this_load) * this->cpu_power)
+ *imbalance = min(excess_load * busiest->cpu_power,
+ max_pull * this->cpu_power)
/ SCHED_LOAD_SCALE;
if (*imbalance < SCHED_LOAD_SCALE) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
|
|