Messages in this thread Patch in this message | | | From | Gautham R Shenoy <> | Subject | [PATCH 3 6/6] sched: Fix sd_parent_degenerate for SD_POWERSAVINGS_BALANCE. | Date | Wed, 18 Mar 2009 14:52:48 +0530 |
| |
Currently a sched_domain having a single group can be prevented from getting degenerated if it contains a SD_POWERSAVINGS_BALANCE flag. But since it has only one group, it won't have any scope for performing powersavings balance as it does not have a sibling group to pull from.
Apart from not provide any powersavings, it also fails to participate in normal load-balancing.
Fix this by allowing such a sched_domain to degenerate and pass on the responsibility of performing the POWERSAVINGS_BALANCE to it's parent domain.
Signed-off-by: Gautham R Shenoy <ego@in.ibm.com> Cc: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> ---
kernel/sched.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/kernel/sched.c b/kernel/sched.c index 651550c..0e7882a 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -6970,6 +6970,20 @@ sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent) SD_SHARE_PKG_RESOURCES); if (nr_node_ids == 1) pflags &= ~SD_SERIALIZE; + + /* + * If the only flag that is preventing us from degenerating + * a domain with a single group is SD_POWERSAVINGS_BALANCE + * check if it can be transferred to the new parent, + * and degenerate this domain. With a single + * group, it anyway can't contribute to power-aware load + * balancing. + */ + if (pflags & SD_POWERSAVINGS_BALANCE && parent->parent) { + pflags &= ~SD_POWERSAVINGS_BALANCE; + parent->parent->flags |= + sd_power_saving_flags(parent->level); + } } if (~cflags & pflags) return 0;
| |