1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-22 17:34:18 +03:00

virhostcpu.c: skip non x86 hosts in virHostCPUGetMicrocodeVersion()

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 <danielhb413@gmail.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Daniel Henrique Barboza 2020-08-24 10:27:53 -03:00 committed by Ján Tomko
parent 97ac16baab
commit 2ba0b7497c
4 changed files with 9 additions and 6 deletions

View File

@ -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). */

View File

@ -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);

View File

@ -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;
}

View File

@ -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);