diff --git a/nova/tests/virt/libvirt/test_config.py b/nova/tests/virt/libvirt/test_config.py index 4f28b37358d0..7e2fcd3f8ba4 100644 --- a/nova/tests/virt/libvirt/test_config.py +++ b/nova/tests/virt/libvirt/test_config.py @@ -1136,6 +1136,9 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): obj.cputune.quota = 50000 obj.cputune.period = 25000 + obj.membacking = config.LibvirtConfigGuestMemoryBacking() + obj.membacking.hugepages = True + obj.name = "demo" obj.uuid = "b38a3f43-4be2-4046-897f-b67c2f5e0147" obj.os_type = "linux" @@ -1162,6 +1165,9 @@ class LibvirtConfigGuestTest(LibvirtConfigBaseTest): b38a3f43-4be2-4046-897f-b67c2f5e0147 demo 104857600 + + + 2 @@ -1785,6 +1791,28 @@ class LibvirtConfigGuestCPUTuneTest(LibvirtConfigBaseTest): """) +class LibvirtConfigGuestMemoryBackingTest(LibvirtConfigBaseTest): + def test_config_memory_backing_none(self): + obj = config.LibvirtConfigGuestMemoryBacking() + + xml = obj.to_xml() + self.assertXmlEqual(xml, "") + + def test_config_memory_backing_all(self): + obj = config.LibvirtConfigGuestMemoryBacking() + obj.locked = True + obj.sharedpages = False + obj.hugepages = True + + xml = obj.to_xml() + self.assertXmlEqual(xml, """ + + + + + """) + + class LibvirtConfigGuestMetadataNovaTest(LibvirtConfigBaseTest): def test_config_metadata(self): diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py index 858f98473b99..0255ac116756 100644 --- a/nova/virt/libvirt/config.py +++ b/nova/virt/libvirt/config.py @@ -1307,6 +1307,29 @@ class LibvirtConfigGuestCPUTune(LibvirtConfigObject): return root +class LibvirtConfigGuestMemoryBacking(LibvirtConfigObject): + + def __init__(self, **kwargs): + super(LibvirtConfigGuestMemoryBacking, self).__init__( + root_name="memoryBacking", **kwargs) + + self.hugepages = False + self.sharedpages = True + self.locked = False + + def format_dom(self): + root = super(LibvirtConfigGuestMemoryBacking, self).format_dom() + + if self.hugepages: + root.append(etree.Element("hugepages")) + if not self.sharedpages: + root.append(etree.Element("nosharedpages")) + if self.locked: + root.append(etree.Element("locked")) + + return root + + class LibvirtConfigGuest(LibvirtConfigObject): def __init__(self, **kwargs): @@ -1317,6 +1340,7 @@ class LibvirtConfigGuest(LibvirtConfigObject): self.uuid = None self.name = None self.memory = 500 * units.Mi + self.membacking = None self.vcpus = 1 self.cpuset = None self.cpu = None @@ -1342,6 +1366,8 @@ class LibvirtConfigGuest(LibvirtConfigObject): root.append(self._text_node("uuid", self.uuid)) root.append(self._text_node("name", self.name)) root.append(self._text_node("memory", self.memory)) + if self.membacking is not None: + root.append(self.membacking.format_dom()) if self.cpuset is not None: vcpu = self._text_node("vcpu", self.vcpus) vcpu.set("cpuset", hardware.format_cpu_spec(self.cpuset))