summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtom Lifshitz <alifshit@redhat.com>2022-06-25 11:08:03 -0400
committerArtom Lifshitz <alifshit@redhat.com>2022-08-02 16:47:09 -0400
commit57ab45323cf5617ebd2decd757e708673d949a8f (patch)
treecf5feac97b705e00518d09312de8d1d85bf81d14
parentc53ec4e48884235566962bc934cbf292ad5b67b8 (diff)
downloadnova-57ab45323cf5617ebd2decd757e708673d949a8f.tar.gz
Update libvirt enlightenments for Windows
libvirt has a set of enlightenments in domain XML that make it friendlier for Windows guests. We already enabled a few of these, this patch just completes the list. All of them are available in libvirt 4.7.0 (QEMU 3.0) [1], which is way below our current minimum libvirt and QEMU versions, so we don't need any extra checks. [1] https://libvirt.org/formatdomain.html#hypervisor-features Implements: bp/libvirt-update-windows-englightenments Change-Id: I008841988547573878c4e06e82f0fa55084e51b5
-rw-r--r--nova/tests/unit/virt/libvirt/test_config.py18
-rw-r--r--nova/tests/unit/virt/libvirt/test_driver.py29
-rw-r--r--nova/virt/libvirt/config.py27
-rw-r--r--nova/virt/libvirt/driver.py9
-rw-r--r--releasenotes/notes/update-libvirt-enlightenments-for-windows-23abea98cc1db667.yaml21
5 files changed, 104 insertions, 0 deletions
diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py
index 396edfd024..1fe3b52e2e 100644
--- a/nova/tests/unit/virt/libvirt/test_config.py
+++ b/nova/tests/unit/virt/libvirt/test_config.py
@@ -2318,6 +2318,15 @@ class LibvirtConfigGuestFeatureTest(LibvirtConfigBaseTest):
obj.vapic = True
obj.spinlocks = True
obj.vendorid_spoof = True
+ obj.vpindex = True
+ obj.runtime = True
+ obj.synic = True
+ obj.reset = True
+ obj.frequencies = True
+ obj.reenlightenment = True
+ obj.tlbflush = True
+ obj.ipi = True
+ obj.evmcs = True
xml = obj.to_xml()
self.assertXmlEqual(xml, """
@@ -2326,6 +2335,15 @@ class LibvirtConfigGuestFeatureTest(LibvirtConfigBaseTest):
<vapic state="on"/>
<spinlocks state="on" retries="4095"/>
<vendor_id state="on" value="1234567890ab"/>
+ <vpindex state='on'/>
+ <runtime state='on'/>
+ <synic state='on'/>
+ <reset state='on'/>
+ <frequencies state='on'/>
+ <reenlightenment state='on'/>
+ <tlbflush state='on'/>
+ <ipi state='on'/>
+ <evmcs state='on'/>
</hyperv>""")
def test_feature_pmu(self):
diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py
index 7233c00a72..cac5a5bcbe 100644
--- a/nova/tests/unit/virt/libvirt/test_driver.py
+++ b/nova/tests/unit/virt/libvirt/test_driver.py
@@ -27172,6 +27172,35 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
mock_get_guest.return_value.assert_not_called()
self.assertIsNone(mock_find.call_args.args[3])
+ def test_set_features_windows(self):
+ self.flags(virt_type='kvm', group='libvirt')
+ guest = vconfig.LibvirtConfigGuest()
+ self.drvr._set_features(
+ guest, 'windows',
+ objects.ImageMeta(
+ properties=objects.ImageMetaProps()
+ ),
+ objects.Flavor(extra_specs={})
+ )
+ features = guest.features
+ hv = None
+ for feature in features:
+ if feature.root_name == 'hyperv':
+ hv = feature
+ self.assertTrue(hv.relaxed)
+ self.assertTrue(hv.vapic)
+ self.assertTrue(hv.spinlocks)
+ self.assertEqual(8191, hv.spinlock_retries)
+ self.assertTrue(hv.vpindex)
+ self.assertTrue(hv.runtime)
+ self.assertTrue(hv.synic)
+ self.assertTrue(hv.reset)
+ self.assertTrue(hv.frequencies)
+ self.assertTrue(hv.reenlightenment)
+ self.assertTrue(hv.tlbflush)
+ self.assertTrue(hv.ipi)
+ self.assertTrue(hv.evmcs)
+
class LibvirtVolumeUsageTestCase(test.NoDBTestCase):
"""Test for LibvirtDriver.get_all_volume_usage."""
diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py
index 1a81be3ade..4444d7cd28 100644
--- a/nova/virt/libvirt/config.py
+++ b/nova/virt/libvirt/config.py
@@ -2732,6 +2732,15 @@ class LibvirtConfigGuestFeatureHyperV(LibvirtConfigGuestFeature):
self.vapic = False
self.spinlocks = False
self.spinlock_retries = self.MIN_SPINLOCK_RETRIES
+ self.vpindex = False
+ self.runtime = False
+ self.synic = False
+ self.reset = False
+ self.frequencies = False
+ self.reenlightenment = False
+ self.tlbflush = False
+ self.ipi = False
+ self.evmcs = False
self.vendorid_spoof = False
self.vendorid = self.SPOOFED_VENDOR_ID
@@ -2748,6 +2757,24 @@ class LibvirtConfigGuestFeatureHyperV(LibvirtConfigGuestFeature):
if self.vendorid_spoof:
root.append(etree.Element("vendor_id", state="on",
value=self.vendorid))
+ if self.vpindex:
+ root.append(etree.Element('vpindex', state='on'))
+ if self.runtime:
+ root.append(etree.Element('runtime', state='on'))
+ if self.synic:
+ root.append(etree.Element('synic', state='on'))
+ if self.reset:
+ root.append(etree.Element('reset', state='on'))
+ if self.frequencies:
+ root.append(etree.Element('frequencies', state='on'))
+ if self.reenlightenment:
+ root.append(etree.Element('reenlightenment', state='on'))
+ if self.tlbflush:
+ root.append(etree.Element('tlbflush', state='on'))
+ if self.ipi:
+ root.append(etree.Element('ipi', state='on'))
+ if self.evmcs:
+ root.append(etree.Element('evmcs', state='on'))
return root
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index b35f17fe3a..096433c2ae 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -6080,6 +6080,15 @@ class LibvirtDriver(driver.ComputeDriver):
# with Microsoft
hv.spinlock_retries = 8191
hv.vapic = True
+ hv.vpindex = True
+ hv.runtime = True
+ hv.synic = True
+ hv.reset = True
+ hv.frequencies = True
+ hv.reenlightenment = True
+ hv.tlbflush = True
+ hv.ipi = True
+ hv.evmcs = True
# NOTE(kosamara): Spoofing the vendor_id aims to allow the nvidia
# driver to work on windows VMs. At the moment, the nvidia driver
diff --git a/releasenotes/notes/update-libvirt-enlightenments-for-windows-23abea98cc1db667.yaml b/releasenotes/notes/update-libvirt-enlightenments-for-windows-23abea98cc1db667.yaml
new file mode 100644
index 0000000000..c262be1527
--- /dev/null
+++ b/releasenotes/notes/update-libvirt-enlightenments-for-windows-23abea98cc1db667.yaml
@@ -0,0 +1,21 @@
+---
+features:
+ - |
+ The following enlightenments are now added by default to the libvirt XML for Windows guests:
+
+ * vpindex
+ * runtime
+ * synic
+ * reset
+ * frequencies
+ * reenlightenment
+ * tlbflush
+ * ipi
+ * evmc
+
+ This adds to the list of already existing enlightenments, namely:
+
+ * relaxed
+ * vapic
+ * spinlocks retries
+ * vendor_id spoofing