@@ -669,6 +669,7 @@ struct _virQEMUCaps {
669
669
unsigned int kvmVersion ;
670
670
unsigned int libvirtVersion ;
671
671
unsigned int microcodeVersion ;
672
+ char * hostCPUSignature ;
672
673
char * package ;
673
674
char * kernelVersion ;
674
675
@@ -1908,6 +1909,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
1908
1909
ret -> version = qemuCaps -> version ;
1909
1910
ret -> kvmVersion = qemuCaps -> kvmVersion ;
1910
1911
ret -> microcodeVersion = qemuCaps -> microcodeVersion ;
1912
+ ret -> hostCPUSignature = g_strdup (qemuCaps -> hostCPUSignature );
1911
1913
1912
1914
ret -> package = g_strdup (qemuCaps -> package );
1913
1915
ret -> kernelVersion = g_strdup (qemuCaps -> kernelVersion );
@@ -1964,6 +1966,7 @@ void virQEMUCapsDispose(void *obj)
1964
1966
VIR_FREE (qemuCaps -> package );
1965
1967
VIR_FREE (qemuCaps -> kernelVersion );
1966
1968
VIR_FREE (qemuCaps -> binary );
1969
+ VIR_FREE (qemuCaps -> hostCPUSignature );
1967
1970
1968
1971
VIR_FREE (qemuCaps -> gicCapabilities );
1969
1972
@@ -4093,6 +4096,7 @@ struct _virQEMUCapsCachePriv {
4093
4096
virArch hostArch ;
4094
4097
unsigned int microcodeVersion ;
4095
4098
char * kernelVersion ;
4099
+ char * hostCPUSignature ;
4096
4100
4097
4101
/* cache whether /dev/kvm is usable as runUid:runGuid */
4098
4102
virTristateBool kvmUsable ;
@@ -4109,6 +4113,7 @@ virQEMUCapsCachePrivFree(void *privData)
4109
4113
4110
4114
VIR_FREE (priv -> libDir );
4111
4115
VIR_FREE (priv -> kernelVersion );
4116
+ VIR_FREE (priv -> hostCPUSignature );
4112
4117
VIR_FREE (priv );
4113
4118
}
4114
4119
@@ -4286,6 +4291,8 @@ virQEMUCapsLoadCache(virArch hostArch,
4286
4291
goto cleanup ;
4287
4292
}
4288
4293
4294
+ qemuCaps -> hostCPUSignature = virXPathString ("string(./hostCPUSignature)" , ctxt );
4295
+
4289
4296
if (virXPathBoolean ("boolean(./package)" , ctxt ) > 0 ) {
4290
4297
qemuCaps -> package = virXPathString ("string(./package)" , ctxt );
4291
4298
if (!qemuCaps -> package )
@@ -4587,6 +4594,8 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps)
4587
4594
4588
4595
virBufferAsprintf (& buf , "<microcodeVersion>%u</microcodeVersion>\n" ,
4589
4596
qemuCaps -> microcodeVersion );
4597
+ virBufferEscapeString (& buf , "<hostCPUSignature>%s</hostCPUSignature>\n" ,
4598
+ qemuCaps -> hostCPUSignature );
4590
4599
4591
4600
if (qemuCaps -> package )
4592
4601
virBufferAsprintf (& buf , "<package>%s</package>\n" ,
@@ -4814,6 +4823,15 @@ virQEMUCapsIsValid(void *data,
4814
4823
}
4815
4824
4816
4825
if (virQEMUCapsGet (qemuCaps , QEMU_CAPS_KVM )) {
4826
+ if (STRNEQ_NULLABLE (priv -> hostCPUSignature , qemuCaps -> hostCPUSignature )) {
4827
+ VIR_DEBUG ("Outdated capabilities for '%s': host CPU changed "
4828
+ "('%s' vs '%s')" ,
4829
+ qemuCaps -> binary ,
4830
+ priv -> hostCPUSignature ,
4831
+ qemuCaps -> hostCPUSignature );
4832
+ return false;
4833
+ }
4834
+
4817
4835
if (priv -> microcodeVersion != qemuCaps -> microcodeVersion ) {
4818
4836
VIR_DEBUG ("Outdated capabilities for '%s': microcode version "
4819
4837
"changed (%u vs %u)" ,
@@ -5286,6 +5304,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
5286
5304
const char * libDir ,
5287
5305
uid_t runUid ,
5288
5306
gid_t runGid ,
5307
+ const char * hostCPUSignature ,
5289
5308
unsigned int microcodeVersion ,
5290
5309
const char * kernelVersion )
5291
5310
{
@@ -5324,6 +5343,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
5324
5343
virQEMUCapsInitHostCPUModel (qemuCaps , hostArch , VIR_DOMAIN_VIRT_QEMU );
5325
5344
5326
5345
if (virQEMUCapsGet (qemuCaps , QEMU_CAPS_KVM )) {
5346
+ qemuCaps -> hostCPUSignature = g_strdup (hostCPUSignature );
5327
5347
qemuCaps -> microcodeVersion = microcodeVersion ;
5328
5348
5329
5349
qemuCaps -> kernelVersion = g_strdup (kernelVersion );
@@ -5349,6 +5369,7 @@ virQEMUCapsNewData(const char *binary,
5349
5369
priv -> libDir ,
5350
5370
priv -> runUid ,
5351
5371
priv -> runGid ,
5372
+ priv -> hostCPUSignature ,
5352
5373
virHostCPUGetMicrocodeVersion (),
5353
5374
priv -> kernelVersion );
5354
5375
}
@@ -5448,6 +5469,9 @@ virQEMUCapsCacheNew(const char *libDir,
5448
5469
5449
5470
priv -> hostArch = virArchFromHost ();
5450
5471
5472
+ if (virHostCPUGetSignature (& priv -> hostCPUSignature ) < 0 )
5473
+ goto error ;
5474
+
5451
5475
priv -> runUid = runUid ;
5452
5476
priv -> runGid = runGid ;
5453
5477
priv -> kvmUsable = VIR_TRISTATE_BOOL_ABSENT ;
0 commit comments