tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

proposed cpuctl modification



This message is about a proposed userland modification, but it seems
more kernelish to me, hence I am asking here on tech-kern, rather than
on tech-userlevel

When my system boots (intel cpu) it runs the intel-microcode (from pkgsrc)
microcode update.

Since it is an Intel cpu, that means running the ioctl to perform the
microcode update on every core.   The cpu has hyperthreading, and while
I sometimes am inclined to turn that off, I haven't so far.

Naturally, as they're really the same core, while the base core ucode
update works fine, the hyperthread companion always fails, as there the
microcode is already up to the expected version (surprise surprise, since
we just did that).    I guess we could look and skip the update on
the hyperthread companion cores (pseudo-cores) but that's not what I am
proposing, partly because I'd have to work out how to do that, but also
because that by itself would only solve half the problem.

My processor also has 8 cores, with no hyperthreading, where it looks as
if internally, there's just 2 sets of ucode, one for the first 4, and one
for the second 4.   Updates of the other 3 of each group find the ucode
version already installed, and error out.

So, what I am proposing is to have cpuctl simply ignore EEXIST errors from
the update the microcode" ioctl. unless the -v option (which already exists)
is given.

Note that this isn't fixing any real problem - everything works as it is now,
and everything (from what I can tell) gets updated correctly.   The issue is
more cosmetic - the ucode update currently issues error messages for more than
half of my (apparent) cores, which looks ugly during the boot process, and
could lead to people wondering if there is a problem.

When I first installed the package from pgksrc to make this happen (a while
ago now) I immediately disabled it (in rc.conf) so it ran no more, as the
microcode version offered by the package was what my CPU came equipped with,
and every core complained about the version not actually being updated.

pkgsrc was updated to a newer version, with newer microcode, I installed
that, and enabled it again - and now I'm stuck with the ugly errors.

Perhaps someone has a better solution than this, perhaps checking which
microcode version is installed on each core, and not attemmpting to install
the update if it is the same version, but that's beyond my knowledge.
It also seems likely to me that it is simpler to just install anyway, and
ignore the "already there" error if it happens.   Probably.

My proposed patch is appended - it builds, installs, and seems to work
just fine (not too much of a surprise, it is a trivial change).

Opinions?

kre

Index: cpuctl.8
===================================================================
RCS file: /cvsroot/src/usr.sbin/cpuctl/cpuctl.8,v
retrieving revision 1.20
diff -u -r1.20 cpuctl.8
--- cpuctl.8	17 May 2019 23:51:35 -0000	1.20
+++ cpuctl.8	2 Mar 2023 21:36:06 -0000
@@ -72,6 +72,10 @@
 .Op Ar file
 .Xc
 This applies the microcode patch to CPUs.
+Unless
+.Fl v
+was given, errors indicating that the microcode
+already exists on the CPU in question are ignored.
 If
 .Ar cpu
 is not specified or \-1, all CPUs are updated.
Index: cpuctl.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/cpuctl/cpuctl.c,v
retrieving revision 1.32
diff -u -r1.32 cpuctl.c
--- cpuctl.c	1 Feb 2022 10:45:02 -0000	1.32
+++ cpuctl.c	2 Mar 2023 21:36:06 -0000
@@ -247,7 +247,7 @@
 		cpuset_destroy(cpuset);
 	}
 	error = ioctl(fd, IOC_CPU_UCODE_APPLY, &uc);
-	if (error < 0) {
+	if (error < 0 && (verbose || errno != EEXIST)) {
 		if (uc.fwname[0])
 			err(EXIT_FAILURE, "%s", uc.fwname);
 		else




Home | Main Index | Thread Index | Old Index