From 2ba0b7497ce748c49dd69ad8fab4bfa492dc779d Mon Sep 17 00:00:00 2001 From: Daniel Henrique Barboza Date: Mon, 24 Aug 2020 10:27:53 -0300 Subject: [PATCH] virhostcpu.c: skip non x86 hosts in virHostCPUGetMicrocodeVersion() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Non-x86 archs does not have a 'microcode' version like x86. This is covered already inside the function - just return 0 if no microcode is found. Regardless of that, a read of /proc/cpuinfo is always made. Each read will invoke the kernel to fill in the CPU details every time. Now let's consider a non-x86 host, like a Power 9 server with 128 CPUs. Each /proc/cpuinfo read will need to fetch data for each CPU and it won't even matter because we know beforehand that PowerPC chips don't have microcode information. We can do better for non-x86 hosts by skipping this process entirely. Signed-off-by: Daniel Henrique Barboza Signed-off-by: Ján Tomko Reviewed-by: Ján Tomko --- src/cpu/cpu_x86.c | 2 +- src/qemu/qemu_capabilities.c | 4 ++-- src/util/virhostcpu.c | 7 +++++-- src/util/virhostcpu.h | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 0a53e6968a..fdb665b01d 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -2759,7 +2759,7 @@ virCPUx86GetHost(virCPUDefPtr cpu, } ret = x86DecodeCPUData(cpu, cpuData, models); - cpu->microcodeVersion = virHostCPUGetMicrocodeVersion(); + cpu->microcodeVersion = virHostCPUGetMicrocodeVersion(cpuData->arch); /* Probing for TSC frequency makes sense only if the CPU supports * invariant TSC (Linux calls this constant_tsc in /proc/cpuinfo). */ diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index f47dcc36ed..dcfd7cdd4e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -5502,7 +5502,7 @@ virQEMUCapsNewData(const char *binary, priv->runUid, priv->runGid, priv->hostCPUSignature, - virHostCPUGetMicrocodeVersion(), + virHostCPUGetMicrocodeVersion(priv->hostArch), priv->kernelVersion); } @@ -5636,7 +5636,7 @@ virQEMUCapsCacheLookup(virFileCachePtr cache, virQEMUCapsCachePrivPtr priv = virFileCacheGetPriv(cache); virQEMUCapsPtr ret = NULL; - priv->microcodeVersion = virHostCPUGetMicrocodeVersion(); + priv->microcodeVersion = virHostCPUGetMicrocodeVersion(priv->hostArch); ret = virFileCacheLookup(cache, binary); diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index d7aa39c131..ebb91ebb54 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -1239,12 +1239,15 @@ virHostCPUGetKVMMaxVCPUs(void) * some reason. */ unsigned int -virHostCPUGetMicrocodeVersion(void) +virHostCPUGetMicrocodeVersion(virArch hostArch) { g_autofree char *outbuf = NULL; char *cur; unsigned int version = 0; + if (!ARCH_IS_X86(hostArch)) + return 0; + if (virFileReadHeaderQuiet(CPUINFO_PATH, 4096, &outbuf) < 0) { VIR_DEBUG("Failed to read microcode version from %s: %s", CPUINFO_PATH, g_strerror(errno)); @@ -1268,7 +1271,7 @@ virHostCPUGetMicrocodeVersion(void) #else unsigned int -virHostCPUGetMicrocodeVersion(void) +virHostCPUGetMicrocodeVersion(virArch hostArch G_GNUC_UNUSED) { return 0; } diff --git a/src/util/virhostcpu.h b/src/util/virhostcpu.h index d07503857e..11cbcd72a3 100644 --- a/src/util/virhostcpu.h +++ b/src/util/virhostcpu.h @@ -75,7 +75,7 @@ virBitmapPtr virHostCPUGetSiblingsList(unsigned int cpu); int virHostCPUGetOnline(unsigned int cpu, bool *online); -unsigned int virHostCPUGetMicrocodeVersion(void); +unsigned int virHostCPUGetMicrocodeVersion(virArch hostArch); int virHostCPUGetMSR(unsigned long index, uint64_t *msr);