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:
parent
97ac16baab
commit
2ba0b7497c
@ -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). */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user