SD_PREFER_SIBLING is currently considered in sd_parent_degenerate() but not in sd_degenerate(). It too hinges on load balancing, and thus won't have any effect when set on a domain with a single group. Add it to SD_DEGENERATE_GROUPS_MASK.
Unified · Split
| @@ -131,8 +131,10 @@ SD_FLAG(SD_ASYM_PACKING, SDF_SHARED_CHILD) · 130 unmodified lines | |||
| 131 | * | 131 | * |
| 132 | * Set up until domains start spanning NUMA nodes. Close to being a SHARED_CHILD | 132 | * Set up until domains start spanning NUMA nodes. Close to being a SHARED_CHILD |
| 133 | * flag, but cleared below domains with SD_ASYM_CPUCAPACITY. | 133 | * flag, but cleared below domains with SD_ASYM_CPUCAPACITY. |
| 134 | * | ||
| 135 | * NEEDS_GROUPS: Load balancing flag. | ||
| 134 | */ | 136 | */ |
| 135 | SD_FLAG(SD_PREFER_SIBLING, 0) | 137 | SD_FLAG(SD_PREFER_SIBLING, SDF_NEEDS_GROUPS) |
| 136 | 138 | ||
| 137 | /* | 139 | /* |
| 138 | * sched_groups of this level overlap | 140 | * sched_groups of this level overlap |
| @@ -184,7 +184,7 @@ sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent) · 183 unmodified lines | |||
| 184 | 184 | ||
| 185 | /* Flags needing groups don't count if only 1 group in parent */ | 185 | /* Flags needing groups don't count if only 1 group in parent */ |
| 186 | if (parent->groups == parent->groups->next) | 186 | if (parent->groups == parent->groups->next) |
| 187 | pflags &= ~(SD_DEGENERATE_GROUPS_MASK | SD_PREFER_SIBLING); | 187 | pflags &= ~SD_DEGENERATE_GROUPS_MASK; |
| 188 | 188 | ||
| 189 | if (~cflags & pflags) | 189 | if (~cflags & pflags) |
| 190 | return 0; | 190 | return 0; |