aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched
diff options
context:
space:
mode:
authorSrikar Dronamraju <srikar@linux.vnet.ibm.com>2016-04-06 09:17:40 -0400
committerIngo Molnar <mingo@kernel.org>2016-04-23 08:20:35 -0400
commit1f621e028baf391f6684003e32e009bc934b750f (patch)
tree1ec42b8eef04039f46e808ff957a4eca6ff383a0 /kernel/sched
parent84eaae155a16d7864f0f814934e5062885cb0709 (diff)
sched/fair: Fix asym packing to select correct CPU
When asymmetric packing is set in the sched_domain and target CPU is busy, update_sd_pick_busiest() may not select the busiest runqueue. When target CPU is busy, find_busiest_group() will ignore checks for asym packing and may continue to load balance using the currently selected not-the-busiest runqueue as source runqueue. Selecting the busiest runqueue as source when the target CPU is busy, should result in achieving much better load balance. Also when target CPU is not busy and asymmetric packing is set in sd, select higher CPU as source CPU for load balancing. While doing this change, move the check to see if target CPU is busy into check_asym_packing(). The extent of performance benefit from this change decreases with the increasing load. However there is benefit in undercommit as well as overcommit conditions. 1. Record per second ebizzy (32 threads) on a 64 CPU power 7 box. (5 iterations) 4.6.0-rc2 Testcase: Min Max Avg StdDev ebizzy: 5223767.00 10368236.00 7946971.00 1753094.76 4.6.0-rc2+asym-changes Testcase: Min Max Avg StdDev %Change ebizzy: 8617191.00 13872356.00 11383980.00 1783400.89 +24.78% 2. Record per second ebizzy (64 threads) on a 64 CPU power 7 box. (5 iterations) 4.6.0-rc2 Testcase: Min Max Avg StdDev ebizzy: 6497666.00 18399783.00 10818093.20 4051452.08 4.6.0-rc2+asym-changes Testcase: Min Max Avg StdDev %Change ebizzy: 7567365.00 19456937.00 11674063.60 4295407.48 +4.40% 3. Record per second ebizzy (128 threads) on a 64 CPU power 7 box. (5 iterations) 4.6.0-rc2 Testcase: Min Max Avg StdDev ebizzy: 37073983.00 40341911.00 38776241.80 1259766.82 4.6.0-rc2+asym-changes Testcase: Min Max Avg StdDev %Change ebizzy: 38030399.00 41333378.00 39827404.40 1255001.86 +2.54% Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Gautham R Shenoy <ego@linux.vnet.ibm.com> Cc: Michael Neuling <mikey@neuling.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/1459948660-16073-1-git-send-email-srikar@linux.vnet.ibm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/sched')
-rw-r--r--kernel/sched/fair.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index b8cc1c35cd7c..6e371f43fc80 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6679,6 +6679,9 @@ static bool update_sd_pick_busiest(struct lb_env *env,
6679 if (!(env->sd->flags & SD_ASYM_PACKING)) 6679 if (!(env->sd->flags & SD_ASYM_PACKING))
6680 return true; 6680 return true;
6681 6681
6682 /* No ASYM_PACKING if target cpu is already busy */
6683 if (env->idle == CPU_NOT_IDLE)
6684 return true;
6682 /* 6685 /*
6683 * ASYM_PACKING needs to move all the work to the lowest 6686 * ASYM_PACKING needs to move all the work to the lowest
6684 * numbered CPUs in the group, therefore mark all groups 6687 * numbered CPUs in the group, therefore mark all groups
@@ -6688,7 +6691,8 @@ static bool update_sd_pick_busiest(struct lb_env *env,
6688 if (!sds->busiest) 6691 if (!sds->busiest)
6689 return true; 6692 return true;
6690 6693
6691 if (group_first_cpu(sds->busiest) > group_first_cpu(sg)) 6694 /* Prefer to move from highest possible cpu's work */
6695 if (group_first_cpu(sds->busiest) < group_first_cpu(sg))
6692 return true; 6696 return true;
6693 } 6697 }
6694 6698
@@ -6834,6 +6838,9 @@ static int check_asym_packing(struct lb_env *env, struct sd_lb_stats *sds)
6834 if (!(env->sd->flags & SD_ASYM_PACKING)) 6838 if (!(env->sd->flags & SD_ASYM_PACKING))
6835 return 0; 6839 return 0;
6836 6840
6841 if (env->idle == CPU_NOT_IDLE)
6842 return 0;
6843
6837 if (!sds->busiest) 6844 if (!sds->busiest)
6838 return 0; 6845 return 0;
6839 6846
@@ -7026,8 +7033,7 @@ static struct sched_group *find_busiest_group(struct lb_env *env)
7026 busiest = &sds.busiest_stat; 7033 busiest = &sds.busiest_stat;
7027 7034
7028 /* ASYM feature bypasses nice load balance check */ 7035 /* ASYM feature bypasses nice load balance check */
7029 if ((env->idle == CPU_IDLE || env->idle == CPU_NEWLY_IDLE) && 7036 if (check_asym_packing(env, &sds))
7030 check_asym_packing(env, &sds))
7031 return sds.busiest; 7037 return sds.busiest;
7032 7038
7033 /* There is no busy sibling group to pull tasks from */ 7039 /* There is no busy sibling group to pull tasks from */