Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:ALP:Source:Standard:0.1
xen
63fe06e0-x86-ucode-AMD-apply-late-on-all-thread...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 63fe06e0-x86-ucode-AMD-apply-late-on-all-threads.patch of Package xen
# Commit f1315e48a03a42f78f9b03c0a384165baf02acae # Date 2023-02-28 14:51:28 +0100 # Author Sergey Dyasli <sergey.dyasli@citrix.com> # Committer Jan Beulich <jbeulich@suse.com> x86/ucode/AMD: late load the patch on every logical thread Currently late ucode loading is performed only on the first core of CPU siblings. But according to the latest recommendation from AMD, late ucode loading should happen on every logical thread/core on AMD CPUs. To achieve that, introduce is_cpu_primary() helper which will consider every logical cpu as "primary" when running on AMD CPUs. Also include Hygon in the check for future-proofing. Signed-off-by: Sergey Dyasli <sergey.dyasli@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/cpu/microcode/core.c +++ b/xen/arch/x86/cpu/microcode/core.c @@ -274,6 +274,20 @@ static bool microcode_update_cache(struc return true; } +/* Returns true if ucode should be loaded on a given cpu */ +static bool is_cpu_primary(unsigned int cpu) +{ + if ( boot_cpu_data.x86_vendor & (X86_VENDOR_AMD | X86_VENDOR_HYGON) ) + /* Load ucode on every logical thread/core */ + return true; + + /* Intel CPUs should load ucode only on the first core of SMT siblings */ + if ( cpu == cpumask_first(per_cpu(cpu_sibling_mask, cpu)) ) + return true; + + return false; +} + /* Wait for a condition to be met with a timeout (us). */ static int wait_for_condition(bool (*func)(unsigned int data), unsigned int data, unsigned int timeout) @@ -380,7 +394,7 @@ static int primary_thread_work(const str static int cf_check microcode_nmi_callback( const struct cpu_user_regs *regs, int cpu) { - unsigned int primary = cpumask_first(this_cpu(cpu_sibling_mask)); + bool primary_cpu = is_cpu_primary(cpu); int ret; /* System-generated NMI, leave to main handler */ @@ -393,10 +407,10 @@ static int cf_check microcode_nmi_callba * ucode_in_nmi. */ if ( cpu == cpumask_first(&cpu_online_map) || - (!ucode_in_nmi && cpu == primary) ) + (!ucode_in_nmi && primary_cpu) ) return 0; - if ( cpu == primary ) + if ( primary_cpu ) ret = primary_thread_work(nmi_patch); else ret = secondary_nmi_work(); @@ -547,7 +561,7 @@ static int cf_check do_microcode_update( */ if ( cpu == cpumask_first(&cpu_online_map) ) ret = control_thread_fn(patch); - else if ( cpu == cpumask_first(this_cpu(cpu_sibling_mask)) ) + else if ( is_cpu_primary(cpu) ) ret = primary_thread_fn(patch); else ret = secondary_thread_fn(); @@ -640,7 +654,7 @@ static long cf_check microcode_update_he /* Calculate the number of online CPU core */ nr_cores = 0; for_each_online_cpu(cpu) - if ( cpu == cpumask_first(per_cpu(cpu_sibling_mask, cpu)) ) + if ( is_cpu_primary(cpu) ) nr_cores++; printk(XENLOG_INFO "%u cores are to update their microcode\n", nr_cores);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor