Commit c12a29ed authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sched-urgent-2021-05-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull scheduler fixes from Ingo Molnar:
 "Fix an idle CPU selection bug, and an AMD Ryzen maximum frequency
  enumeration bug"

* tag 'sched-urgent-2021-05-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86, sched: Fix the AMD CPPC maximum performance value on certain AMD Ryzen generations
  sched/fair: Fix clearing of has_idle_cores flag in select_idle_cpu()
parents e7c425b7 3743d55b
...@@ -787,8 +787,10 @@ DECLARE_PER_CPU(u64, msr_misc_features_shadow); ...@@ -787,8 +787,10 @@ DECLARE_PER_CPU(u64, msr_misc_features_shadow);
#ifdef CONFIG_CPU_SUP_AMD #ifdef CONFIG_CPU_SUP_AMD
extern u32 amd_get_nodes_per_socket(void); extern u32 amd_get_nodes_per_socket(void);
extern u32 amd_get_highest_perf(void);
#else #else
static inline u32 amd_get_nodes_per_socket(void) { return 0; } static inline u32 amd_get_nodes_per_socket(void) { return 0; }
static inline u32 amd_get_highest_perf(void) { return 0; }
#endif #endif
static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves) static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves)
......
...@@ -1165,3 +1165,19 @@ void set_dr_addr_mask(unsigned long mask, int dr) ...@@ -1165,3 +1165,19 @@ void set_dr_addr_mask(unsigned long mask, int dr)
break; break;
} }
} }
u32 amd_get_highest_perf(void)
{
struct cpuinfo_x86 *c = &boot_cpu_data;
if (c->x86 == 0x17 && ((c->x86_model >= 0x30 && c->x86_model < 0x40) ||
(c->x86_model >= 0x70 && c->x86_model < 0x80)))
return 166;
if (c->x86 == 0x19 && ((c->x86_model >= 0x20 && c->x86_model < 0x30) ||
(c->x86_model >= 0x40 && c->x86_model < 0x70)))
return 166;
return 255;
}
EXPORT_SYMBOL_GPL(amd_get_highest_perf);
...@@ -2043,7 +2043,7 @@ static bool amd_set_max_freq_ratio(void) ...@@ -2043,7 +2043,7 @@ static bool amd_set_max_freq_ratio(void)
return false; return false;
} }
highest_perf = perf_caps.highest_perf; highest_perf = amd_get_highest_perf();
nominal_perf = perf_caps.nominal_perf; nominal_perf = perf_caps.nominal_perf;
if (!highest_perf || !nominal_perf) { if (!highest_perf || !nominal_perf) {
......
...@@ -646,7 +646,11 @@ static u64 get_max_boost_ratio(unsigned int cpu) ...@@ -646,7 +646,11 @@ static u64 get_max_boost_ratio(unsigned int cpu)
return 0; return 0;
} }
highest_perf = perf_caps.highest_perf; if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
highest_perf = amd_get_highest_perf();
else
highest_perf = perf_caps.highest_perf;
nominal_perf = perf_caps.nominal_perf; nominal_perf = perf_caps.nominal_perf;
if (!highest_perf || !nominal_perf) { if (!highest_perf || !nominal_perf) {
......
...@@ -6217,7 +6217,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, bool ...@@ -6217,7 +6217,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, bool
} }
if (has_idle_core) if (has_idle_core)
set_idle_cores(this, false); set_idle_cores(target, false);
if (sched_feat(SIS_PROP) && !has_idle_core) { if (sched_feat(SIS_PROP) && !has_idle_core) {
time = cpu_clock(this) - time; time = cpu_clock(this) - time;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment