Blob Blame History Raw
From d7fed0afad5f17449d1a9efb7e7fd35a4941cfaf Mon Sep 17 00:00:00 2001
Message-Id: <d7fed0afad5f17449d1a9efb7e7fd35a4941cfaf@dist-git>
From: Pavel Hrdina <phrdina@redhat.com>
Date: Sun, 2 Sep 2018 11:38:12 -0400
Subject: [PATCH] domain: cpu: Add set_defaults

From: Cole Robinson <crobinso@redhat.com>

(cherry picked from commit 4e7652b5484e8318cf360f0ae197c3e63975e602)

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1525337

Conflicts:
    - get_xml_config is renamed to get_xml in upstream

    - guest._os_object is renamed to guest.osinfo in upstream

Reviewed-by: Cole Robinson <crobinso@redhat.com>
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
 virtinst/cpu.py   | 58 +++++++++++++++++++++++++++++++++++++++++++++++
 virtinst/guest.py | 52 +-----------------------------------------
 2 files changed, 59 insertions(+), 51 deletions(-)

diff --git a/virtinst/cpu.py b/virtinst/cpu.py
index 70ea5647..1b8f4a96 100644
--- a/virtinst/cpu.py
+++ b/virtinst/cpu.py
@@ -17,6 +17,9 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA 02110-1301 USA.
 
+import logging
+
+from .domcapabilities import DomainCapabilities
 from .xmlbuilder import XMLBuilder, XMLProperty, XMLChildProperty
 
 
@@ -228,3 +231,58 @@ class CPU(XMLBuilder):
     sockets = XMLProperty("./topology/@sockets", is_int=True)
     cores = XMLProperty("./topology/@cores", is_int=True)
     threads = XMLProperty("./topology/@threads", is_int=True)
+
+
+    ##################
+    # Default config #
+    ##################
+
+    def _set_cpu_x86_kvm_default(self, guest):
+        if guest.os.arch != self.conn.caps.host.cpu.arch:
+            return
+
+        self.set_special_mode(guest.x86_cpu_default)
+        if guest.x86_cpu_default != self.SPECIAL_MODE_HOST_MODEL_ONLY:
+            return
+        if not self.model:
+            return
+
+        # It's possible that the value HOST_MODEL_ONLY gets from
+        # <capabilities> is not actually supported by qemu/kvm
+        # combo which will be reported in <domainCapabilities>
+        domcaps = DomainCapabilities.build_from_guest(guest)
+        domcaps_mode = domcaps.cpu.get_mode("custom")
+        if not domcaps_mode:
+            return
+
+        cpu_model = domcaps_mode.get_model(self.model)
+        if cpu_model and cpu_model.usable:
+            return
+
+        logging.debug("Host capabilities CPU '%s' is not supported "
+            "according to domain capabilities. Unsetting CPU model",
+            self.model)
+        self.model = None
+
+    def set_defaults(self, guest):
+        self.set_topology_defaults(guest.vcpus)
+
+        if not self.conn.is_test() and not self.conn.is_qemu():
+            return
+        if (self.get_xml_config().strip() or
+            self.special_mode_was_set):
+            # User already configured CPU
+            return
+
+        if guest.os.is_arm_machvirt() and guest.type == "kvm":
+            self.mode = self.SPECIAL_MODE_HOST_PASSTHROUGH
+
+        elif guest.os.is_arm64() and guest.os.is_arm_machvirt():
+            # -M virt defaults to a 32bit CPU, even if using aarch64
+            self.model = "cortex-a57"
+
+        elif guest.os.is_x86() and guest.type == "kvm":
+            self._set_cpu_x86_kvm_default(guest)
+
+            if guest._os_object.broken_x2apic():
+                self.add_feature("x2apic", policy="disable")
diff --git a/virtinst/guest.py b/virtinst/guest.py
index bede9e86..6bf1b59a 100644
--- a/virtinst/guest.py
+++ b/virtinst/guest.py
@@ -785,7 +785,7 @@ class Guest(XMLBuilder):
 
         self._set_clock_defaults()
         self._set_emulator_defaults()
-        self._set_cpu_defaults()
+        self.cpu.set_defaults(self)
         self._set_feature_defaults()
         self._set_pm_defaults()
 
@@ -880,56 +880,6 @@ class Guest(XMLBuilder):
             else:
                 self.emulator = "/usr/lib/xen/bin/qemu-dm"
 
-    def _set_cpu_x86_kvm_default(self):
-        if self.os.arch != self.conn.caps.host.cpu.arch:
-            return
-
-        self.cpu.set_special_mode(self.x86_cpu_default)
-        if self.x86_cpu_default != self.cpu.SPECIAL_MODE_HOST_MODEL_ONLY:
-            return
-        if not self.cpu.model:
-            return
-
-        # It's possible that the value HOST_MODEL_ONLY gets from
-        # <capabilities> is not actually supported by qemu/kvm
-        # combo which will be reported in <domainCapabilities>
-        domcaps = DomainCapabilities.build_from_guest(self)
-        domcaps_mode = domcaps.cpu.get_mode("custom")
-        if not domcaps_mode:
-            return
-
-        cpu_model = domcaps_mode.get_model(self.cpu.model)
-        if cpu_model and cpu_model.usable:
-            return
-
-        logging.debug("Host capabilities CPU '%s' is not supported "
-            "according to domain capabilities. Unsetting CPU model",
-            self.cpu.model)
-        self.cpu.model = None
-
-    def _set_cpu_defaults(self):
-        self.cpu.set_topology_defaults(self.vcpus)
-
-        if not self.conn.is_test() and not self.conn.is_qemu():
-            return
-        if (self.cpu.get_xml_config().strip() or
-            self.cpu.special_mode_was_set):
-            # User already configured CPU
-            return
-
-        if self.os.is_arm_machvirt() and self.type == "kvm":
-            self.cpu.mode = self.cpu.SPECIAL_MODE_HOST_PASSTHROUGH
-
-        elif self.os.is_arm64() and self.os.is_arm_machvirt():
-            # -M virt defaults to a 32bit CPU, even if using aarch64
-            self.cpu.model = "cortex-a57"
-
-        elif self.os.is_x86() and self.type == "kvm":
-            self._set_cpu_x86_kvm_default()
-
-            if self._os_object.broken_x2apic():
-                self.cpu.add_feature("x2apic", policy="disable")
-
     def _hyperv_supported(self):
         if (self.os.loader_type == "pflash" and
             self.os_variant in ("win2k8r2", "win7")):
-- 
2.20.1