svn commit: r347612 - stable/12/sys/dev/cpuctl
Konstantin Belousov
kib at FreeBSD.org
Wed May 15 08:15:45 UTC 2019
Author: kib
Date: Wed May 15 08:15:44 2019
New Revision: 347612
URL: https://svnweb.freebsd.org/changeset/base/347612
Log:
MFC r347368:
x86: Put other CPUs into tight loop when updating Intel microcode from
loaded OS.
Modified:
stable/12/sys/dev/cpuctl/cpuctl.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/dev/cpuctl/cpuctl.c
==============================================================================
--- stable/12/sys/dev/cpuctl/cpuctl.c Wed May 15 07:51:35 2019 (r347611)
+++ stable/12/sys/dev/cpuctl/cpuctl.c Wed May 15 08:15:44 2019 (r347612)
@@ -330,9 +330,26 @@ cpuctl_do_update(int cpu, cpuctl_update_args_t *data,
return (ret);
}
+struct ucode_update_data {
+ void *ptr;
+ int cpu;
+ int ret;
+};
+
+static void
+ucode_intel_load_rv(void *arg)
+{
+ struct ucode_update_data *d;
+
+ d = arg;
+ if (PCPU_GET(cpuid) == d->cpu)
+ d->ret = ucode_intel_load(d->ptr, true, NULL, NULL);
+}
+
static int
update_intel(int cpu, cpuctl_update_args_t *args, struct thread *td)
{
+ struct ucode_update_data d;
void *ptr;
int is_bound, oldcpu, ret;
@@ -360,12 +377,11 @@ update_intel(int cpu, cpuctl_update_args_t *args, stru
oldcpu = td->td_oncpu;
is_bound = cpu_sched_is_bound(td);
set_cpu(cpu, td);
- critical_enter();
-
- ret = ucode_intel_load(ptr, true, NULL, NULL);
-
- critical_exit();
+ d.ptr = ptr;
+ d.cpu = cpu;
+ smp_rendezvous(NULL, ucode_intel_load_rv, NULL, &d);
restore_cpu(oldcpu, is_bound, td);
+ ret = d.ret;
/*
* Replace any existing update. This ensures that the new update
More information about the svn-src-all
mailing list