From 73411a7ff1e4102960b2c09ed604933b104c53dc Mon Sep 17 00:00:00 2001
From: Jiri Denemark <jdenemar@redhat.com>
Date: Sun, 20 Nov 2016 23:21:19 +0100
Subject: [PATCH] qemu: Avoid reporting "host" as a supported CPU model

"host" CPU model is supported by a special host-passthrough CPU mode and
users is not allowed to specify this model directly with custom mode.
Thus we should not advertise "host" CPU model in domain capabilities.
This worked well on architectures for which libvirt provides a list of
supported CPU models in cpu_map.xml (since "host" is not in the list).
But we need to explicitly filter "host" model out for all other
architectures.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/conf/domain_capabilities.c                              | 6 +++++-
 src/conf/domain_capabilities.h                              | 3 ++-
 src/qemu/qemu_capabilities.c                                | 4 +++-
 .../domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml  | 1 -
 tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml           | 1 -
 5 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
index fb2d696449..bb6742359b 100644
--- a/src/conf/domain_capabilities.c
+++ b/src/conf/domain_capabilities.c
@@ -176,7 +176,8 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old)
 
 virDomainCapsCPUModelsPtr
 virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old,
-                             const char **models)
+                             const char **models,
+                             const char **blacklist)
 {
     virDomainCapsCPUModelsPtr cpuModels;
     size_t i;
@@ -188,6 +189,9 @@ virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old,
         if (models && !virStringListHasString(models, old->models[i].name))
             continue;
 
+        if (blacklist && virStringListHasString(blacklist, old->models[i].name))
+            continue;
+
         if (virDomainCapsCPUModelsAdd(cpuModels,
                                       old->models[i].name, -1,
                                       old->models[i].usable) < 0)
diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
index 13a65e3516..82183c4524 100644
--- a/src/conf/domain_capabilities.h
+++ b/src/conf/domain_capabilities.h
@@ -167,7 +167,8 @@ virDomainCapsPtr virDomainCapsNew(const char *path,
 virDomainCapsCPUModelsPtr virDomainCapsCPUModelsNew(size_t nmodels);
 virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old);
 virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old,
-                                                       const char **models);
+                                                       const char **models,
+                                                       const char **blacklist);
 int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels,
                                    char **name,
                                    virDomainCapsCPUUsable usable);
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 9e3d10f702..3581c2d723 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4955,6 +4955,7 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
                                       VIR_CPU_MODE_CUSTOM)) {
         virDomainCapsCPUModelsPtr filtered = NULL;
         char **models = NULL;
+        const char *blacklist[] = { "host", NULL };
 
         if (virCPUGetModels(domCaps->arch, &models) >= 0) {
             virDomainCapsCPUModelsPtr cpus;
@@ -4965,7 +4966,8 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
                 cpus = qemuCaps->tcgCPUModels;
 
             filtered = virDomainCapsCPUModelsFilter(cpus,
-                                                    (const char **) models);
+                                                    (const char **) models,
+                                                    blacklist);
             virStringListFree(models);
         }
         domCaps->cpu.custom = filtered;
diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
index 0b5a4379a1..76aee83ba1 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
@@ -38,7 +38,6 @@
       <model usable='unknown'>sa1110</model>
       <model usable='unknown'>arm1176</model>
       <model usable='unknown'>cortex-a53</model>
-      <model usable='unknown'>host</model>
       <model usable='unknown'>sa1100</model>
       <model usable='unknown'>pxa270-c5</model>
       <model usable='unknown'>cortex-a9</model>
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
index 201f9e0d7b..ca511f48d8 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
@@ -38,7 +38,6 @@
       <model usable='unknown'>sa1110</model>
       <model usable='unknown'>arm1176</model>
       <model usable='unknown'>cortex-a53</model>
-      <model usable='unknown'>host</model>
       <model usable='unknown'>sa1100</model>
       <model usable='unknown'>pxa270-c5</model>
       <model usable='unknown'>cortex-a9</model>