94 lines
4.2 KiB
Diff
94 lines
4.2 KiB
Diff
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
|
|
index f51463f..94d9982 100644
|
|
--- a/nova/virt/libvirt/driver.py
|
|
+++ b/nova/virt/libvirt/driver.py
|
|
@@ -789,12 +789,6 @@ class LibvirtDriver(driver.ComputeDriver):
|
|
cpu = vconfig.LibvirtConfigGuestCPU()
|
|
for model in models:
|
|
cpu.model = self._get_cpu_model_mapping(model)
|
|
- if not cpu.model:
|
|
- msg = (_("Configured CPU model: %(model)s is not correct, "
|
|
- "or your host CPU arch does not suuport this "
|
|
- "model. Please correct your config and try "
|
|
- "again.") % {'model': model})
|
|
- raise exception.InvalidCPUInfo(msg)
|
|
try:
|
|
self._compare_cpu(cpu, self._get_cpu_info(), None)
|
|
except exception.InvalidCPUInfo as e:
|
|
@@ -4323,11 +4317,27 @@ class LibvirtDriver(driver.ComputeDriver):
|
|
:return: Case-sensitive CPU model name, or None(Only when configured
|
|
CPU model name not correct)
|
|
"""
|
|
+ cpu_info = self._get_cpu_info()
|
|
+ if cpu_info['arch'] not in (fields.Architecture.I686,
|
|
+ fields.Architecture.X86_64,
|
|
+ fields.Architecture.PPC64,
|
|
+ fields.Architecture.PPC64LE,
|
|
+ fields.Architecture.PPC):
|
|
+ return model
|
|
+
|
|
if not self.cpu_models_mapping:
|
|
cpu_models = self._host.get_cpu_model_names()
|
|
for cpu_model in cpu_models:
|
|
self.cpu_models_mapping[cpu_model.lower()] = cpu_model
|
|
- return self.cpu_models_mapping.get(model.lower(), None)
|
|
+
|
|
+ if model.lower() not in self.cpu_models_mapping:
|
|
+ msg = (_("Configured CPU model: %(model)s is not correct, "
|
|
+ "or your host CPU arch does not support this "
|
|
+ "model. Please correct your config and try "
|
|
+ "again.") % {'model': model})
|
|
+ raise exception.InvalidCPUInfo(msg)
|
|
+
|
|
+ return self.cpu_models_mapping.get(model.lower())
|
|
|
|
def _get_guest_cpu_model_config(self, flavor=None):
|
|
mode = CONF.libvirt.cpu_mode
|
|
@@ -4338,8 +4348,8 @@ class LibvirtDriver(driver.ComputeDriver):
|
|
|
|
if (CONF.libvirt.virt_type == "kvm" or
|
|
CONF.libvirt.virt_type == "qemu"):
|
|
+ caps = self._host.get_capabilities()
|
|
if mode is None:
|
|
- caps = self._host.get_capabilities()
|
|
# AArch64 lacks 'host-model' support because neither libvirt
|
|
# nor QEMU are able to tell what the host CPU model exactly is.
|
|
# And there is no CPU description code for ARM(64) at this
|
|
@@ -4358,6 +4368,12 @@ class LibvirtDriver(driver.ComputeDriver):
|
|
mode = "host-model"
|
|
if mode == "none":
|
|
return vconfig.LibvirtConfigGuestCPU()
|
|
+ # On AArch64 platform the return of _get_cpu_model_mapping will not
|
|
+ # return the default CPU model.
|
|
+ if mode == "custom":
|
|
+ if arch == fields.Architecture.AARCH64:
|
|
+ if not models:
|
|
+ models = ['max']
|
|
else:
|
|
if mode is None or mode == "none":
|
|
return None
|
|
@@ -10618,6 +10634,10 @@ class LibvirtDriver(driver.ComputeDriver):
|
|
else:
|
|
models = [self._get_cpu_model_mapping(model)
|
|
for model in CONF.libvirt.cpu_models]
|
|
+ # Aarch64 platform doesn't return the default CPU models
|
|
+ if caps.host.cpu.arch == fields.Architecture.AARCH64:
|
|
+ if not models:
|
|
+ models = ['max']
|
|
# For custom mode, iterate through cpu models
|
|
for model in models:
|
|
caps.host.cpu.model = model
|
|
diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py
|
|
index 0c04833..5809b1c 100644
|
|
--- a/nova/virt/libvirt/utils.py
|
|
+++ b/nova/virt/libvirt/utils.py
|
|
@@ -537,6 +537,8 @@ def get_cpu_model_from_arch(arch):
|
|
mode = 'qemu32'
|
|
elif arch == obj_fields.Architecture.PPC64LE:
|
|
mode = 'POWER8'
|
|
+ elif arch == obj_fields.Architecture.AARCH64:
|
|
+ mode = 'max'
|
|
return mode
|
|
|
|
|