summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui/details.ui14
-rw-r--r--virtManager/details/details.py52
-rw-r--r--virtManager/object/domain.py17
3 files changed, 82 insertions, 1 deletions
diff --git a/ui/details.ui b/ui/details.ui
index fa5a209b..b687ac7f 100644
--- a/ui/details.ui
+++ b/ui/details.ui
@@ -1816,6 +1816,20 @@
<property name="top_attach">2</property>
</packing>
</child>
+ <child>
+ <object class="GtkCheckButton" id="shared-memory">
+ <property name="label" translatable="yes">Shared memory access</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_mem_shared_access_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
</object>
</child>
</object>
diff --git a/virtManager/details/details.py b/virtManager/details/details.py
index aedd2ca7..5c89b411 100644
--- a/virtManager/details/details.py
+++ b/virtManager/details/details.py
@@ -431,6 +431,7 @@ class vmmDetails(vmmGObjectUI):
"on_cpu_topology_enable_toggled": self._cpu_topology_enable_cb,
"on_mem_maxmem_changed": _e(EDIT_MEM),
"on_mem_memory_changed": self._curmem_changed_cb,
+ "on_mem_shared_access_toggled": _e(EDIT_MEM),
"on_boot_list_changed": self._boot_list_changed_cb,
"on_boot_moveup_clicked": self._boot_moveup_clicked_cb,
@@ -1463,6 +1464,35 @@ class vmmDetails(vmmGObjectUI):
hotplug_args["memory"] = kwargs["memory"]
hotplug_args["maxmem"] = kwargs["maxmem"]
+ if self.widget("shared-memory").get_sensitive():
+ guest = self.vm.xmlobj
+ if self.widget("shared-memory").get_active():
+ if guest.cpu.has_private_memAccess_cells():
+ embeded_kwargs = {}
+ embeded_kwargs["memAccess"] = "shared"
+ self._change_config(
+ self.vm.define_cpu, embeded_kwargs)
+ domcaps = self.vm.get_domain_capabilities()
+ embeded_kwargs = {}
+ if domcaps.supports_memorybacking_memfd():
+ embeded_kwargs["source_type"] = "memfd"
+ else:
+ embeded_kwargs["source_type"] = "file"
+ embeded_kwargs["access_mode"] = "shared"
+ self._change_config(
+ self.vm.define_memorybacking, embeded_kwargs)
+ else:
+ if guest.cpu.all_shared_memAccess_cells():
+ embeded_kwargs = {}
+ embeded_kwargs["memAccess"] = None
+ self._change_config(
+ self.vm.define_cpu, embeded_kwargs)
+ embeded_kwargs = {}
+ embeded_kwargs["source_type"] = None
+ embeded_kwargs["access_mode"] = None
+ self._change_config(
+ self.vm.define_memorybacking, embeded_kwargs)
+
return self._change_config(
self.vm.define_memory, kwargs,
hotplug_args=hotplug_args)
@@ -1965,6 +1995,28 @@ class vmmDetails(vmmGObjectUI):
curmem.set_value(int(round(vm_cur_mem)))
maxmem.set_value(int(round(vm_max_mem)))
+ # 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.
+ domcaps = self.vm.get_domain_capabilities()
+ guest = self.vm.xmlobj
+ if not domcaps.supports_filesystem_virtiofs():
+ self.widget("shared-memory").set_active(
+ guest.cpu.all_shared_memAccess_cells())
+ self.widget("shared-memory").set_sensitive(False)
+ self.widget("shared-memory").set_tooltip_text(
+ _("Libvirt may not be new enough to support shared memory"))
+ else:
+ is_shared = (guest.memoryBacking.is_shared_access() or
+ guest.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 guest.cpu.has_private_memAccess_cells():
+ is_shared = False
+ self.widget("shared-memory").set_tooltip_text(
+ _("memory access mode 'private' is found in numa node"))
+ self.widget("shared-memory").set_active(is_shared)
+
def _refresh_disk_page(self, disk):
path = disk.get_source_path()
devtype = disk.device
diff --git a/virtManager/object/domain.py b/virtManager/object/domain.py
index 00c990fd..f2d67e95 100644
--- a/virtManager/object/domain.py
+++ b/virtManager/object/domain.py
@@ -626,7 +626,8 @@ class vmmDomain(vmmLibvirtObject):
def define_cpu(self, vcpus=_SENTINEL,
model=_SENTINEL, secure=_SENTINEL, sockets=_SENTINEL,
- cores=_SENTINEL, threads=_SENTINEL, clear_topology=_SENTINEL):
+ cores=_SENTINEL, threads=_SENTINEL, memAccess=_SENTINEL,
+ clear_topology=_SENTINEL):
guest = self._make_xmlobj_to_define()
if vcpus != _SENTINEL:
@@ -646,6 +647,11 @@ class vmmDomain(vmmLibvirtObject):
guest.cpu.set_special_mode(guest, model)
else:
guest.cpu.set_model(guest, model)
+
+ if memAccess != _SENTINEL:
+ for cell in guest.cpu.cells:
+ cell.memAccess = memAccess
+
self._redefine_xmlobj(guest)
def define_memory(self, memory=_SENTINEL, maxmem=_SENTINEL):
@@ -657,6 +663,15 @@ class vmmDomain(vmmLibvirtObject):
guest.memory = int(maxmem)
self._redefine_xmlobj(guest)
+ def define_memorybacking(self, source_type=_SENTINEL, access_mode=_SENTINEL):
+ guest = self._make_xmlobj_to_define()
+
+ if source_type != _SENTINEL:
+ guest.memoryBacking.source_type = source_type
+ if access_mode != _SENTINEL:
+ guest.memoryBacking.access_mode = access_mode
+ self._redefine_xmlobj(guest)
+
def define_overview(self, machine=_SENTINEL, description=_SENTINEL,
title=_SENTINEL, loader=_SENTINEL,
nvram=_SENTINEL):