diff options
author | Tim Chen <tim.c.chen@linux.intel.com> | 2016-11-22 15:23:57 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-11-24 14:44:20 -0500 |
commit | d3d37d850d1d77bd66bceb8326e6353d3314b270 (patch) | |
tree | 296db59a8a7f9252156cd898ffdf65033fa128a5 | |
parent | f9793e34952cda133caaa35738a4b46053331c96 (diff) |
x86/sched: Add SD_ASYM_PACKING flags to x86 ITMT CPU
Some Intel cores in a package can be boosted to a higher turbo frequency
with ITMT 3.0 technology. The scheduler can use the asymmetric packing
feature to move tasks to the more capable cores.
If ITMT is enabled, add SD_ASYM_PACKING flag to the thread and core
sched domains to enable asymmetric packing.
Co-developed-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com>
Cc: linux-pm@vger.kernel.org
Cc: peterz@infradead.org
Cc: jolsa@redhat.com
Cc: rjw@rjwysocki.net
Cc: linux-acpi@vger.kernel.org
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Cc: bp@suse.de
Link: http://lkml.kernel.org/r/9bbb885bedbef4eb50e197305eb16b160cff0831.1479844244.git.tim.c.chen@linux.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/smpboot.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index ac61ee71d50e..4f130624c3f4 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -482,22 +482,42 @@ static bool match_die(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) | |||
482 | return false; | 482 | return false; |
483 | } | 483 | } |
484 | 484 | ||
485 | #if defined(CONFIG_SCHED_SMT) || defined(CONFIG_SCHED_MC) | ||
486 | static inline int x86_sched_itmt_flags(void) | ||
487 | { | ||
488 | return sysctl_sched_itmt_enabled ? SD_ASYM_PACKING : 0; | ||
489 | } | ||
490 | |||
491 | #ifdef CONFIG_SCHED_MC | ||
492 | static int x86_core_flags(void) | ||
493 | { | ||
494 | return cpu_core_flags() | x86_sched_itmt_flags(); | ||
495 | } | ||
496 | #endif | ||
497 | #ifdef CONFIG_SCHED_SMT | ||
498 | static int x86_smt_flags(void) | ||
499 | { | ||
500 | return cpu_smt_flags() | x86_sched_itmt_flags(); | ||
501 | } | ||
502 | #endif | ||
503 | #endif | ||
504 | |||
485 | static struct sched_domain_topology_level x86_numa_in_package_topology[] = { | 505 | static struct sched_domain_topology_level x86_numa_in_package_topology[] = { |
486 | #ifdef CONFIG_SCHED_SMT | 506 | #ifdef CONFIG_SCHED_SMT |
487 | { cpu_smt_mask, cpu_smt_flags, SD_INIT_NAME(SMT) }, | 507 | { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) }, |
488 | #endif | 508 | #endif |
489 | #ifdef CONFIG_SCHED_MC | 509 | #ifdef CONFIG_SCHED_MC |
490 | { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) }, | 510 | { cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) }, |
491 | #endif | 511 | #endif |
492 | { NULL, }, | 512 | { NULL, }, |
493 | }; | 513 | }; |
494 | 514 | ||
495 | static struct sched_domain_topology_level x86_topology[] = { | 515 | static struct sched_domain_topology_level x86_topology[] = { |
496 | #ifdef CONFIG_SCHED_SMT | 516 | #ifdef CONFIG_SCHED_SMT |
497 | { cpu_smt_mask, cpu_smt_flags, SD_INIT_NAME(SMT) }, | 517 | { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) }, |
498 | #endif | 518 | #endif |
499 | #ifdef CONFIG_SCHED_MC | 519 | #ifdef CONFIG_SCHED_MC |
500 | { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) }, | 520 | { cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) }, |
501 | #endif | 521 | #endif |
502 | { cpu_cpu_mask, SD_INIT_NAME(DIE) }, | 522 | { cpu_cpu_mask, SD_INIT_NAME(DIE) }, |
503 | { NULL, }, | 523 | { NULL, }, |