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