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))