|
|
3d61c0 |
From 5f8393892d60fe1ee982e34c4af229ce148b5996 Mon Sep 17 00:00:00 2001
|
|
|
3d61c0 |
Message-Id: <5f8393892d60fe1ee982e34c4af229ce148b5996@dist-git>
|
|
|
3d61c0 |
From: Pavel Hrdina <phrdina@redhat.com>
|
|
|
3d61c0 |
Date: Wed, 28 Mar 2018 13:45:29 -0600
|
|
|
3d61c0 |
Subject: [PATCH] virtinst: read CPU model from domain capabilities
|
|
|
3d61c0 |
|
|
|
3d61c0 |
From: Charles Arnold <carnold@suse.com>
|
|
|
3d61c0 |
|
|
|
3d61c0 |
Add functionality to acquire the CPU model from the
|
|
|
3d61c0 |
libvirt domain capabilities. This is used to compare
|
|
|
3d61c0 |
with the host CPU model.
|
|
|
3d61c0 |
|
|
|
3d61c0 |
(crobinso: add test coverage, rework domcaps layout a bit)
|
|
|
3d61c0 |
|
|
|
3d61c0 |
(cherry picked from commit d15b78ab0d7b9e73261a19fafc841a4ee206d413)
|
|
|
3d61c0 |
|
|
|
3d61c0 |
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1525337
|
|
|
3d61c0 |
|
|
|
3d61c0 |
Conflicts:
|
|
|
3d61c0 |
- _XML_ROOT_NAME is renamed to XML_NAME in upstream
|
|
|
3d61c0 |
|
|
|
3d61c0 |
- utils.open_testdriver() is changed to
|
|
|
3d61c0 |
utils.URIs.open_testdriver_cached() in upstream
|
|
|
3d61c0 |
|
|
|
3d61c0 |
Reviewed-by: Cole Robinson <crobinso@redhat.com>
|
|
|
3d61c0 |
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
|
|
3d61c0 |
---
|
|
|
3d61c0 |
tests/capabilities-xml/kvm-x86_64-domcaps.xml | 88 +++++++++++++++++--
|
|
|
3d61c0 |
tests/capabilities.py | 10 +++
|
|
|
3d61c0 |
virtinst/domcapabilities.py | 28 ++++++
|
|
|
3d61c0 |
3 files changed, 121 insertions(+), 5 deletions(-)
|
|
|
3d61c0 |
|
|
|
3d61c0 |
diff --git a/tests/capabilities-xml/kvm-x86_64-domcaps.xml b/tests/capabilities-xml/kvm-x86_64-domcaps.xml
|
|
|
3d61c0 |
index cf15c195..d2a3d11f 100644
|
|
|
3d61c0 |
--- a/tests/capabilities-xml/kvm-x86_64-domcaps.xml
|
|
|
3d61c0 |
+++ b/tests/capabilities-xml/kvm-x86_64-domcaps.xml
|
|
|
3d61c0 |
@@ -18,6 +18,68 @@
|
|
|
3d61c0 |
</enum>
|
|
|
3d61c0 |
</loader>
|
|
|
3d61c0 |
</os>
|
|
|
3d61c0 |
+ <cpu>
|
|
|
3d61c0 |
+ <mode name='host-passthrough' supported='yes'/>
|
|
|
3d61c0 |
+ <mode name='host-model' supported='yes'>
|
|
|
3d61c0 |
+ <model fallback='forbid'>Broadwell</model>
|
|
|
3d61c0 |
+ <vendor>Intel</vendor>
|
|
|
3d61c0 |
+ <feature policy='require' name='vme'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='ss'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='f16c'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='rdrand'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='hypervisor'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='arat'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='tsc_adjust'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='xsaveopt'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='pdpe1gb'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='abm'/>
|
|
|
3d61c0 |
+ <feature policy='require' name='invtsc'/>
|
|
|
3d61c0 |
+ </mode>
|
|
|
3d61c0 |
+ <mode name='custom' supported='yes'>
|
|
|
3d61c0 |
+ <model usable='yes'>qemu64</model>
|
|
|
3d61c0 |
+ <model usable='yes'>qemu32</model>
|
|
|
3d61c0 |
+ <model usable='no'>phenom</model>
|
|
|
3d61c0 |
+ <model usable='yes'>pentium3</model>
|
|
|
3d61c0 |
+ <model usable='yes'>pentium2</model>
|
|
|
3d61c0 |
+ <model usable='yes'>pentium</model>
|
|
|
3d61c0 |
+ <model usable='yes'>n270</model>
|
|
|
3d61c0 |
+ <model usable='yes'>kvm64</model>
|
|
|
3d61c0 |
+ <model usable='yes'>kvm32</model>
|
|
|
3d61c0 |
+ <model usable='yes'>coreduo</model>
|
|
|
3d61c0 |
+ <model usable='yes'>core2duo</model>
|
|
|
3d61c0 |
+ <model usable='no'>athlon</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Westmere</model>
|
|
|
3d61c0 |
+ <model usable='no'>Westmere-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='no'>Skylake-Server</model>
|
|
|
3d61c0 |
+ <model usable='no'>Skylake-Server-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='no'>Skylake-Client</model>
|
|
|
3d61c0 |
+ <model usable='no'>Skylake-Client-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='yes'>SandyBridge</model>
|
|
|
3d61c0 |
+ <model usable='no'>SandyBridge-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Penryn</model>
|
|
|
3d61c0 |
+ <model usable='no'>Opteron_G5</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Opteron_G4</model>
|
|
|
3d61c0 |
+ <model usable='no'>Opteron_G3</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Opteron_G2</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Opteron_G1</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Nehalem</model>
|
|
|
3d61c0 |
+ <model usable='no'>Nehalem-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='yes'>IvyBridge</model>
|
|
|
3d61c0 |
+ <model usable='no'>IvyBridge-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Haswell</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Haswell-noTSX</model>
|
|
|
3d61c0 |
+ <model usable='no'>Haswell-noTSX-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='no'>Haswell-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='no'>EPYC</model>
|
|
|
3d61c0 |
+ <model usable='no'>EPYC-IBPB</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Conroe</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Broadwell</model>
|
|
|
3d61c0 |
+ <model usable='yes'>Broadwell-noTSX</model>
|
|
|
3d61c0 |
+ <model usable='no'>Broadwell-noTSX-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='no'>Broadwell-IBRS</model>
|
|
|
3d61c0 |
+ <model usable='yes'>486</model>
|
|
|
3d61c0 |
+ </mode>
|
|
|
3d61c0 |
+ </cpu>
|
|
|
3d61c0 |
<devices>
|
|
|
3d61c0 |
<disk supported='yes'>
|
|
|
3d61c0 |
<enum name='diskDevice'>
|
|
|
3d61c0 |
@@ -32,8 +94,25 @@
|
|
|
3d61c0 |
<value>scsi</value>
|
|
|
3d61c0 |
<value>virtio</value>
|
|
|
3d61c0 |
<value>usb</value>
|
|
|
3d61c0 |
+ <value>sata</value>
|
|
|
3d61c0 |
</enum>
|
|
|
3d61c0 |
</disk>
|
|
|
3d61c0 |
+ <graphics supported='yes'>
|
|
|
3d61c0 |
+ <enum name='type'>
|
|
|
3d61c0 |
+ <value>sdl</value>
|
|
|
3d61c0 |
+ <value>vnc</value>
|
|
|
3d61c0 |
+ <value>spice</value>
|
|
|
3d61c0 |
+ </enum>
|
|
|
3d61c0 |
+ </graphics>
|
|
|
3d61c0 |
+ <video supported='yes'>
|
|
|
3d61c0 |
+ <enum name='modelType'>
|
|
|
3d61c0 |
+ <value>vga</value>
|
|
|
3d61c0 |
+ <value>cirrus</value>
|
|
|
3d61c0 |
+ <value>vmvga</value>
|
|
|
3d61c0 |
+ <value>qxl</value>
|
|
|
3d61c0 |
+ <value>virtio</value>
|
|
|
3d61c0 |
+ </enum>
|
|
|
3d61c0 |
+ </video>
|
|
|
3d61c0 |
<hostdev supported='yes'>
|
|
|
3d61c0 |
<enum name='mode'>
|
|
|
3d61c0 |
<value>subsystem</value>
|
|
|
3d61c0 |
@@ -50,11 +129,10 @@
|
|
|
3d61c0 |
<value>scsi</value>
|
|
|
3d61c0 |
</enum>
|
|
|
3d61c0 |
<enum name='capsType'/>
|
|
|
3d61c0 |
- <enum name='pciBackend'>
|
|
|
3d61c0 |
- <value>default</value>
|
|
|
3d61c0 |
- <value>kvm</value>
|
|
|
3d61c0 |
- <value>vfio</value>
|
|
|
3d61c0 |
- </enum>
|
|
|
3d61c0 |
+ <enum name='pciBackend'/>
|
|
|
3d61c0 |
</hostdev>
|
|
|
3d61c0 |
</devices>
|
|
|
3d61c0 |
+ <features>
|
|
|
3d61c0 |
+ <gic supported='no'/>
|
|
|
3d61c0 |
+ </features>
|
|
|
3d61c0 |
</domainCapabilities>
|
|
|
3d61c0 |
diff --git a/tests/capabilities.py b/tests/capabilities.py
|
|
|
3d61c0 |
index 40f9fd86..ef1d961b 100644
|
|
|
3d61c0 |
--- a/tests/capabilities.py
|
|
|
3d61c0 |
+++ b/tests/capabilities.py
|
|
|
3d61c0 |
@@ -131,6 +131,16 @@ class TestCapabilities(unittest.TestCase):
|
|
|
3d61c0 |
self.assertEqual(caps.os.loader.get_enum("type").get_values(),
|
|
|
3d61c0 |
["rom", "pflash"])
|
|
|
3d61c0 |
|
|
|
3d61c0 |
+ def testDomainCapabilitiesx86(self):
|
|
|
3d61c0 |
+ xml = open("tests/capabilities-xml/kvm-x86_64-domcaps.xml").read()
|
|
|
3d61c0 |
+ caps = DomainCapabilities(utils.open_testdriver(), xml)
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+ custom_mode = caps.cpu.get_mode("custom")
|
|
|
3d61c0 |
+ self.assertTrue(bool(custom_mode))
|
|
|
3d61c0 |
+ cpu_model = custom_mode.get_model("Opteron_G4")
|
|
|
3d61c0 |
+ self.assertTrue(bool(cpu_model))
|
|
|
3d61c0 |
+ self.assertTrue(cpu_model.usable)
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
|
|
|
3d61c0 |
if __name__ == "__main__":
|
|
|
3d61c0 |
unittest.main()
|
|
|
3d61c0 |
diff --git a/virtinst/domcapabilities.py b/virtinst/domcapabilities.py
|
|
|
3d61c0 |
index be2281a6..78ac7a3e 100644
|
|
|
3d61c0 |
--- a/virtinst/domcapabilities.py
|
|
|
3d61c0 |
+++ b/virtinst/domcapabilities.py
|
|
|
3d61c0 |
@@ -76,6 +76,33 @@ class _Features(_CapsBlock):
|
|
|
3d61c0 |
gic = XMLChildProperty(_make_capsblock("gic"), is_single=True)
|
|
|
3d61c0 |
|
|
|
3d61c0 |
|
|
|
3d61c0 |
+class _CPUModel(XMLBuilder):
|
|
|
3d61c0 |
+ _XML_ROOT_NAME = "model"
|
|
|
3d61c0 |
+ model = XMLProperty(".")
|
|
|
3d61c0 |
+ usable = XMLProperty("./@usable", is_yesno=True)
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+class _CPUMode(XMLBuilder):
|
|
|
3d61c0 |
+ _XML_ROOT_NAME = "mode"
|
|
|
3d61c0 |
+ name = XMLProperty("./@name")
|
|
|
3d61c0 |
+ models = XMLChildProperty(_CPUModel)
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+ def get_model(self, name):
|
|
|
3d61c0 |
+ for model in self.models:
|
|
|
3d61c0 |
+ if model.model == name:
|
|
|
3d61c0 |
+ return model
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+class _CPU(XMLBuilder):
|
|
|
3d61c0 |
+ _XML_ROOT_NAME = "cpu"
|
|
|
3d61c0 |
+ modes = XMLChildProperty(_CPUMode)
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+ def get_mode(self, name):
|
|
|
3d61c0 |
+ for mode in self.modes:
|
|
|
3d61c0 |
+ if mode.name == name:
|
|
|
3d61c0 |
+ return mode
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
+
|
|
|
3d61c0 |
class DomainCapabilities(XMLBuilder):
|
|
|
3d61c0 |
@staticmethod
|
|
|
3d61c0 |
def build_from_params(conn, emulator, arch, machine, hvtype):
|
|
|
3d61c0 |
@@ -163,6 +190,7 @@ class DomainCapabilities(XMLBuilder):
|
|
|
3d61c0 |
|
|
|
3d61c0 |
_XML_ROOT_NAME = "domainCapabilities"
|
|
|
3d61c0 |
os = XMLChildProperty(_OS, is_single=True)
|
|
|
3d61c0 |
+ cpu = XMLChildProperty(_CPU, is_single=True)
|
|
|
3d61c0 |
devices = XMLChildProperty(_Devices, is_single=True)
|
|
|
3d61c0 |
|
|
|
3d61c0 |
arch = XMLProperty("./arch")
|
|
|
3d61c0 |
--
|
|
|
3d61c0 |
2.20.1
|
|
|
3d61c0 |
|