details: Strip back 'Enable shared memory' to only cover memfd

Strip back the logic to:

* Only try to toggle source_type=memfd and access_mode=shared
* Disable the field if guest has any <numa> config
* Disable the field if domcaps does not report virtiofs and memfd

This is the simplest future proof case, though it will exclude some
legit guest configs and some libvirt+qemu back compat.

My feeling is the <numa> stuff in particular is pretty advanced, so if
users have it configured they can toggle shared memory via the XML
without too much trouble.

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2022-01-25 11:50:05 -05:00
parent 3d915717dd
commit 9c45f4a2e9
3 changed files with 9 additions and 43 deletions

View File

@ -446,23 +446,17 @@ class vmmDomain(vmmLibvirtObject):
Return a value for 'Enable shared memory' UI, and an error if
the value is not editable
"""
is_shared = False
err = None
domcaps = self.get_domain_capabilities()
# If virtiofs support is reported via domcapabilities, It's seen as
# libvirt is new enough to allow setting shared memory access without
# hugepages or numa config.
if not self.get_domain_capabilities().supports_filesystem_virtiofs():
is_shared = self.xmlobj.cpu.all_shared_memAccess_cells()
err = _("Libvirt may not be new enough to support shared memory")
if self.xmlobj.cpu.cells:
err = _("Can not change shared memory setting when <numa> is configured.")
elif (not domcaps.supports_filesystem_virtiofs() or
not domcaps.supports_memorybacking_memfd()):
err = _("Libvirt may not be new enough to support memfd.")
else:
is_shared = (self.xmlobj.memoryBacking.is_shared_access() or
self.xmlobj.cpu.all_shared_memAccess_cells())
# The access mode can be overridden per numa node by memAccess, So
# we need to check whether it has 'private' memAccess in numa node.
if self.xmlobj.cpu.has_private_memAccess_cells():
is_shared = False
err = _("memory access mode 'private' is found in numa node")
is_shared = self.xmlobj.memoryBacking.source_type == "memfd"
return is_shared, err
@ -680,19 +674,11 @@ class vmmDomain(vmmLibvirtObject):
def _edit_shared_mem(self, guest, mem_shared):
source_type = _SENTINEL
access_mode = _SENTINEL
memAccess = _SENTINEL
if mem_shared:
if guest.cpu.has_private_memAccess_cells():
memAccess = "shared"
if self.get_domain_capabilities().supports_memorybacking_memfd():
source_type = "memfd"
else:
source_type = "file"
source_type = "memfd"
access_mode = "shared"
else:
if guest.cpu.all_shared_memAccess_cells():
memAccess = None
source_type = None
access_mode = None
@ -700,9 +686,6 @@ class vmmDomain(vmmLibvirtObject):
guest.memoryBacking.source_type = source_type
if access_mode != _SENTINEL:
guest.memoryBacking.access_mode = access_mode
if memAccess != _SENTINEL:
for cell in guest.cpu.cells:
cell.memAccess = memAccess
def define_memory(self, memory=_SENTINEL, maxmem=_SENTINEL,
mem_shared=_SENTINEL):

View File

@ -412,20 +412,6 @@ class DomainCpu(XMLBuilder):
return
self.topology.set_defaults_from_vcpus(vcpus)
def has_private_memAccess_cells(self):
for cell in self.cells:
if cell.memAccess == "private":
return True
return False
def all_shared_memAccess_cells(self):
if not self.cells:
return False
for cell in self.cells:
if cell.memAccess != "shared":
return False
return True
##################
# Default config #

View File

@ -36,6 +36,3 @@ class DomainMemoryBacking(XMLBuilder):
allocation_mode = XMLProperty("./allocation/@mode")
pages = XMLChildProperty(_HugepagesPage, relative_xpath="./hugepages")
def is_shared_access(self):
return self.access_mode == "shared"