Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6aad33f3cc | |||
| 5b6591ed7d | |||
| 71c382a378 | |||
| 3ac26c9827 | |||
| d8f5f4e2e9 | |||
| 7fa7c37eee | |||
| 398721ffd4 | |||
| f6736a34a2 | |||
| aa2d30880a | |||
| b6cdf32170 | |||
| a3c4cc6f3d | |||
| 90fbcbd48f | |||
| 6efd96d995 | |||
| 21316e7a45 | |||
| 8adbb7a402 | |||
| 3f19d41908 | |||
| 34da93e0c9 | |||
| 208f506190 | |||
| 0ca715cad9 | |||
| 0f5d8c1c22 | |||
| a56bcbd063 | |||
| 89c3fa751c | |||
| 051644ffcb | |||
| 2a9c282548 | |||
| 2ae80af461 | |||
| 7335ede0e1 | |||
| 6c92ba3805 | |||
| 446f680673 | |||
| 3f56aa2870 | |||
| 3cec91694f | |||
| cb0cfa566f | |||
| a27acebf66 | |||
| 99d3a0ca1a | |||
| 9c962ebc4f | |||
| 99cbbf6606 | |||
| b73e509648 | |||
| b23ff9c0f7 | |||
| 20f9ed9c4c |
@@ -0,0 +1,32 @@
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Mon, 21 May 2018 23:05:07 +0100
|
||||
Subject: [PATCH] cpu: define the 'ssbd' CPUID feature bit (CVE-2018-3639)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
New microcode introduces the "Speculative Store Bypass Disable"
|
||||
CPUID feature bit. This needs to be exposed to guest OS to allow
|
||||
them to protect against CVE-2018-3639.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 1dbca2eccad58d91a5fd33962854f1a653638182)
|
||||
---
|
||||
src/cpu/cpu_map.xml | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
|
||||
index 00a43b172c..245aec3309 100644
|
||||
--- a/src/cpu/cpu_map.xml
|
||||
+++ b/src/cpu/cpu_map.xml
|
||||
@@ -298,6 +298,9 @@
|
||||
<feature name='spec-ctrl'>
|
||||
<cpuid eax_in='0x07' ecx_in='0x00' edx='0x04000000'/>
|
||||
</feature>
|
||||
+ <feature name='ssbd'>
|
||||
+ <cpuid eax_in='0x07' ecx_in='0x00' edx='0x80000000'/>
|
||||
+ </feature>
|
||||
|
||||
<!-- Processor Extended State Enumeration sub leaf 1 -->
|
||||
<feature name='xsaveopt'>
|
||||
@@ -1,122 +0,0 @@
|
||||
From: Andrea Bolognani <abologna@redhat.com>
|
||||
Date: Fri, 12 May 2017 14:05:55 +0200
|
||||
Subject: [PATCH] tests: Check default GIC version for aarch64/virt TCG guests
|
||||
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
(cherry picked from commit b24eaf6210ebaf5dc8d29621063873c8419c517e)
|
||||
---
|
||||
.../qemuxml2argv-aarch64-gic-none-tcg.args | 19 ++++++++++++++++
|
||||
.../qemuxml2argv-aarch64-gic-none-tcg.xml | 17 +++++++++++++++
|
||||
tests/qemuxml2argvtest.c | 3 +++
|
||||
.../qemuxml2xmlout-aarch64-gic-none-tcg.xml | 25 ++++++++++++++++++++++
|
||||
tests/qemuxml2xmltest.c | 1 +
|
||||
5 files changed, 65 insertions(+)
|
||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args
|
||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.xml
|
||||
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml
|
||||
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args
|
||||
new file mode 100644
|
||||
index 000000000..975a01481
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args
|
||||
@@ -0,0 +1,19 @@
|
||||
+LC_ALL=C \
|
||||
+PATH=/bin \
|
||||
+HOME=/home/test \
|
||||
+USER=test \
|
||||
+LOGNAME=test \
|
||||
+QEMU_AUDIO_DRV=none \
|
||||
+/usr/bin/qemu-system-aarch64 \
|
||||
+-name guest \
|
||||
+-S \
|
||||
+-machine virt,accel=tcg,gic-version=3 \
|
||||
+-cpu cortex-a57 \
|
||||
+-m 1024 \
|
||||
+-smp 1,sockets=1,cores=1,threads=1 \
|
||||
+-uuid 6ba410c5-1e5c-4d57-bee7-2228e7ffa32f \
|
||||
+-nographic \
|
||||
+-nodefaults \
|
||||
+-monitor unix:/tmp/lib/domain--1-guest/monitor.sock,server,nowait \
|
||||
+-no-acpi \
|
||||
+-boot c
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.xml
|
||||
new file mode 100644
|
||||
index 000000000..0aa33dbec
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.xml
|
||||
@@ -0,0 +1,17 @@
|
||||
+<domain type='qemu'>
|
||||
+ <name>guest</name>
|
||||
+ <uuid>6ba410c5-1e5c-4d57-bee7-2228e7ffa32f</uuid>
|
||||
+ <memory unit='KiB'>1048576</memory>
|
||||
+ <vcpu placement='static'>1</vcpu>
|
||||
+ <os>
|
||||
+ <type arch='aarch64' machine='virt'>hvm</type>
|
||||
+ <boot dev='hd'/>
|
||||
+ </os>
|
||||
+ <cpu mode='custom'>
|
||||
+ <model>cortex-a57</model>
|
||||
+ </cpu>
|
||||
+ <devices>
|
||||
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
|
||||
+ <memballoon model='none'/>
|
||||
+ </devices>
|
||||
+</domain>
|
||||
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
|
||||
index cc4fb91cd..362b140ac 100644
|
||||
--- a/tests/qemuxml2argvtest.c
|
||||
+++ b/tests/qemuxml2argvtest.c
|
||||
@@ -2250,6 +2250,9 @@ mymain(void)
|
||||
DO_TEST_GIC("aarch64-gic-none-both", GIC_BOTH,
|
||||
QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT,
|
||||
QEMU_CAPS_MACH_VIRT_GIC_VERSION);
|
||||
+ DO_TEST_GIC("aarch64-gic-none-tcg", GIC_BOTH,
|
||||
+ QEMU_CAPS_MACHINE_OPT,
|
||||
+ QEMU_CAPS_MACH_VIRT_GIC_VERSION);
|
||||
DO_TEST_GIC("aarch64-gic-default", GIC_NONE,
|
||||
QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT);
|
||||
DO_TEST_GIC("aarch64-gic-default", GIC_NONE,
|
||||
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml
|
||||
new file mode 100644
|
||||
index 000000000..69510e281
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml
|
||||
@@ -0,0 +1,25 @@
|
||||
+<domain type='qemu'>
|
||||
+ <name>guest</name>
|
||||
+ <uuid>6ba410c5-1e5c-4d57-bee7-2228e7ffa32f</uuid>
|
||||
+ <memory unit='KiB'>1048576</memory>
|
||||
+ <currentMemory unit='KiB'>1048576</currentMemory>
|
||||
+ <vcpu placement='static'>1</vcpu>
|
||||
+ <os>
|
||||
+ <type arch='aarch64' machine='virt'>hvm</type>
|
||||
+ <boot dev='hd'/>
|
||||
+ </os>
|
||||
+ <features>
|
||||
+ <gic version='3'/>
|
||||
+ </features>
|
||||
+ <cpu mode='custom' match='exact' check='none'>
|
||||
+ <model fallback='allow'>cortex-a57</model>
|
||||
+ </cpu>
|
||||
+ <clock offset='utc'/>
|
||||
+ <on_poweroff>destroy</on_poweroff>
|
||||
+ <on_reboot>restart</on_reboot>
|
||||
+ <on_crash>destroy</on_crash>
|
||||
+ <devices>
|
||||
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
|
||||
+ <memballoon model='none'/>
|
||||
+ </devices>
|
||||
+</domain>
|
||||
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
|
||||
index eae999dd6..aae632afe 100644
|
||||
--- a/tests/qemuxml2xmltest.c
|
||||
+++ b/tests/qemuxml2xmltest.c
|
||||
@@ -1073,6 +1073,7 @@ mymain(void)
|
||||
DO_TEST_FULL("aarch64-gic-none-v2", WHEN_BOTH, GIC_V2, NONE);
|
||||
DO_TEST_FULL("aarch64-gic-none-v3", WHEN_BOTH, GIC_V3, NONE);
|
||||
DO_TEST_FULL("aarch64-gic-none-both", WHEN_BOTH, GIC_BOTH, NONE);
|
||||
+ DO_TEST_FULL("aarch64-gic-none-tcg", WHEN_BOTH, GIC_BOTH, NONE);
|
||||
DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_NONE, NONE);
|
||||
DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_V2, NONE);
|
||||
DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_V3, NONE);
|
||||
@@ -1,85 +0,0 @@
|
||||
From: Andrea Bolognani <abologna@redhat.com>
|
||||
Date: Fri, 12 May 2017 13:29:57 +0200
|
||||
Subject: [PATCH] qemu: Use GICv2 for aarch64/virt TCG guests
|
||||
|
||||
There are currently some limitations in the emulated GICv3
|
||||
that make it unsuitable as a default. Use GICv2 instead.
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1450433
|
||||
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
(cherry picked from commit bc07101a7c2cd2ce07ad1ca28c47e0a7cde5625d)
|
||||
---
|
||||
src/qemu/qemu_domain.c | 23 +++++++++++++++++++++-
|
||||
.../qemuxml2argv-aarch64-gic-none-tcg.args | 2 +-
|
||||
.../qemuxml2xmlout-aarch64-gic-none-tcg.xml | 2 +-
|
||||
3 files changed, 24 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 589eb1889..891f8258a 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -2527,6 +2527,24 @@ qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def,
|
||||
for (version = VIR_GIC_VERSION_LAST - 1;
|
||||
version > VIR_GIC_VERSION_NONE;
|
||||
version--) {
|
||||
+
|
||||
+ /* We want to use the highest available GIC version for guests;
|
||||
+ * however, the emulated GICv3 is currently lacking a MSI controller,
|
||||
+ * making it unsuitable for the pure PCIe topology we aim for.
|
||||
+ *
|
||||
+ * For that reason, we skip this step entirely for TCG guests,
|
||||
+ * and rely on the code below to pick the default version, GICv2,
|
||||
+ * which supports all the features we need.
|
||||
+ *
|
||||
+ * We'll want to revisit this once MSI support for GICv3 has been
|
||||
+ * implemented in QEMU.
|
||||
+ *
|
||||
+ * See https://bugzilla.redhat.com/show_bug.cgi?id=1414081 */
|
||||
+ if (version == VIR_GIC_VERSION_3 &&
|
||||
+ def->virtType == VIR_DOMAIN_VIRT_QEMU) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
if (virQEMUCapsSupportsGICVersion(qemuCaps,
|
||||
def->virtType,
|
||||
version)) {
|
||||
@@ -2544,8 +2562,11 @@ qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def,
|
||||
|
||||
/* Use the default GIC version if no version was specified */
|
||||
if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON &&
|
||||
- def->gic_version == VIR_GIC_VERSION_NONE)
|
||||
+ def->gic_version == VIR_GIC_VERSION_NONE) {
|
||||
+ VIR_DEBUG("Using GIC version %s (default)",
|
||||
+ virGICVersionTypeToString(VIR_GIC_VERSION_DEFAULT));
|
||||
def->gic_version = VIR_GIC_VERSION_DEFAULT;
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args
|
||||
index 975a01481..52b699696 100644
|
||||
--- a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-tcg.args
|
||||
@@ -7,7 +7,7 @@ QEMU_AUDIO_DRV=none \
|
||||
/usr/bin/qemu-system-aarch64 \
|
||||
-name guest \
|
||||
-S \
|
||||
--machine virt,accel=tcg,gic-version=3 \
|
||||
+-machine virt,accel=tcg \
|
||||
-cpu cortex-a57 \
|
||||
-m 1024 \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml
|
||||
index 69510e281..a0cd0b768 100644
|
||||
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml
|
||||
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-tcg.xml
|
||||
@@ -9,7 +9,7 @@
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<features>
|
||||
- <gic version='3'/>
|
||||
+ <gic version='2'/>
|
||||
</features>
|
||||
<cpu mode='custom' match='exact' check='none'>
|
||||
<model fallback='allow'>cortex-a57</model>
|
||||
@@ -0,0 +1,65 @@
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Mon, 5 Mar 2018 12:46:16 +0000
|
||||
Subject: [PATCH] tests: force use of "NORMAL" TLS priority in test suite
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When generating certificates we rely on GNUTLS' built-in default setup
|
||||
for the ciphers used in the certs. We then currently run with the distro
|
||||
specific TLS priority setup which can be much stronger, to the extent
|
||||
that the certificates we generate are considered untrustworthy. We don't
|
||||
care about the quality of the ciphers we use in the test suite, so just
|
||||
force the priority to "NORMAL" which should ensure our certs are
|
||||
accepted by GNUTLS.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
tests/virnettlscontexttest.c | 4 ++--
|
||||
tests/virnettlssessiontest.c | 4 ++--
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/tests/virnettlscontexttest.c b/tests/virnettlscontexttest.c
|
||||
index 089c10e964..86647f3014 100644
|
||||
--- a/tests/virnettlscontexttest.c
|
||||
+++ b/tests/virnettlscontexttest.c
|
||||
@@ -72,7 +72,7 @@ static int testTLSContextInit(const void *opaque)
|
||||
data->crt,
|
||||
KEYFILE,
|
||||
NULL,
|
||||
- NULL,
|
||||
+ "NORMAL",
|
||||
true,
|
||||
true);
|
||||
} else {
|
||||
@@ -80,7 +80,7 @@ static int testTLSContextInit(const void *opaque)
|
||||
NULL,
|
||||
data->crt,
|
||||
KEYFILE,
|
||||
- NULL,
|
||||
+ "NORMAL",
|
||||
true,
|
||||
true);
|
||||
}
|
||||
diff --git a/tests/virnettlssessiontest.c b/tests/virnettlssessiontest.c
|
||||
index 6d639e5b16..7e85607181 100644
|
||||
--- a/tests/virnettlssessiontest.c
|
||||
+++ b/tests/virnettlssessiontest.c
|
||||
@@ -113,7 +113,7 @@ static int testTLSSessionInit(const void *opaque)
|
||||
data->servercrt,
|
||||
KEYFILE,
|
||||
data->wildcards,
|
||||
- NULL,
|
||||
+ "NORMAL",
|
||||
false,
|
||||
true);
|
||||
|
||||
@@ -121,7 +121,7 @@ static int testTLSSessionInit(const void *opaque)
|
||||
NULL,
|
||||
data->clientcrt,
|
||||
KEYFILE,
|
||||
- NULL,
|
||||
+ "NORMAL",
|
||||
false,
|
||||
true);
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Mon, 21 May 2018 23:05:08 +0100
|
||||
Subject: [PATCH] cpu: define the 'virt-ssbd' CPUID feature bit (CVE-2018-3639)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Some AMD processors only support a non-architectural means of
|
||||
enabling Speculative Store Bypass Disable. To allow simplified
|
||||
handling in virtual environments, hypervisors will expose an
|
||||
architectural definition through CPUID bit 0x80000008_EBX[25].
|
||||
This needs to be exposed to guest OS running on AMD x86 hosts to
|
||||
allow them to protect against CVE-2018-3639.
|
||||
|
||||
Note that since this CPUID bit won't be present in the host CPUID
|
||||
results on physical hosts, it will not be enabled automatically
|
||||
in guests configured with "host-model" CPU unless using QEMU
|
||||
version >= 2.9.0. Thus for older versions of QEMU, this feature
|
||||
must be manually enabled using policy=force. Guests using the
|
||||
"host-passthrough" CPU mode do not need special handling.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 9267342206ce17f6933d57a3128cdc504d5945c9)
|
||||
---
|
||||
src/cpu/cpu_map.xml | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
|
||||
index 245aec3309..96daa0f9af 100644
|
||||
--- a/src/cpu/cpu_map.xml
|
||||
+++ b/src/cpu/cpu_map.xml
|
||||
@@ -433,6 +433,9 @@
|
||||
<feature name='ibpb'>
|
||||
<cpuid eax_in='0x80000008' ebx='0x00001000'/>
|
||||
</feature>
|
||||
+ <feature name='virt-ssbd'>
|
||||
+ <cpuid eax_in='0x80000008' ebx='0x02000000'/>
|
||||
+ </feature>
|
||||
|
||||
<!-- models -->
|
||||
<model name='486'>
|
||||
@@ -1,67 +0,0 @@
|
||||
From: Andrea Bolognani <abologna@redhat.com>
|
||||
Date: Fri, 12 May 2017 14:38:08 +0200
|
||||
Subject: [PATCH] gic: Remove VIR_GIC_VERSION_DEFAULT
|
||||
|
||||
The QEMU default is GICv2, and some of the code in libvirt
|
||||
relies on the exact value. Stop pretending that's not the
|
||||
case and use GICv2 explicitly where needed.
|
||||
|
||||
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
||||
(cherry picked from commit 5645badd1fe04fee7237c2f95e7710e978e40770)
|
||||
---
|
||||
src/qemu/qemu_command.c | 6 +++---
|
||||
src/qemu/qemu_domain.c | 7 +++----
|
||||
src/util/virgic.h | 3 ---
|
||||
3 files changed, 6 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 2d1328cf9..5feddc523 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -7321,9 +7321,9 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- /* The default GIC version should not be specified on the
|
||||
- * QEMU commandline for backwards compatibility reasons */
|
||||
- if (def->gic_version != VIR_GIC_VERSION_DEFAULT) {
|
||||
+ /* The default GIC version (GICv2) should not be specified on
|
||||
+ * the QEMU commandline for backwards compatibility reasons */
|
||||
+ if (def->gic_version != VIR_GIC_VERSION_2) {
|
||||
if (!virQEMUCapsGet(qemuCaps,
|
||||
QEMU_CAPS_MACH_VIRT_GIC_VERSION)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 891f8258a..4a127cedf 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -2560,12 +2560,11 @@ qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def,
|
||||
def->features[VIR_DOMAIN_FEATURE_GIC] = VIR_TRISTATE_SWITCH_ON;
|
||||
}
|
||||
|
||||
- /* Use the default GIC version if no version was specified */
|
||||
+ /* Use the default GIC version (GICv2) if no version was specified */
|
||||
if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON &&
|
||||
def->gic_version == VIR_GIC_VERSION_NONE) {
|
||||
- VIR_DEBUG("Using GIC version %s (default)",
|
||||
- virGICVersionTypeToString(VIR_GIC_VERSION_DEFAULT));
|
||||
- def->gic_version = VIR_GIC_VERSION_DEFAULT;
|
||||
+ VIR_DEBUG("Using GIC version 2 (default)");
|
||||
+ def->gic_version = VIR_GIC_VERSION_2;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/util/virgic.h b/src/util/virgic.h
|
||||
index 1c9efd60f..2d77fdd45 100644
|
||||
--- a/src/util/virgic.h
|
||||
+++ b/src/util/virgic.h
|
||||
@@ -35,9 +35,6 @@ typedef enum {
|
||||
|
||||
VIR_ENUM_DECL(virGICVersion);
|
||||
|
||||
-/* Consider GIC v2 the default */
|
||||
-# define VIR_GIC_VERSION_DEFAULT VIR_GIC_VERSION_2
|
||||
-
|
||||
typedef enum {
|
||||
VIR_GIC_IMPLEMENTATION_NONE = 0,
|
||||
VIR_GIC_IMPLEMENTATION_KERNEL = (1 << 1),
|
||||
@@ -1,198 +0,0 @@
|
||||
From: Laine Stump <laine@laine.org>
|
||||
Date: Thu, 18 May 2017 14:16:27 -0400
|
||||
Subject: [PATCH] Revert "qemu: propagate bridge MTU into qemu "host_mtu"
|
||||
option"
|
||||
|
||||
This reverts commit 2841e675.
|
||||
|
||||
It turns out that adding the host_mtu field to the PCI capabilities in
|
||||
the guest bumps the length of PCI capabilities beyond the 32 byte
|
||||
boundary, so the virtio-net device gets 64 bytes of ioport space
|
||||
instead of 32, which offsets the address of all the other following
|
||||
devices. Migration doesn't work very well when the location and length
|
||||
of PCI capabilities of devices is changed between source and
|
||||
destination.
|
||||
|
||||
This means that we need to make sure that the absence/presence of
|
||||
host_mtu on the qemu commandline always matches between source and
|
||||
destination, which means that we need to make setting of host_mtu an
|
||||
opt-in thing (it can't happen automatically when the bridge being used
|
||||
has a non-default MTU, which is what commit 2841e675 implemented).
|
||||
|
||||
I do want to re-implement this feature with an <mtu auto='on'/>
|
||||
setting, but probably won't backport that to any stable branches, so
|
||||
I'm first reverting the original commit, and that revert can be pushed
|
||||
to the few releases that have been made since the original (3.1.0 -
|
||||
3.3.0)
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/1449346
|
||||
(cherry picked from commit 77780a29edace958a1f931d3281b962be4f5290e)
|
||||
(cherry picked from commit a2f5e87dceb1725c16cd4df17a4b7381ecf65901)
|
||||
---
|
||||
src/qemu/qemu_command.c | 32 ++++++++++----------------------
|
||||
src/qemu/qemu_command.h | 3 +--
|
||||
src/qemu/qemu_hotplug.c | 5 ++---
|
||||
src/qemu/qemu_interface.c | 5 ++---
|
||||
src/qemu/qemu_interface.h | 3 +--
|
||||
5 files changed, 16 insertions(+), 32 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 5feddc523..3abfe7b55 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -3629,8 +3629,7 @@ qemuBuildNicDevStr(virDomainDefPtr def,
|
||||
int vlan,
|
||||
unsigned int bootindex,
|
||||
size_t vhostfdSize,
|
||||
- virQEMUCapsPtr qemuCaps,
|
||||
- unsigned int mtu)
|
||||
+ virQEMUCapsPtr qemuCaps)
|
||||
{
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
const char *nic = net->model;
|
||||
@@ -3754,23 +3753,13 @@ qemuBuildNicDevStr(virDomainDefPtr def,
|
||||
virBufferAsprintf(&buf, ",rx_queue_size=%u", net->driver.virtio.rx_queue_size);
|
||||
}
|
||||
|
||||
- if (usingVirtio && mtu) {
|
||||
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
|
||||
-
|
||||
- virBufferAsprintf(&buf, ",host_mtu=%u", mtu);
|
||||
-
|
||||
- } else {
|
||||
- /* log an error if mtu was requested specifically for this
|
||||
- * interface, otherwise, if it's just what was reported by
|
||||
- * the attached network, ignore it.
|
||||
- */
|
||||
- if (net->mtu) {
|
||||
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
- _("setting MTU is not supported with "
|
||||
- "this QEMU binary"));
|
||||
- goto error;
|
||||
- }
|
||||
+ if (usingVirtio && net->mtu) {
|
||||
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
|
||||
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
+ _("setting MTU is not supported with this QEMU binary"));
|
||||
+ goto error;
|
||||
}
|
||||
+ virBufferAsprintf(&buf, ",host_mtu=%u", net->mtu);
|
||||
}
|
||||
|
||||
if (vlan == -1)
|
||||
@@ -8213,7 +8202,7 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver,
|
||||
VIR_FREE(netdev);
|
||||
|
||||
if (!(nic = qemuBuildNicDevStr(def, net, -1, bootindex,
|
||||
- queues, qemuCaps, net->mtu))) {
|
||||
+ queues, qemuCaps))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("Error generating NIC -device string"));
|
||||
goto error;
|
||||
@@ -8259,7 +8248,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
||||
virDomainNetType actualType = virDomainNetGetActualType(net);
|
||||
virNetDevBandwidthPtr actualBandwidth;
|
||||
size_t i;
|
||||
- unsigned int mtu = net->mtu;
|
||||
|
||||
|
||||
if (!bootindex)
|
||||
@@ -8314,7 +8302,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
||||
memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
|
||||
|
||||
if (qemuInterfaceBridgeConnect(def, driver, net,
|
||||
- tapfd, &tapfdSize, &mtu) < 0)
|
||||
+ tapfd, &tapfdSize) < 0)
|
||||
goto cleanup;
|
||||
break;
|
||||
|
||||
@@ -8494,7 +8482,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
||||
}
|
||||
if (qemuDomainSupportsNicdev(def, net)) {
|
||||
if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex,
|
||||
- vhostfdSize, qemuCaps, mtu)))
|
||||
+ vhostfdSize, qemuCaps)))
|
||||
goto cleanup;
|
||||
virCommandAddArgList(cmd, "-device", nic, NULL);
|
||||
} else {
|
||||
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
|
||||
index 7da92c8c9..09cb00ee9 100644
|
||||
--- a/src/qemu/qemu_command.h
|
||||
+++ b/src/qemu/qemu_command.h
|
||||
@@ -101,8 +101,7 @@ char *qemuBuildNicDevStr(virDomainDefPtr def,
|
||||
int vlan,
|
||||
unsigned int bootindex,
|
||||
size_t vhostfdSize,
|
||||
- virQEMUCapsPtr qemuCaps,
|
||||
- unsigned int mtu);
|
||||
+ virQEMUCapsPtr qemuCaps);
|
||||
|
||||
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk);
|
||||
|
||||
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
|
||||
index f133d04a8..2a4159560 100644
|
||||
--- a/src/qemu/qemu_hotplug.c
|
||||
+++ b/src/qemu/qemu_hotplug.c
|
||||
@@ -968,7 +968,6 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
|
||||
bool charDevPlugged = false;
|
||||
bool netdevPlugged = false;
|
||||
bool hostPlugged = false;
|
||||
- unsigned int mtu = net->mtu;
|
||||
|
||||
/* preallocate new slot for device */
|
||||
if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
|
||||
@@ -1025,7 +1024,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
|
||||
goto cleanup;
|
||||
memset(vhostfd, -1, sizeof(*vhostfd) * vhostfdSize);
|
||||
if (qemuInterfaceBridgeConnect(vm->def, driver, net,
|
||||
- tapfd, &tapfdSize, &mtu) < 0)
|
||||
+ tapfd, &tapfdSize) < 0)
|
||||
goto cleanup;
|
||||
iface_connected = true;
|
||||
if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
|
||||
@@ -1239,7 +1238,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
|
||||
VIR_FORCE_CLOSE(vhostfd[i]);
|
||||
|
||||
if (!(nicstr = qemuBuildNicDevStr(vm->def, net, vlan, 0,
|
||||
- queueSize, priv->qemuCaps, mtu)))
|
||||
+ queueSize, priv->qemuCaps)))
|
||||
goto try_remove;
|
||||
|
||||
qemuDomainObjEnterMonitor(driver, vm);
|
||||
diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
|
||||
index c5dca60f1..ce448d243 100644
|
||||
--- a/src/qemu/qemu_interface.c
|
||||
+++ b/src/qemu/qemu_interface.c
|
||||
@@ -503,8 +503,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
|
||||
virQEMUDriverPtr driver,
|
||||
virDomainNetDefPtr net,
|
||||
int *tapfd,
|
||||
- size_t *tapfdSize,
|
||||
- unsigned int *mtu)
|
||||
+ size_t *tapfdSize)
|
||||
{
|
||||
const char *brname;
|
||||
int ret = -1;
|
||||
@@ -545,7 +544,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
|
||||
def->uuid, tunpath, tapfd, *tapfdSize,
|
||||
virDomainNetGetActualVirtPortProfile(net),
|
||||
virDomainNetGetActualVlan(net),
|
||||
- net->mtu, mtu,
|
||||
+ 0, NULL,
|
||||
tap_create_flags) < 0) {
|
||||
virDomainAuditNetDevice(def, net, tunpath, false);
|
||||
goto cleanup;
|
||||
diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h
|
||||
index ba74ac2cf..a7faa0b3d 100644
|
||||
--- a/src/qemu/qemu_interface.h
|
||||
+++ b/src/qemu/qemu_interface.h
|
||||
@@ -51,8 +51,7 @@ int qemuInterfaceBridgeConnect(virDomainDefPtr def,
|
||||
virQEMUDriverPtr driver,
|
||||
virDomainNetDefPtr net,
|
||||
int *tapfd,
|
||||
- size_t *tapfdSize,
|
||||
- unsigned int *mtu)
|
||||
+ size_t *tapfdSize)
|
||||
ATTRIBUTE_NONNULL(2);
|
||||
|
||||
int qemuInterfaceOpenVhostNet(virDomainDefPtr def,
|
||||
@@ -0,0 +1,31 @@
|
||||
From: Jim Fehlig <jfehlig@suse.com>
|
||||
Date: Wed, 14 Mar 2018 16:42:39 -0600
|
||||
Subject: [PATCH] lockd: fix typo in virtlockd-admin.socket
|
||||
|
||||
Commit ce7ae55ea1 introduced a typo in virtlockd-admin socket file
|
||||
|
||||
/usr/lib/systemd/system/virtlockd-admin.socket:7: Unknown lvalue
|
||||
'Server' in section 'Socket'
|
||||
|
||||
Change 'Server' to 'Service'.
|
||||
|
||||
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
||||
Reviewed-by: Erik Skultety <eskultet@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
src/locking/virtlockd-admin.socket.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/locking/virtlockd-admin.socket.in b/src/locking/virtlockd-admin.socket.in
|
||||
index 1fa0a3dc33..2a7500f3d0 100644
|
||||
--- a/src/locking/virtlockd-admin.socket.in
|
||||
+++ b/src/locking/virtlockd-admin.socket.in
|
||||
@@ -4,7 +4,7 @@ Before=libvirtd.service
|
||||
|
||||
[Socket]
|
||||
ListenStream=@localstatedir@/run/libvirt/virtlockd-admin-sock
|
||||
-Server=virtlockd.service
|
||||
+Service=virtlockd.service
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
@@ -1,145 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 29 Mar 2017 14:45:44 +0200
|
||||
Subject: [PATCH] cpu: Introduce virCPUCopyMigratable
|
||||
|
||||
This new internal API makes a copy of virCPUDef while removing all
|
||||
features which would block migration. It uses cpu_map.xml as a database
|
||||
of such features, which should only be used as a fallback when we cannot
|
||||
get the data from a hypervisor. The main goal of this API is to decouple
|
||||
this filtering from virCPUUpdate so that the hypervisor driver can
|
||||
filter the features according to the hypervisor.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 05e91c79f19e0be96526098d58a3498dac3f8529)
|
||||
---
|
||||
src/cpu/cpu.c | 31 +++++++++++++++++++++++++++++++
|
||||
src/cpu/cpu.h | 8 ++++++++
|
||||
src/cpu/cpu_x86.c | 25 +++++++++++++++++++++++++
|
||||
src/libvirt_private.syms | 1 +
|
||||
4 files changed, 65 insertions(+)
|
||||
|
||||
diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
|
||||
index 93647a2ed..8a407ac18 100644
|
||||
--- a/src/cpu/cpu.c
|
||||
+++ b/src/cpu/cpu.c
|
||||
@@ -1130,3 +1130,34 @@ virCPUExpandFeatures(virArch arch,
|
||||
VIR_DEBUG("nfeatures=%zu", cpu->nfeatures);
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+
|
||||
+/**
|
||||
+ * virCPUCopyMigratable:
|
||||
+ *
|
||||
+ * @arch: CPU architecture
|
||||
+ * @cpu: CPU definition to be copied
|
||||
+ *
|
||||
+ * Makes a copy of @cpu with all features which would block migration removed.
|
||||
+ * If this doesn't make sense for a given architecture, the function returns a
|
||||
+ * plain copy of @cpu (i.e., a copy with no features removed).
|
||||
+ *
|
||||
+ * Returns the copy of the CPU or NULL on error.
|
||||
+ */
|
||||
+virCPUDefPtr
|
||||
+virCPUCopyMigratable(virArch arch,
|
||||
+ virCPUDefPtr cpu)
|
||||
+{
|
||||
+ struct cpuArchDriver *driver;
|
||||
+
|
||||
+ VIR_DEBUG("arch=%s, cpu=%p, model=%s",
|
||||
+ virArchToString(arch), cpu, NULLSTR(cpu->model));
|
||||
+
|
||||
+ if (!(driver = cpuGetSubDriver(arch)))
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (driver->copyMigratable)
|
||||
+ return driver->copyMigratable(cpu);
|
||||
+ else
|
||||
+ return virCPUDefCopy(cpu);
|
||||
+}
|
||||
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
|
||||
index 8c238ad55..352445c40 100644
|
||||
--- a/src/cpu/cpu.h
|
||||
+++ b/src/cpu/cpu.h
|
||||
@@ -118,6 +118,9 @@ typedef int
|
||||
typedef int
|
||||
(*virCPUArchExpandFeatures)(virCPUDefPtr cpu);
|
||||
|
||||
+typedef virCPUDefPtr
|
||||
+(*virCPUArchCopyMigratable)(virCPUDefPtr cpu);
|
||||
+
|
||||
struct cpuArchDriver {
|
||||
const char *name;
|
||||
const virArch *arch;
|
||||
@@ -138,6 +141,7 @@ struct cpuArchDriver {
|
||||
virCPUArchTranslate translate;
|
||||
virCPUArchConvertLegacy convertLegacy;
|
||||
virCPUArchExpandFeatures expandFeatures;
|
||||
+ virCPUArchCopyMigratable copyMigratable;
|
||||
};
|
||||
|
||||
|
||||
@@ -254,6 +258,10 @@ int
|
||||
virCPUExpandFeatures(virArch arch,
|
||||
virCPUDefPtr cpu);
|
||||
|
||||
+virCPUDefPtr
|
||||
+virCPUCopyMigratable(virArch arch,
|
||||
+ virCPUDefPtr cpu);
|
||||
+
|
||||
/* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and
|
||||
* have no real-life usage
|
||||
*/
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index 48648a7f4..a771b251e 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -2903,6 +2903,30 @@ virCPUx86ExpandFeatures(virCPUDefPtr cpu)
|
||||
}
|
||||
|
||||
|
||||
+static virCPUDefPtr
|
||||
+virCPUx86CopyMigratable(virCPUDefPtr cpu)
|
||||
+{
|
||||
+ virCPUDefPtr copy;
|
||||
+ virCPUx86MapPtr map;
|
||||
+
|
||||
+ if (!(map = virCPUx86GetMap()))
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (!(copy = virCPUDefCopyWithoutModel(cpu)))
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (virCPUDefCopyModelFilter(copy, cpu, false,
|
||||
+ x86FeatureIsMigratable, map) < 0)
|
||||
+ goto error;
|
||||
+
|
||||
+ return copy;
|
||||
+
|
||||
+ error:
|
||||
+ virCPUDefFree(copy);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
int
|
||||
virCPUx86DataAddCPUID(virCPUDataPtr cpuData,
|
||||
const virCPUx86CPUID *cpuid)
|
||||
@@ -2978,4 +3002,5 @@ struct cpuArchDriver cpuDriverX86 = {
|
||||
.getModels = virCPUx86GetModels,
|
||||
.translate = virCPUx86Translate,
|
||||
.expandFeatures = virCPUx86ExpandFeatures,
|
||||
+ .copyMigratable = virCPUx86CopyMigratable,
|
||||
};
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index b551cb86a..dc6db3b28 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -1016,6 +1016,7 @@ virCPUCheckFeature;
|
||||
virCPUCompare;
|
||||
virCPUCompareXML;
|
||||
virCPUConvertLegacy;
|
||||
+virCPUCopyMigratable;
|
||||
virCPUDataCheckFeature;
|
||||
virCPUDataFormat;
|
||||
virCPUDataFree;
|
||||
@@ -0,0 +1,105 @@
|
||||
From: Laine Stump <laine@laine.org>
|
||||
Date: Wed, 25 Apr 2018 17:12:03 -0400
|
||||
Subject: [PATCH] nwfilter: increase pcap buffer size to be compatible with
|
||||
TPACKET_V3
|
||||
|
||||
When an nwfilter rule sets the parameter CTRL_IP_LEARNING to "dhcp",
|
||||
this turns on the "dhcpsnoop" thread, which uses libpcap to monitor
|
||||
traffic on the domain's tap device and extract the IP address from the
|
||||
DHCP response.
|
||||
|
||||
If libpcap on the host is built with HAVE_TPACKET3 defined (to enable
|
||||
support for TPACKET_V3), the dhcpsnoop code's initialization of the
|
||||
libpcap socket would fail with the following error:
|
||||
|
||||
virNWFilterSnoopDHCPOpen:1134 : internal error: pcap_setfilter: can't remove kernel filter: Bad file descriptor
|
||||
|
||||
It turns out that this was because TPACKET_V3 requires a larger buffer
|
||||
size than libvirt was setting (we were setting it to 128k). Changing
|
||||
the buffer size to 256k eliminates the error, and the dhcpsnoop thread
|
||||
once again works properly.
|
||||
|
||||
A fuller explanation of why TPACKET_V3 requires such a large buffer,
|
||||
for future git spelunkers:
|
||||
|
||||
libpcap calls setsockopt(... SOL_PACKET, PACKET_RX_RING...) to setup a
|
||||
ring buffer for receiving packets; two of the attributes sent to this
|
||||
API are called tp_frame_size, and tp_frame_nr. If libpcap was built
|
||||
with HAVE_TPACKET3 defined, tp_trame_size is set to MAXIMUM_SNAPLEN
|
||||
(defined in libpcap sources as 262144) and tp_frame_nr is set to:
|
||||
|
||||
[the buffer size we set, i.e. PCAP_BUFFERSIZE i.e. 262144] / tp_frame_size.
|
||||
|
||||
So if PCAP_BUFFERSIZE < MAXIMUM_SNAPLEN, then tp_frame_nr (the number
|
||||
of frames in the ring buffer) is 0, which is nonsensical. This same
|
||||
value is later used as a multiplier to determine the size for a call
|
||||
to malloc() (which would also fail).
|
||||
|
||||
(NB: if HAVE_TPACKET3 is *not* defined, then tp_frame_size is set to
|
||||
the snaplen set by the user (in our case 576) plus a small amount to
|
||||
account for ethernet headers, so 256k is far more than adequate)
|
||||
|
||||
Since the TPACKET_V3 code in libpcap actually reads multiple packets
|
||||
into each frame, it's not a problem to have only a single frame
|
||||
(especially when we are monitoring such infrequent traffic), so it's
|
||||
okay to set this relatively small buffer size (in comparison to the
|
||||
default, which is 2MB), which is important since every guest using
|
||||
dhcp snooping in a nwfilter rule will hold 2 of these buffers for the
|
||||
entire life of the guest.
|
||||
|
||||
Thanks to Christian Ehrhardt for discovering that buffer size was the
|
||||
problem (this was not at all obvious from the error that was logged!)
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/1547237
|
||||
Fixes: https://bugs.launchpad.net/libvirt/+bug/1758037
|
||||
|
||||
Signed-off-by: Laine Stump <laine@laine.org>
|
||||
Reviewed-by: Christian Ehrhardt <christian.ehrhardt@canonical.com> (V1)
|
||||
Reviewed-by: John Ferlan <jferlan@redhat.com>
|
||||
Tested-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
src/nwfilter/nwfilter_dhcpsnoop.c | 22 +++++++++++++++++++---
|
||||
1 file changed, 19 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/nwfilter/nwfilter_dhcpsnoop.c b/src/nwfilter/nwfilter_dhcpsnoop.c
|
||||
index 6069e70460..50cfb944a2 100644
|
||||
--- a/src/nwfilter/nwfilter_dhcpsnoop.c
|
||||
+++ b/src/nwfilter/nwfilter_dhcpsnoop.c
|
||||
@@ -256,10 +256,21 @@ struct _virNWFilterDHCPDecodeJob {
|
||||
# define DHCP_BURST_INTERVAL_S 10 /* sec */
|
||||
|
||||
/*
|
||||
- * libpcap 1.5 requires a 128kb buffer
|
||||
- * 128 kb is bigger than (DHCP_PKT_BURST * PCAP_PBUFSIZE / 2)
|
||||
+ * NB: Any libpcap built with HAVE_TPACKET3 will require
|
||||
+ * PCAP_BUFFERSIZE to be at least 262144 (although
|
||||
+ * pcap_set_buffer_size() with a lower value will succeed, and the
|
||||
+ * error will only show up later when pcap_setfilter() is called).
|
||||
+ *
|
||||
+ * It is possible that in the future libpcap could increase the
|
||||
+ * minimum size even further, but due to the fact that each guest
|
||||
+ * using dhcp snooping keeps 2 pcap sockets open (and thus 2 buffers
|
||||
+ * allocated) for the life of the guest, we want to minimize the
|
||||
+ * length of the buffer, so instead of leaving it at the default size
|
||||
+ * (2MB), we are setting it to the minimum viable size and including
|
||||
+ * this clue in the source to help quickly resolve the problem when/if
|
||||
+ * it reoccurs.
|
||||
*/
|
||||
-# define PCAP_BUFFERSIZE (128 * 1024)
|
||||
+# define PCAP_BUFFERSIZE (256 * 1024)
|
||||
|
||||
# define MAX_QUEUED_JOBS (DHCP_PKT_BURST + 2 * DHCP_PKT_RATE)
|
||||
|
||||
@@ -1114,6 +1125,11 @@ virNWFilterSnoopDHCPOpen(const char *ifname, virMacAddr *mac,
|
||||
goto cleanup_nohandle;
|
||||
}
|
||||
|
||||
+ /* IMPORTANT: If there is any failure of *any* pcap_* function
|
||||
+ * during setup of the socket, look to the comment where
|
||||
+ * PCAP_BUFFERSIZE is defined. It may be too small, even if the
|
||||
+ * generated error doesn't imply that.
|
||||
+ */
|
||||
if (pcap_set_snaplen(handle, PCAP_PBUFSIZE) < 0 ||
|
||||
pcap_set_buffer_size(handle, PCAP_BUFFERSIZE) < 0 ||
|
||||
pcap_activate(handle) < 0) {
|
||||
@@ -1,78 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Thu, 30 Mar 2017 13:50:44 +0200
|
||||
Subject: [PATCH] qemu: Move common code in virQEMUCapsInitCPUModel one layer
|
||||
up
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit d84b93fad51b190238e18b1daac82ea6e28869e9)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 25 ++++++++++---------------
|
||||
1 file changed, 10 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index b1245ad5d..1a15750a3 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -3111,17 +3111,11 @@ virQEMUCapsCPUFilterFeatures(const char *name,
|
||||
*/
|
||||
static int
|
||||
virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
|
||||
- virDomainVirtType type,
|
||||
+ qemuMonitorCPUModelInfoPtr modelInfo,
|
||||
virCPUDefPtr cpu)
|
||||
{
|
||||
- qemuMonitorCPUModelInfoPtr modelInfo;
|
||||
size_t i;
|
||||
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- modelInfo = qemuCaps->kvmCPUModelInfo;
|
||||
- else
|
||||
- modelInfo = qemuCaps->tcgCPUModelInfo;
|
||||
-
|
||||
if (!modelInfo) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("missing host CPU model info from QEMU capabilities "
|
||||
@@ -3163,9 +3157,9 @@ virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
|
||||
static int
|
||||
virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
+ qemuMonitorCPUModelInfoPtr model,
|
||||
virCPUDefPtr cpu)
|
||||
{
|
||||
- qemuMonitorCPUModelInfoPtr model;
|
||||
virCPUDataPtr data = NULL;
|
||||
unsigned long long sigFamily = 0;
|
||||
unsigned long long sigModel = 0;
|
||||
@@ -3174,11 +3168,6 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
|
||||
int ret = -1;
|
||||
size_t i;
|
||||
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- model = qemuCaps->kvmCPUModelInfo;
|
||||
- else
|
||||
- model = qemuCaps->tcgCPUModelInfo;
|
||||
-
|
||||
if (!model)
|
||||
return 1;
|
||||
|
||||
@@ -3239,12 +3228,18 @@ virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
virCPUDefPtr cpu)
|
||||
{
|
||||
+ qemuMonitorCPUModelInfoPtr model;
|
||||
int ret = 1;
|
||||
|
||||
+ if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
+ model = qemuCaps->kvmCPUModelInfo;
|
||||
+ else
|
||||
+ model = qemuCaps->tcgCPUModelInfo;
|
||||
+
|
||||
if (ARCH_IS_S390(qemuCaps->arch))
|
||||
- ret = virQEMUCapsInitCPUModelS390(qemuCaps, type, cpu);
|
||||
+ ret = virQEMUCapsInitCPUModelS390(qemuCaps, model, cpu);
|
||||
else if (ARCH_IS_X86(qemuCaps->arch))
|
||||
- ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, cpu);
|
||||
+ ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, model, cpu);
|
||||
|
||||
if (ret == 0)
|
||||
cpu->fallback = VIR_CPU_FALLBACK_FORBID;
|
||||
@@ -0,0 +1,253 @@
|
||||
From: Vincent Bernat <vincent@bernat.im>
|
||||
Date: Tue, 10 Apr 2018 08:27:15 +0200
|
||||
Subject: [PATCH] util: don't check for parallel iteration in hash-related
|
||||
functions
|
||||
|
||||
This is the responsability of the caller to apply the correct lock
|
||||
before using these functions. Moreover, the use of a simple boolean
|
||||
was still racy: two threads may check the boolean and "lock" it
|
||||
simultaneously.
|
||||
|
||||
Users of functions from src/util/virhash.c have to be checked for
|
||||
correctness. Lookups and iteration should hold a RO
|
||||
lock. Modifications should hold a RW lock.
|
||||
|
||||
Most important uses seem to be covered. Callers have now a greater
|
||||
responsability, notably the ability to execute some operations while
|
||||
iterating were reliably forbidden before are now accepted.
|
||||
|
||||
Signed-off-by: Vincent Bernat <vincent@bernat.im>
|
||||
(cherry picked from commit 4d7384eb9ddef2008cb0cc165eb808f74bc83d6b)
|
||||
---
|
||||
src/util/virhash.c | 37 --------------------
|
||||
tests/virhashtest.c | 83 ---------------------------------------------
|
||||
2 files changed, 120 deletions(-)
|
||||
|
||||
diff --git a/src/util/virhash.c b/src/util/virhash.c
|
||||
index 0ffbfcce2c..475c2b0281 100644
|
||||
--- a/src/util/virhash.c
|
||||
+++ b/src/util/virhash.c
|
||||
@@ -41,12 +41,6 @@ VIR_LOG_INIT("util.hash");
|
||||
|
||||
/* #define DEBUG_GROW */
|
||||
|
||||
-#define virHashIterationError(ret) \
|
||||
- do { \
|
||||
- VIR_ERROR(_("Hash operation not allowed during iteration")); \
|
||||
- return ret; \
|
||||
- } while (0)
|
||||
-
|
||||
/*
|
||||
* A single entry in the hash table
|
||||
*/
|
||||
@@ -66,10 +60,6 @@ struct _virHashTable {
|
||||
uint32_t seed;
|
||||
size_t size;
|
||||
size_t nbElems;
|
||||
- /* True iff we are iterating over hash entries. */
|
||||
- bool iterating;
|
||||
- /* Pointer to the current entry during iteration. */
|
||||
- virHashEntryPtr current;
|
||||
virHashDataFree dataFree;
|
||||
virHashKeyCode keyCode;
|
||||
virHashKeyEqual keyEqual;
|
||||
@@ -339,9 +329,6 @@ virHashAddOrUpdateEntry(virHashTablePtr table, const void *name,
|
||||
if ((table == NULL) || (name == NULL))
|
||||
return -1;
|
||||
|
||||
- if (table->iterating)
|
||||
- virHashIterationError(-1);
|
||||
-
|
||||
key = virHashComputeKey(table, name);
|
||||
|
||||
/* Check for duplicate entry */
|
||||
@@ -551,9 +538,6 @@ virHashRemoveEntry(virHashTablePtr table, const void *name)
|
||||
nextptr = table->table + virHashComputeKey(table, name);
|
||||
for (entry = *nextptr; entry; entry = entry->next) {
|
||||
if (table->keyEqual(entry->name, name)) {
|
||||
- if (table->iterating && table->current != entry)
|
||||
- virHashIterationError(-1);
|
||||
-
|
||||
if (table->dataFree)
|
||||
table->dataFree(entry->payload, entry->name);
|
||||
if (table->keyFree)
|
||||
@@ -593,18 +577,11 @@ virHashForEach(virHashTablePtr table, virHashIterator iter, void *data)
|
||||
if (table == NULL || iter == NULL)
|
||||
return -1;
|
||||
|
||||
- if (table->iterating)
|
||||
- virHashIterationError(-1);
|
||||
-
|
||||
- table->iterating = true;
|
||||
- table->current = NULL;
|
||||
for (i = 0; i < table->size; i++) {
|
||||
virHashEntryPtr entry = table->table[i];
|
||||
while (entry) {
|
||||
virHashEntryPtr next = entry->next;
|
||||
- table->current = entry;
|
||||
ret = iter(entry->payload, entry->name, data);
|
||||
- table->current = NULL;
|
||||
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
@@ -615,7 +592,6 @@ virHashForEach(virHashTablePtr table, virHashIterator iter, void *data)
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
- table->iterating = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -643,11 +619,6 @@ virHashRemoveSet(virHashTablePtr table,
|
||||
if (table == NULL || iter == NULL)
|
||||
return -1;
|
||||
|
||||
- if (table->iterating)
|
||||
- virHashIterationError(-1);
|
||||
-
|
||||
- table->iterating = true;
|
||||
- table->current = NULL;
|
||||
for (i = 0; i < table->size; i++) {
|
||||
virHashEntryPtr *nextptr = table->table + i;
|
||||
|
||||
@@ -667,7 +638,6 @@ virHashRemoveSet(virHashTablePtr table,
|
||||
}
|
||||
}
|
||||
}
|
||||
- table->iterating = false;
|
||||
|
||||
return count;
|
||||
}
|
||||
@@ -723,23 +693,16 @@ void *virHashSearch(const virHashTable *ctable,
|
||||
if (table == NULL || iter == NULL)
|
||||
return NULL;
|
||||
|
||||
- if (table->iterating)
|
||||
- virHashIterationError(NULL);
|
||||
-
|
||||
- table->iterating = true;
|
||||
- table->current = NULL;
|
||||
for (i = 0; i < table->size; i++) {
|
||||
virHashEntryPtr entry;
|
||||
for (entry = table->table[i]; entry; entry = entry->next) {
|
||||
if (iter(entry->payload, entry->name, data)) {
|
||||
- table->iterating = false;
|
||||
if (name)
|
||||
*name = table->keyCopy(entry->name);
|
||||
return entry->payload;
|
||||
}
|
||||
}
|
||||
}
|
||||
- table->iterating = false;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
diff --git a/tests/virhashtest.c b/tests/virhashtest.c
|
||||
index 3b85b62c30..e9c03c1afb 100644
|
||||
--- a/tests/virhashtest.c
|
||||
+++ b/tests/virhashtest.c
|
||||
@@ -221,32 +221,6 @@ testHashRemoveForEachAll(void *payload ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
|
||||
-const int testHashCountRemoveForEachForbidden = ARRAY_CARDINALITY(uuids);
|
||||
-
|
||||
-static int
|
||||
-testHashRemoveForEachForbidden(void *payload ATTRIBUTE_UNUSED,
|
||||
- const void *name,
|
||||
- void *data)
|
||||
-{
|
||||
- virHashTablePtr hash = data;
|
||||
- size_t i;
|
||||
-
|
||||
- for (i = 0; i < ARRAY_CARDINALITY(uuids_subset); i++) {
|
||||
- if (STREQ(uuids_subset[i], name)) {
|
||||
- int next = (i + 1) % ARRAY_CARDINALITY(uuids_subset);
|
||||
-
|
||||
- if (virHashRemoveEntry(hash, uuids_subset[next]) == 0) {
|
||||
- VIR_TEST_VERBOSE(
|
||||
- "\nentry \"%s\" should not be allowed to be removed",
|
||||
- uuids_subset[next]);
|
||||
- }
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-
|
||||
static int
|
||||
testHashRemoveForEach(const void *data)
|
||||
{
|
||||
@@ -303,61 +277,6 @@ testHashSteal(const void *data ATTRIBUTE_UNUSED)
|
||||
}
|
||||
|
||||
|
||||
-static int
|
||||
-testHashIter(void *payload ATTRIBUTE_UNUSED,
|
||||
- const void *name ATTRIBUTE_UNUSED,
|
||||
- void *data ATTRIBUTE_UNUSED)
|
||||
-{
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int
|
||||
-testHashForEachIter(void *payload ATTRIBUTE_UNUSED,
|
||||
- const void *name ATTRIBUTE_UNUSED,
|
||||
- void *data)
|
||||
-{
|
||||
- virHashTablePtr hash = data;
|
||||
-
|
||||
- if (virHashAddEntry(hash, uuids_new[0], NULL) == 0)
|
||||
- VIR_TEST_VERBOSE("\nadding entries in ForEach should be forbidden");
|
||||
-
|
||||
- if (virHashUpdateEntry(hash, uuids_new[0], NULL) == 0)
|
||||
- VIR_TEST_VERBOSE("\nupdating entries in ForEach should be forbidden");
|
||||
-
|
||||
- if (virHashSteal(hash, uuids_new[0]) != NULL)
|
||||
- VIR_TEST_VERBOSE("\nstealing entries in ForEach should be forbidden");
|
||||
-
|
||||
- if (virHashSteal(hash, uuids_new[0]) != NULL)
|
||||
- VIR_TEST_VERBOSE("\nstealing entries in ForEach should be forbidden");
|
||||
-
|
||||
- if (virHashForEach(hash, testHashIter, NULL) >= 0)
|
||||
- VIR_TEST_VERBOSE("\niterating through hash in ForEach"
|
||||
- " should be forbidden");
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int
|
||||
-testHashForEach(const void *data ATTRIBUTE_UNUSED)
|
||||
-{
|
||||
- virHashTablePtr hash;
|
||||
- int ret = -1;
|
||||
-
|
||||
- if (!(hash = testHashInit(0)))
|
||||
- return -1;
|
||||
-
|
||||
- if (virHashForEach(hash, testHashForEachIter, hash)) {
|
||||
- VIR_TEST_VERBOSE("\nvirHashForEach didn't go through all entries");
|
||||
- goto cleanup;
|
||||
- }
|
||||
-
|
||||
- ret = 0;
|
||||
-
|
||||
- cleanup:
|
||||
- virHashFree(hash);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-
|
||||
static int
|
||||
testHashRemoveSetIter(const void *payload ATTRIBUTE_UNUSED,
|
||||
const void *name,
|
||||
@@ -628,9 +547,7 @@ mymain(void)
|
||||
DO_TEST("Remove", Remove);
|
||||
DO_TEST_DATA("Remove in ForEach", RemoveForEach, Some);
|
||||
DO_TEST_DATA("Remove in ForEach", RemoveForEach, All);
|
||||
- DO_TEST_DATA("Remove in ForEach", RemoveForEach, Forbidden);
|
||||
DO_TEST("Steal", Steal);
|
||||
- DO_TEST("Forbidden ops in ForEach", ForEach);
|
||||
DO_TEST("RemoveSet", RemoveSet);
|
||||
DO_TEST("Search", Search);
|
||||
DO_TEST("GetItems", GetItems);
|
||||
@@ -0,0 +1,64 @@
|
||||
From: Matthias Bolte <matthias.bolte@googlemail.com>
|
||||
Date: Thu, 2 Aug 2018 17:33:37 +0200
|
||||
Subject: [PATCH] esx: Fix double-free and freeing static strings in
|
||||
esxDomainSetAutostart
|
||||
|
||||
Since commit ae83e02f3dd7fe99fed5d8159a35b666fafeafd5#l3393 the
|
||||
newPowerInfo pointer itself is used to track the ownership of the
|
||||
AutoStartPowerInfo object to make Coverity understand the code better.
|
||||
This broke the code that unset some members of the AutoStartPowerInfo
|
||||
object that should not be freed the normal way.
|
||||
|
||||
Instead, transfer ownership of the AutoStartPowerInfo object to the
|
||||
HostAutoStartManagerConfig object before filling in the values that
|
||||
need special handling. This allows to free the AutoStartPowerInfo
|
||||
directly without having to deal with the special values, or to let
|
||||
the old (now restored) logic handle the special values again.
|
||||
|
||||
Signed-off-by: Matthias Bolte <matthias.bolte@googlemail.com>
|
||||
Tested-by: Marcos Paulo de Souza <marcos.souza.org@gmail.com>
|
||||
Reviewed-by: John Ferlan <jferlan@redhat.com>
|
||||
(cherry picked from commit 3ad77f853230f870efa396636e008292c7f2b1c0)
|
||||
---
|
||||
src/esx/esx_driver.c | 14 ++++----------
|
||||
1 file changed, 4 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
|
||||
index b065cdc513..9a7006c6e5 100644
|
||||
--- a/src/esx/esx_driver.c
|
||||
+++ b/src/esx/esx_driver.c
|
||||
@@ -3422,7 +3422,10 @@ esxDomainSetAutostart(virDomainPtr domain, int autostart)
|
||||
if (esxVI_AutoStartPowerInfo_Alloc(&newPowerInfo) < 0 ||
|
||||
esxVI_Int_Alloc(&newPowerInfo->startOrder) < 0 ||
|
||||
esxVI_Int_Alloc(&newPowerInfo->startDelay) < 0 ||
|
||||
- esxVI_Int_Alloc(&newPowerInfo->stopDelay) < 0) {
|
||||
+ esxVI_Int_Alloc(&newPowerInfo->stopDelay) < 0 ||
|
||||
+ esxVI_AutoStartPowerInfo_AppendToList(&spec->powerInfo,
|
||||
+ newPowerInfo) < 0) {
|
||||
+ esxVI_AutoStartPowerInfo_Free(&newPowerInfo);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -3434,13 +3437,6 @@ esxDomainSetAutostart(virDomainPtr domain, int autostart)
|
||||
newPowerInfo->stopDelay->value = -1; /* use system default */
|
||||
newPowerInfo->stopAction = (char *)"none";
|
||||
|
||||
- if (esxVI_AutoStartPowerInfo_AppendToList(&spec->powerInfo,
|
||||
- newPowerInfo) < 0) {
|
||||
- goto cleanup;
|
||||
- }
|
||||
-
|
||||
- newPowerInfo = NULL;
|
||||
-
|
||||
if (esxVI_ReconfigureAutostart
|
||||
(priv->primary,
|
||||
priv->primary->hostSystem->configManager->autoStartManager,
|
||||
@@ -3462,8 +3458,6 @@ esxDomainSetAutostart(virDomainPtr domain, int autostart)
|
||||
esxVI_AutoStartDefaults_Free(&defaults);
|
||||
esxVI_AutoStartPowerInfo_Free(&powerInfoList);
|
||||
|
||||
- esxVI_AutoStartPowerInfo_Free(&newPowerInfo);
|
||||
-
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 29 Mar 2017 13:33:50 +0200
|
||||
Subject: [PATCH] qemu: Add migratable parameter to virQEMUCapsInitCPUModel
|
||||
|
||||
The caller can ask for a migratable CPU model by passing true for the
|
||||
new parameter.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 00e0cbcb567a57c7b5a145d7fd3fb662779f6bec)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 36 +++++++++++++++++++++++++-----------
|
||||
src/qemu/qemu_capspriv.h | 3 ++-
|
||||
tests/cputest.c | 2 +-
|
||||
3 files changed, 28 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 1a15750a3..b8e4e47b6 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -3112,7 +3112,8 @@ virQEMUCapsCPUFilterFeatures(const char *name,
|
||||
static int
|
||||
virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
|
||||
qemuMonitorCPUModelInfoPtr modelInfo,
|
||||
- virCPUDefPtr cpu)
|
||||
+ virCPUDefPtr cpu,
|
||||
+ bool migratable)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
@@ -3140,8 +3141,12 @@ virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
|
||||
|
||||
if (VIR_STRDUP(feature->name, prop->name) < 0)
|
||||
return -1;
|
||||
- feature->policy = prop->value.boolean ? VIR_CPU_FEATURE_REQUIRE
|
||||
- : VIR_CPU_FEATURE_DISABLE;
|
||||
+
|
||||
+ if (!prop->value.boolean ||
|
||||
+ (migratable && prop->migratable == VIR_TRISTATE_BOOL_NO))
|
||||
+ feature->policy = VIR_CPU_FEATURE_DISABLE;
|
||||
+ else
|
||||
+ feature->policy = VIR_CPU_FEATURE_REQUIRE;
|
||||
cpu->nfeatures++;
|
||||
}
|
||||
|
||||
@@ -3158,7 +3163,8 @@ static int
|
||||
virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
qemuMonitorCPUModelInfoPtr model,
|
||||
- virCPUDefPtr cpu)
|
||||
+ virCPUDefPtr cpu,
|
||||
+ bool migratable)
|
||||
{
|
||||
virCPUDataPtr data = NULL;
|
||||
unsigned long long sigFamily = 0;
|
||||
@@ -3179,9 +3185,13 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
|
||||
|
||||
switch (prop->type) {
|
||||
case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN:
|
||||
- if (prop->value.boolean &&
|
||||
- virCPUx86DataAddFeature(data, prop->name) < 0)
|
||||
+ if (!prop->value.boolean ||
|
||||
+ (migratable && prop->migratable == VIR_TRISTATE_BOOL_NO))
|
||||
+ continue;
|
||||
+
|
||||
+ if (virCPUx86DataAddFeature(data, prop->name) < 0)
|
||||
goto cleanup;
|
||||
+
|
||||
break;
|
||||
|
||||
case QEMU_MONITOR_CPU_PROPERTY_STRING:
|
||||
@@ -3220,13 +3230,14 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
|
||||
|
||||
/**
|
||||
* Returns 0 when host CPU model provided by QEMU was filled in qemuCaps,
|
||||
- * 1 when the caller should fall back to using virCapsPtr->host.cpu,
|
||||
+ * 1 when the caller should fall back to other methods
|
||||
* -1 on error.
|
||||
*/
|
||||
int
|
||||
virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
- virCPUDefPtr cpu)
|
||||
+ virCPUDefPtr cpu,
|
||||
+ bool migratable)
|
||||
{
|
||||
qemuMonitorCPUModelInfoPtr model;
|
||||
int ret = 1;
|
||||
@@ -3236,10 +3247,13 @@ virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
else
|
||||
model = qemuCaps->tcgCPUModelInfo;
|
||||
|
||||
+ if (migratable && model && !model->migratability)
|
||||
+ return 1;
|
||||
+
|
||||
if (ARCH_IS_S390(qemuCaps->arch))
|
||||
- ret = virQEMUCapsInitCPUModelS390(qemuCaps, model, cpu);
|
||||
+ ret = virQEMUCapsInitCPUModelS390(qemuCaps, model, cpu, migratable);
|
||||
else if (ARCH_IS_X86(qemuCaps->arch))
|
||||
- ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, model, cpu);
|
||||
+ ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, model, cpu, migratable);
|
||||
|
||||
if (ret == 0)
|
||||
cpu->fallback = VIR_CPU_FALLBACK_FORBID;
|
||||
@@ -3268,7 +3282,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
cpu->match = VIR_CPU_MATCH_EXACT;
|
||||
cpu->fallback = VIR_CPU_FALLBACK_ALLOW;
|
||||
|
||||
- if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu)) < 0) {
|
||||
+ if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) {
|
||||
goto error;
|
||||
} else if (rc == 1) {
|
||||
VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly");
|
||||
diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h
|
||||
index 61ccd4517..1baaaf334 100644
|
||||
--- a/src/qemu/qemu_capspriv.h
|
||||
+++ b/src/qemu/qemu_capspriv.h
|
||||
@@ -81,7 +81,8 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
int
|
||||
virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
- virCPUDefPtr cpu);
|
||||
+ virCPUDefPtr cpu,
|
||||
+ bool migratable);
|
||||
|
||||
void
|
||||
virQEMUCapsSetCPUModelInfo(virQEMUCapsPtr qemuCaps,
|
||||
diff --git a/tests/cputest.c b/tests/cputest.c
|
||||
index 3d3e43f16..8c07cf4f6 100644
|
||||
--- a/tests/cputest.c
|
||||
+++ b/tests/cputest.c
|
||||
@@ -709,7 +709,7 @@ cpuTestJSONCPUID(const void *arg)
|
||||
cpu->match = VIR_CPU_MATCH_EXACT;
|
||||
cpu->fallback = VIR_CPU_FALLBACK_FORBID;
|
||||
|
||||
- if (virQEMUCapsInitCPUModel(qemuCaps, VIR_DOMAIN_VIRT_KVM, cpu) != 0)
|
||||
+ if (virQEMUCapsInitCPUModel(qemuCaps, VIR_DOMAIN_VIRT_KVM, cpu, false) != 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = cpuTestCompareXML(data->arch, cpu, result, false);
|
||||
@@ -0,0 +1,55 @@
|
||||
From 8d6ab7976fa691763fc05a154f2bab865d435b00 Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 5 Apr 2019 11:33:32 +0200
|
||||
Subject: [PATCH 1/4] cpu_x86: Do not cache microcode version
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The microcode version checks are used to invalidate cached CPU data we
|
||||
get from QEMU. To minimize /proc/cpuinfo parsing the microcode version
|
||||
was only read when libvirtd started and cached for the daemon's
|
||||
lifetime. However, the CPU microcode can change anytime (updating the
|
||||
microcode package can automatically upload it to the CPU) and we need to
|
||||
stop caching it to avoid using stale CPU model data.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit be46f613261d3b655a1f15afd635087e68a9c39b)
|
||||
---
|
||||
src/cpu/cpu_x86.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index b2398c5ad2..38cab15c59 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -154,7 +154,6 @@ struct _virCPUx86Map {
|
||||
};
|
||||
|
||||
static virCPUx86MapPtr cpuMap;
|
||||
-static unsigned int microcodeVersion;
|
||||
|
||||
int virCPUx86DriverOnceInit(void);
|
||||
VIR_ONCE_GLOBAL_INIT(virCPUx86Driver);
|
||||
@@ -1413,8 +1412,6 @@ virCPUx86DriverOnceInit(void)
|
||||
if (!(cpuMap = virCPUx86LoadMap()))
|
||||
return -1;
|
||||
|
||||
- microcodeVersion = virHostCPUGetMicrocodeVersion();
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2454,7 +2451,7 @@ virCPUx86GetHost(virCPUDefPtr cpu,
|
||||
goto cleanup;
|
||||
|
||||
ret = x86DecodeCPUData(cpu, cpuData, models);
|
||||
- cpu->microcodeVersion = microcodeVersion;
|
||||
+ cpu->microcodeVersion = virHostCPUGetMicrocodeVersion();
|
||||
|
||||
cleanup:
|
||||
virCPUx86DataFree(cpuData);
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 7 Apr 2017 17:03:38 +0200
|
||||
Subject: [PATCH] qemu: Introduce virQEMUCapsSetHostModel
|
||||
|
||||
A simple helper as a complement to virQEMUCapsGetHostModel.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit bffc3b9fe501ff122ad81ddf42ecdb69f70ff70a)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 17 +++++++++++++----
|
||||
1 file changed, 13 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index b8e4e47b6..f6020b86d 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -2419,6 +2419,18 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
}
|
||||
|
||||
|
||||
+static void
|
||||
+virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
+ virDomainVirtType type,
|
||||
+ virCPUDefPtr cpu)
|
||||
+{
|
||||
+ if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
+ qemuCaps->kvmCPUModel = cpu;
|
||||
+ else
|
||||
+ qemuCaps->tcgCPUModel = cpu;
|
||||
+}
|
||||
+
|
||||
+
|
||||
bool
|
||||
virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
|
||||
virCapsPtr caps,
|
||||
@@ -3295,10 +3307,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
goto error;
|
||||
}
|
||||
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- qemuCaps->kvmCPUModel = cpu;
|
||||
- else
|
||||
- qemuCaps->tcgCPUModel = cpu;
|
||||
+ virQEMUCapsSetHostModel(qemuCaps, type, cpu);
|
||||
|
||||
cleanup:
|
||||
virCPUDefFree(hostCPU);
|
||||
@@ -0,0 +1,155 @@
|
||||
From cb6bcb0312a33a0b6a48d0ee1f368c9080e4a13d Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 12 Apr 2019 21:21:05 +0200
|
||||
Subject: [PATCH 2/4] qemu: Don't cache microcode version
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
My earlier commit be46f61326 was incomplete. It removed caching of
|
||||
microcode version in the CPU driver, which means the capabilities XML
|
||||
will see the correct microcode version. But it is also cached in the
|
||||
QEMU capabilities cache where it is used to detect whether we need to
|
||||
reprobe QEMU. By missing the second place, the original commit
|
||||
be46f61326 made the situation even worse since libvirt would report
|
||||
correct microcode version while still using the old host CPU model
|
||||
(visible in domain capabilities XML).
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
(cherry picked from commit 673c62a3b7855a0685d8f116e227c402720b9ee9)
|
||||
|
||||
CVE-2018-12126, CVE-2018-12127, CVE-2018-12130
|
||||
|
||||
Conflicts:
|
||||
src/qemu/qemu_capabilities.c
|
||||
- virQEMUCapsCacheLookupByArch refactoring (commits
|
||||
7948ad4129a and 1a3de67001c) are missing
|
||||
- commit a7424faff0f "Force QMP capability probing" is
|
||||
missing downstream
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 12 ++++++++----
|
||||
src/qemu/qemu_capabilities.h | 3 +--
|
||||
src/qemu/qemu_driver.c | 9 +--------
|
||||
tests/testutilsqemu.c | 2 +-
|
||||
4 files changed, 11 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index b5eb8cf46a..17eb6579bf 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -5343,7 +5343,7 @@ virQEMUCapsNewData(const char *binary,
|
||||
priv->libDir,
|
||||
priv->runUid,
|
||||
priv->runGid,
|
||||
- priv->microcodeVersion,
|
||||
+ virHostCPUGetMicrocodeVersion(),
|
||||
priv->kernelVersion,
|
||||
false);
|
||||
}
|
||||
@@ -5427,8 +5427,7 @@ virFileCachePtr
|
||||
virQEMUCapsCacheNew(const char *libDir,
|
||||
const char *cacheDir,
|
||||
uid_t runUid,
|
||||
- gid_t runGid,
|
||||
- unsigned int microcodeVersion)
|
||||
+ gid_t runGid)
|
||||
{
|
||||
char *capsCacheDir = NULL;
|
||||
virFileCachePtr cache = NULL;
|
||||
@@ -5452,7 +5451,6 @@ virQEMUCapsCacheNew(const char *libDir,
|
||||
|
||||
priv->runUid = runUid;
|
||||
priv->runGid = runGid;
|
||||
- priv->microcodeVersion = microcodeVersion;
|
||||
|
||||
if (uname(&uts) == 0 &&
|
||||
virAsprintf(&priv->kernelVersion, "%s %s", uts.release, uts.version) < 0)
|
||||
@@ -5473,8 +5471,11 @@ virQEMUCapsPtr
|
||||
virQEMUCapsCacheLookup(virFileCachePtr cache,
|
||||
const char *binary)
|
||||
{
|
||||
+ virQEMUCapsCachePrivPtr priv = virFileCacheGetPriv(cache);
|
||||
virQEMUCapsPtr ret = NULL;
|
||||
|
||||
+ priv->microcodeVersion = virHostCPUGetMicrocodeVersion();
|
||||
+
|
||||
ret = virFileCacheLookup(cache, binary);
|
||||
|
||||
VIR_DEBUG("Returning caps %p for %s", ret, binary);
|
||||
@@ -5520,10 +5521,13 @@ virQEMUCapsPtr
|
||||
virQEMUCapsCacheLookupByArch(virFileCachePtr cache,
|
||||
virArch arch)
|
||||
{
|
||||
+ virQEMUCapsCachePrivPtr priv = virFileCacheGetPriv(cache);
|
||||
virQEMUCapsPtr ret = NULL;
|
||||
virArch target;
|
||||
struct virQEMUCapsSearchData data = { .arch = arch };
|
||||
|
||||
+ priv->microcodeVersion = virHostCPUGetMicrocodeVersion();
|
||||
+
|
||||
ret = virFileCacheLookupByFunc(cache, virQEMUCapsCompareArch, &data);
|
||||
if (!ret) {
|
||||
/* If the first attempt at finding capabilities has failed, try
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index c2ec2be193..7fd51f5fa0 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -524,8 +524,7 @@ void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
|
||||
virFileCachePtr virQEMUCapsCacheNew(const char *libDir,
|
||||
const char *cacheDir,
|
||||
uid_t uid,
|
||||
- gid_t gid,
|
||||
- unsigned int microcodeVersion);
|
||||
+ gid_t gid);
|
||||
virQEMUCapsPtr virQEMUCapsCacheLookup(virFileCachePtr cache,
|
||||
const char *binary);
|
||||
virQEMUCapsPtr virQEMUCapsCacheLookupCopy(virFileCachePtr cache,
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index 96454c17c0..bb38904090 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -610,8 +610,6 @@ qemuStateInitialize(bool privileged,
|
||||
char *hugepagePath = NULL;
|
||||
char *memoryBackingPath = NULL;
|
||||
size_t i;
|
||||
- virCPUDefPtr hostCPU = NULL;
|
||||
- unsigned int microcodeVersion = 0;
|
||||
|
||||
if (VIR_ALLOC(qemu_driver) < 0)
|
||||
return -1;
|
||||
@@ -831,15 +829,10 @@ qemuStateInitialize(bool privileged,
|
||||
run_gid = cfg->group;
|
||||
}
|
||||
|
||||
- if ((hostCPU = virCPUProbeHost(virArchFromHost())))
|
||||
- microcodeVersion = hostCPU->microcodeVersion;
|
||||
- virCPUDefFree(hostCPU);
|
||||
-
|
||||
qemu_driver->qemuCapsCache = virQEMUCapsCacheNew(cfg->libDir,
|
||||
cfg->cacheDir,
|
||||
run_uid,
|
||||
- run_gid,
|
||||
- microcodeVersion);
|
||||
+ run_gid);
|
||||
if (!qemu_driver->qemuCapsCache)
|
||||
goto error;
|
||||
|
||||
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
|
||||
index f8182033fc..2c7124bf26 100644
|
||||
--- a/tests/testutilsqemu.c
|
||||
+++ b/tests/testutilsqemu.c
|
||||
@@ -603,7 +603,7 @@ int qemuTestDriverInit(virQEMUDriver *driver)
|
||||
|
||||
/* Using /dev/null for libDir and cacheDir automatically produces errors
|
||||
* upon attempt to use any of them */
|
||||
- driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0, 0);
|
||||
+ driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0);
|
||||
if (!driver->qemuCapsCache)
|
||||
goto error;
|
||||
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 7 Apr 2017 17:40:31 +0200
|
||||
Subject: [PATCH] qemu: Move qemuCaps CPU data copying into a separate function
|
||||
|
||||
This introduces virQEMUCapsHostCPUDataCopy which will later be
|
||||
refactored a bit and called twice from virQEMUCapsNewCopy.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 8be4346ca5ae4b568b3e8ce3de9cf46f2e94b416)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 39 +++++++++++++++++++++++++--------------
|
||||
1 file changed, 25 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index f6020b86d..d17e0e8b8 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -2082,6 +2082,30 @@ virQEMUCapsNew(void)
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virQEMUCapsHostCPUDataCopy(virQEMUCapsPtr dst,
|
||||
+ virQEMUCapsPtr src)
|
||||
+{
|
||||
+ if (src->kvmCPUModel &&
|
||||
+ !(dst->kvmCPUModel = virCPUDefCopy(src->kvmCPUModel)))
|
||||
+ return -1;
|
||||
+
|
||||
+ if (src->tcgCPUModel &&
|
||||
+ !(dst->tcgCPUModel = virCPUDefCopy(src->tcgCPUModel)))
|
||||
+ return -1;
|
||||
+
|
||||
+ if (src->kvmCPUModelInfo &&
|
||||
+ !(dst->kvmCPUModelInfo = qemuMonitorCPUModelInfoCopy(src->kvmCPUModelInfo)))
|
||||
+ return -1;
|
||||
+
|
||||
+ if (src->tcgCPUModelInfo &&
|
||||
+ !(dst->tcgCPUModelInfo = qemuMonitorCPUModelInfoCopy(src->tcgCPUModelInfo)))
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
|
||||
{
|
||||
virQEMUCapsPtr ret = virQEMUCapsNew();
|
||||
@@ -2119,20 +2143,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
|
||||
goto error;
|
||||
}
|
||||
|
||||
- if (qemuCaps->kvmCPUModel &&
|
||||
- !(ret->kvmCPUModel = virCPUDefCopy(qemuCaps->kvmCPUModel)))
|
||||
- goto error;
|
||||
-
|
||||
- if (qemuCaps->tcgCPUModel &&
|
||||
- !(ret->tcgCPUModel = virCPUDefCopy(qemuCaps->tcgCPUModel)))
|
||||
- goto error;
|
||||
-
|
||||
- if (qemuCaps->kvmCPUModelInfo &&
|
||||
- !(ret->kvmCPUModelInfo = qemuMonitorCPUModelInfoCopy(qemuCaps->kvmCPUModelInfo)))
|
||||
- goto error;
|
||||
-
|
||||
- if (qemuCaps->tcgCPUModelInfo &&
|
||||
- !(ret->tcgCPUModelInfo = qemuMonitorCPUModelInfoCopy(qemuCaps->tcgCPUModelInfo)))
|
||||
+ if (virQEMUCapsHostCPUDataCopy(ret, qemuCaps) < 0)
|
||||
goto error;
|
||||
|
||||
if (VIR_ALLOC_N(ret->machineTypes, qemuCaps->nmachineTypes) < 0)
|
||||
@@ -0,0 +1,886 @@
|
||||
From 36151b10d3e1f8f92f4ad6b8200ce5355b7f96f0 Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 5 Apr 2019 11:19:30 +0200
|
||||
Subject: [PATCH 3/4] cputest: Add data for Intel(R) Xeon(R) CPU E3-1225 v5
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 5cd9db3ac11e88846cbcf95fad9f6fae9d880dee)
|
||||
|
||||
CVE-2018-12126, CVE-2018-12127, CVE-2018-12130, CVE-2019-11091
|
||||
|
||||
Conflicts:
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
- intel-pt feature is missing
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
tests/cputest.c | 1 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5-disabled.xml | 7 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml | 8 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5-guest.xml | 27 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5-host.xml | 28 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5-json.xml | 11 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5.json | 652 ++++++++++++++++++
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5.sig | 4 +
|
||||
.../x86_64-cpuid-Xeon-E3-1225-v5.xml | 47 ++
|
||||
9 files changed, 785 insertions(+)
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-disabled.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.json
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.sig
|
||||
create mode 100644 tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.xml
|
||||
|
||||
diff --git a/tests/cputest.c b/tests/cputest.c
|
||||
index 1e79edbef7..2df1d28e39 100644
|
||||
--- a/tests/cputest.c
|
||||
+++ b/tests/cputest.c
|
||||
@@ -1189,6 +1189,7 @@ mymain(void)
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Phenom-B95", JSON_HOST);
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Ryzen-7-1800X-Eight-Core", JSON_HOST);
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-5110", JSON_NONE);
|
||||
+ DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-E3-1225-v5", JSON_MODELS);
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-E3-1245-v5", JSON_MODELS);
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-E5-2609-v3", JSON_MODELS);
|
||||
DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-E5-2623-v4", JSON_MODELS);
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-disabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-disabled.xml
|
||||
new file mode 100644
|
||||
index 0000000000..ce51903e53
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-disabled.xml
|
||||
@@ -0,0 +1,7 @@
|
||||
+<!-- Features disabled by QEMU -->
|
||||
+<cpudata arch='x86'>
|
||||
+ <cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x0800c1fc' edx='0xb0600000'/>
|
||||
+ <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0x02000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x01' eax='0x00000008' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000007' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000100'/>
|
||||
+</cpudata>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml
|
||||
new file mode 100644
|
||||
index 0000000000..0deca9fba6
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml
|
||||
@@ -0,0 +1,8 @@
|
||||
+<!-- Features enabled by QEMU -->
|
||||
+<cpudata arch='x86'>
|
||||
+ <cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0xf7fa3203' edx='0x0f8bfbff'/>
|
||||
+ <cpuid eax_in='0x00000006' ecx_in='0x00' eax='0x00000004' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0x009c4fbb' ecx='0x00000000' edx='0x8c000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x01' eax='0x00000007' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000121' edx='0x2c100800'/>
|
||||
+</cpudata>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
new file mode 100644
|
||||
index 0000000000..141c01c841
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
@@ -0,0 +1,27 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='forbid'>Skylake-Client-IBRS</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ds'/>
|
||||
+ <feature policy='require' name='acpi'/>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='ht'/>
|
||||
+ <feature policy='require' name='tm'/>
|
||||
+ <feature policy='require' name='pbe'/>
|
||||
+ <feature policy='require' name='dtes64'/>
|
||||
+ <feature policy='require' name='monitor'/>
|
||||
+ <feature policy='require' name='ds_cpl'/>
|
||||
+ <feature policy='require' name='vmx'/>
|
||||
+ <feature policy='require' name='smx'/>
|
||||
+ <feature policy='require' name='est'/>
|
||||
+ <feature policy='require' name='tm2'/>
|
||||
+ <feature policy='require' name='xtpr'/>
|
||||
+ <feature policy='require' name='pdcm'/>
|
||||
+ <feature policy='require' name='osxsave'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='clflushopt'/>
|
||||
+ <feature policy='require' name='stibp'/>
|
||||
+ <feature policy='require' name='ssbd'/>
|
||||
+ <feature policy='require' name='xsaves'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+ <feature policy='require' name='invtsc'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
new file mode 100644
|
||||
index 0000000000..53bfc9728d
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
@@ -0,0 +1,28 @@
|
||||
+<cpu>
|
||||
+ <arch>x86_64</arch>
|
||||
+ <model>Skylake-Client-IBRS</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature name='ds'/>
|
||||
+ <feature name='acpi'/>
|
||||
+ <feature name='ss'/>
|
||||
+ <feature name='ht'/>
|
||||
+ <feature name='tm'/>
|
||||
+ <feature name='pbe'/>
|
||||
+ <feature name='dtes64'/>
|
||||
+ <feature name='monitor'/>
|
||||
+ <feature name='ds_cpl'/>
|
||||
+ <feature name='vmx'/>
|
||||
+ <feature name='smx'/>
|
||||
+ <feature name='est'/>
|
||||
+ <feature name='tm2'/>
|
||||
+ <feature name='xtpr'/>
|
||||
+ <feature name='pdcm'/>
|
||||
+ <feature name='osxsave'/>
|
||||
+ <feature name='tsc_adjust'/>
|
||||
+ <feature name='clflushopt'/>
|
||||
+ <feature name='stibp'/>
|
||||
+ <feature name='ssbd'/>
|
||||
+ <feature name='xsaves'/>
|
||||
+ <feature name='pdpe1gb'/>
|
||||
+ <feature name='invtsc'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
new file mode 100644
|
||||
index 0000000000..1f321db273
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
@@ -0,0 +1,11 @@
|
||||
+<cpu mode='custom' match='exact'>
|
||||
+ <model fallback='forbid'>Skylake-Client-IBRS</model>
|
||||
+ <vendor>Intel</vendor>
|
||||
+ <feature policy='require' name='ss'/>
|
||||
+ <feature policy='require' name='hypervisor'/>
|
||||
+ <feature policy='require' name='tsc_adjust'/>
|
||||
+ <feature policy='require' name='clflushopt'/>
|
||||
+ <feature policy='require' name='stibp'/>
|
||||
+ <feature policy='require' name='ssbd'/>
|
||||
+ <feature policy='require' name='pdpe1gb'/>
|
||||
+</cpu>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.json b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.json
|
||||
new file mode 100644
|
||||
index 0000000000..084747556b
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.json
|
||||
@@ -0,0 +1,652 @@
|
||||
+{
|
||||
+ "return": {
|
||||
+ "model": {
|
||||
+ "name": "base",
|
||||
+ "props": {
|
||||
+ "phys-bits": 0,
|
||||
+ "core-id": -1,
|
||||
+ "xlevel": 2147483656,
|
||||
+ "cmov": true,
|
||||
+ "ia64": false,
|
||||
+ "aes": true,
|
||||
+ "mmx": true,
|
||||
+ "rdpid": false,
|
||||
+ "arat": true,
|
||||
+ "gfni": false,
|
||||
+ "pause-filter": false,
|
||||
+ "xsavec": true,
|
||||
+ "intel-pt": false,
|
||||
+ "osxsave": false,
|
||||
+ "hv-frequencies": false,
|
||||
+ "tsc-frequency": 0,
|
||||
+ "xd": true,
|
||||
+ "hv-vendor-id": "",
|
||||
+ "kvm-asyncpf": true,
|
||||
+ "kvm_asyncpf": true,
|
||||
+ "perfctr_core": false,
|
||||
+ "perfctr-core": false,
|
||||
+ "mpx": true,
|
||||
+ "pbe": false,
|
||||
+ "decodeassists": false,
|
||||
+ "avx512cd": false,
|
||||
+ "sse4_1": true,
|
||||
+ "sse4.1": true,
|
||||
+ "sse4-1": true,
|
||||
+ "family": 6,
|
||||
+ "legacy-cache": true,
|
||||
+ "vmware-cpuid-freq": true,
|
||||
+ "avx512f": false,
|
||||
+ "msr": true,
|
||||
+ "mce": true,
|
||||
+ "mca": true,
|
||||
+ "hv-runtime": false,
|
||||
+ "xcrypt": false,
|
||||
+ "thread-id": -1,
|
||||
+ "min-level": 13,
|
||||
+ "xgetbv1": true,
|
||||
+ "cid": false,
|
||||
+ "hv-relaxed": false,
|
||||
+ "hv-crash": false,
|
||||
+ "ds": false,
|
||||
+ "fxsr": true,
|
||||
+ "xsaveopt": true,
|
||||
+ "xtpr": false,
|
||||
+ "avx512vl": false,
|
||||
+ "avx512-vpopcntdq": false,
|
||||
+ "phe": false,
|
||||
+ "extapic": false,
|
||||
+ "3dnowprefetch": true,
|
||||
+ "avx512vbmi2": false,
|
||||
+ "cr8legacy": false,
|
||||
+ "stibp": true,
|
||||
+ "cpuid-0xb": true,
|
||||
+ "xcrypt-en": false,
|
||||
+ "kvm_pv_eoi": true,
|
||||
+ "apic-id": 4294967295,
|
||||
+ "pn": false,
|
||||
+ "dca": false,
|
||||
+ "vendor": "GenuineIntel",
|
||||
+ "pku": false,
|
||||
+ "smx": false,
|
||||
+ "cmp_legacy": false,
|
||||
+ "cmp-legacy": false,
|
||||
+ "node-id": -1,
|
||||
+ "avx512-4fmaps": false,
|
||||
+ "vmcb_clean": false,
|
||||
+ "vmcb-clean": false,
|
||||
+ "3dnowext": false,
|
||||
+ "hle": true,
|
||||
+ "npt": false,
|
||||
+ "memory": "/machine/unattached/system[0]",
|
||||
+ "clwb": false,
|
||||
+ "lbrv": false,
|
||||
+ "adx": true,
|
||||
+ "ss": true,
|
||||
+ "pni": true,
|
||||
+ "svm_lock": false,
|
||||
+ "svm-lock": false,
|
||||
+ "pfthreshold": false,
|
||||
+ "smep": true,
|
||||
+ "smap": true,
|
||||
+ "x2apic": true,
|
||||
+ "avx512vbmi": false,
|
||||
+ "avx512vnni": false,
|
||||
+ "hv-stimer": false,
|
||||
+ "i64": true,
|
||||
+ "flushbyasid": false,
|
||||
+ "f16c": true,
|
||||
+ "ace2-en": false,
|
||||
+ "pat": true,
|
||||
+ "pae": true,
|
||||
+ "sse": true,
|
||||
+ "phe-en": false,
|
||||
+ "kvm_nopiodelay": true,
|
||||
+ "kvm-nopiodelay": true,
|
||||
+ "tm": false,
|
||||
+ "kvmclock-stable-bit": true,
|
||||
+ "hypervisor": true,
|
||||
+ "socket-id": -1,
|
||||
+ "pcommit": false,
|
||||
+ "syscall": true,
|
||||
+ "level": 13,
|
||||
+ "avx512dq": false,
|
||||
+ "svm": false,
|
||||
+ "full-cpuid-auto-level": true,
|
||||
+ "hv-reset": false,
|
||||
+ "invtsc": false,
|
||||
+ "sse3": true,
|
||||
+ "sse2": true,
|
||||
+ "ssbd": true,
|
||||
+ "est": false,
|
||||
+ "avx512ifma": false,
|
||||
+ "tm2": false,
|
||||
+ "kvm-pv-eoi": true,
|
||||
+ "cx8": true,
|
||||
+ "kvm_mmu": false,
|
||||
+ "kvm-mmu": false,
|
||||
+ "sse4_2": true,
|
||||
+ "sse4.2": true,
|
||||
+ "sse4-2": true,
|
||||
+ "pge": true,
|
||||
+ "fill-mtrr-mask": true,
|
||||
+ "avx512bitalg": false,
|
||||
+ "nodeid_msr": false,
|
||||
+ "pdcm": false,
|
||||
+ "movbe": true,
|
||||
+ "model": 94,
|
||||
+ "nrip_save": false,
|
||||
+ "nrip-save": false,
|
||||
+ "kvm_pv_unhalt": true,
|
||||
+ "ssse3": true,
|
||||
+ "sse4a": false,
|
||||
+ "invpcid": true,
|
||||
+ "pdpe1gb": true,
|
||||
+ "tsc-deadline": true,
|
||||
+ "fma": true,
|
||||
+ "cx16": true,
|
||||
+ "de": true,
|
||||
+ "enforce": false,
|
||||
+ "stepping": 3,
|
||||
+ "xsave": true,
|
||||
+ "clflush": true,
|
||||
+ "skinit": false,
|
||||
+ "tsc": true,
|
||||
+ "tce": false,
|
||||
+ "fpu": true,
|
||||
+ "ibs": false,
|
||||
+ "ds_cpl": false,
|
||||
+ "ds-cpl": false,
|
||||
+ "host-phys-bits": true,
|
||||
+ "fma4": false,
|
||||
+ "la57": false,
|
||||
+ "osvw": false,
|
||||
+ "check": true,
|
||||
+ "hv-spinlocks": -1,
|
||||
+ "pmu": false,
|
||||
+ "pmm": false,
|
||||
+ "apic": true,
|
||||
+ "spec-ctrl": true,
|
||||
+ "min-xlevel2": 0,
|
||||
+ "tsc-adjust": true,
|
||||
+ "tsc_adjust": true,
|
||||
+ "kvm-steal-time": true,
|
||||
+ "kvm_steal_time": true,
|
||||
+ "kvmclock": true,
|
||||
+ "l3-cache": true,
|
||||
+ "lwp": false,
|
||||
+ "ibpb": false,
|
||||
+ "xop": false,
|
||||
+ "avx": true,
|
||||
+ "ospke": false,
|
||||
+ "ace2": false,
|
||||
+ "avx512bw": false,
|
||||
+ "acpi": false,
|
||||
+ "hv-vapic": false,
|
||||
+ "fsgsbase": true,
|
||||
+ "ht": false,
|
||||
+ "nx": true,
|
||||
+ "pclmulqdq": true,
|
||||
+ "mmxext": false,
|
||||
+ "vaes": false,
|
||||
+ "popcnt": true,
|
||||
+ "xsaves": false,
|
||||
+ "tcg-cpuid": true,
|
||||
+ "lm": true,
|
||||
+ "umip": false,
|
||||
+ "pse": true,
|
||||
+ "avx2": true,
|
||||
+ "sep": true,
|
||||
+ "pclmuldq": true,
|
||||
+ "virt-ssbd": false,
|
||||
+ "x-hv-max-vps": -1,
|
||||
+ "nodeid-msr": false,
|
||||
+ "md-clear": true,
|
||||
+ "kvm": true,
|
||||
+ "misalignsse": false,
|
||||
+ "min-xlevel": 2147483656,
|
||||
+ "kvm-pv-unhalt": true,
|
||||
+ "bmi2": true,
|
||||
+ "bmi1": true,
|
||||
+ "realized": false,
|
||||
+ "tsc_scale": false,
|
||||
+ "tsc-scale": false,
|
||||
+ "topoext": false,
|
||||
+ "hv-vpindex": false,
|
||||
+ "xlevel2": 0,
|
||||
+ "clflushopt": true,
|
||||
+ "kvm-no-smi-migration": false,
|
||||
+ "monitor": false,
|
||||
+ "avx512er": false,
|
||||
+ "pmm-en": false,
|
||||
+ "pcid": true,
|
||||
+ "3dnow": false,
|
||||
+ "erms": true,
|
||||
+ "lahf-lm": true,
|
||||
+ "lahf_lm": true,
|
||||
+ "vpclmulqdq": false,
|
||||
+ "fxsr-opt": false,
|
||||
+ "hv-synic": false,
|
||||
+ "xstore": false,
|
||||
+ "fxsr_opt": false,
|
||||
+ "kvm-hint-dedicated": false,
|
||||
+ "rtm": true,
|
||||
+ "lmce": true,
|
||||
+ "hv-time": false,
|
||||
+ "perfctr-nb": false,
|
||||
+ "perfctr_nb": false,
|
||||
+ "ffxsr": false,
|
||||
+ "rdrand": true,
|
||||
+ "rdseed": true,
|
||||
+ "avx512-4vnniw": false,
|
||||
+ "vmx": false,
|
||||
+ "vme": true,
|
||||
+ "dtes64": false,
|
||||
+ "mtrr": true,
|
||||
+ "rdtscp": true,
|
||||
+ "pse36": true,
|
||||
+ "kvm-pv-tlb-flush": false,
|
||||
+ "tbm": false,
|
||||
+ "wdt": false,
|
||||
+ "pause_filter": false,
|
||||
+ "sha-ni": false,
|
||||
+ "model-id": "Intel(R) Xeon(R) CPU E3-1225 v5 @ 3.30GHz",
|
||||
+ "abm": true,
|
||||
+ "avx512pf": false,
|
||||
+ "xstore-en": false
|
||||
+ }
|
||||
+ }
|
||||
+ },
|
||||
+ "id": "model-expansion"
|
||||
+}
|
||||
+
|
||||
+{
|
||||
+ "return": [
|
||||
+ {
|
||||
+ "name": "max",
|
||||
+ "typename": "max-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": false
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "host",
|
||||
+ "typename": "host-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": false
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "base",
|
||||
+ "typename": "base-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": true,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "qemu64",
|
||||
+ "typename": "qemu64-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "qemu32",
|
||||
+ "typename": "qemu32-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "phenom",
|
||||
+ "typename": "phenom-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "mmxext",
|
||||
+ "fxsr-opt",
|
||||
+ "3dnowext",
|
||||
+ "3dnow",
|
||||
+ "sse4a",
|
||||
+ "npt"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "pentium3",
|
||||
+ "typename": "pentium3-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "pentium2",
|
||||
+ "typename": "pentium2-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "pentium",
|
||||
+ "typename": "pentium-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "n270",
|
||||
+ "typename": "n270-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "kvm64",
|
||||
+ "typename": "kvm64-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "kvm32",
|
||||
+ "typename": "kvm32-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "cpu64-rhel6",
|
||||
+ "typename": "cpu64-rhel6-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "sse4a"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "coreduo",
|
||||
+ "typename": "coreduo-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "core2duo",
|
||||
+ "typename": "core2duo-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "athlon",
|
||||
+ "typename": "athlon-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "mmxext",
|
||||
+ "3dnowext",
|
||||
+ "3dnow"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Westmere",
|
||||
+ "typename": "Westmere-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Westmere-IBRS",
|
||||
+ "typename": "Westmere-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Skylake-Server",
|
||||
+ "typename": "Skylake-Server-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "avx512f",
|
||||
+ "avx512dq",
|
||||
+ "clwb",
|
||||
+ "avx512cd",
|
||||
+ "avx512bw",
|
||||
+ "avx512vl",
|
||||
+ "avx512f",
|
||||
+ "avx512f",
|
||||
+ "avx512f"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Skylake-Server-IBRS",
|
||||
+ "typename": "Skylake-Server-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "avx512f",
|
||||
+ "avx512dq",
|
||||
+ "clwb",
|
||||
+ "avx512cd",
|
||||
+ "avx512bw",
|
||||
+ "avx512vl",
|
||||
+ "avx512f",
|
||||
+ "avx512f",
|
||||
+ "avx512f"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Skylake-Client",
|
||||
+ "typename": "Skylake-Client-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Skylake-Client-IBRS",
|
||||
+ "typename": "Skylake-Client-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "SandyBridge",
|
||||
+ "typename": "SandyBridge-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "SandyBridge-IBRS",
|
||||
+ "typename": "SandyBridge-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Penryn",
|
||||
+ "typename": "Penryn-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Opteron_G5",
|
||||
+ "typename": "Opteron_G5-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "sse4a",
|
||||
+ "misalignsse",
|
||||
+ "xop",
|
||||
+ "fma4",
|
||||
+ "tbm"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Opteron_G4",
|
||||
+ "typename": "Opteron_G4-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "sse4a",
|
||||
+ "misalignsse",
|
||||
+ "xop",
|
||||
+ "fma4"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Opteron_G3",
|
||||
+ "typename": "Opteron_G3-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "sse4a",
|
||||
+ "misalignsse"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Opteron_G2",
|
||||
+ "typename": "Opteron_G2-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Opteron_G1",
|
||||
+ "typename": "Opteron_G1-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Nehalem",
|
||||
+ "typename": "Nehalem-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Nehalem-IBRS",
|
||||
+ "typename": "Nehalem-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "IvyBridge",
|
||||
+ "typename": "IvyBridge-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "IvyBridge-IBRS",
|
||||
+ "typename": "IvyBridge-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Haswell",
|
||||
+ "typename": "Haswell-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Haswell-noTSX",
|
||||
+ "typename": "Haswell-noTSX-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Haswell-noTSX-IBRS",
|
||||
+ "typename": "Haswell-noTSX-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Haswell-IBRS",
|
||||
+ "typename": "Haswell-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "EPYC",
|
||||
+ "typename": "EPYC-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "sha-ni",
|
||||
+ "mmxext",
|
||||
+ "fxsr-opt",
|
||||
+ "cr8legacy",
|
||||
+ "sse4a",
|
||||
+ "misalignsse",
|
||||
+ "osvw"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "EPYC-IBPB",
|
||||
+ "typename": "EPYC-IBPB-x86_64-cpu",
|
||||
+ "unavailable-features": [
|
||||
+ "sha-ni",
|
||||
+ "mmxext",
|
||||
+ "fxsr-opt",
|
||||
+ "cr8legacy",
|
||||
+ "sse4a",
|
||||
+ "misalignsse",
|
||||
+ "osvw",
|
||||
+ "ibpb"
|
||||
+ ],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Conroe",
|
||||
+ "typename": "Conroe-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Broadwell",
|
||||
+ "typename": "Broadwell-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Broadwell-noTSX",
|
||||
+ "typename": "Broadwell-noTSX-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Broadwell-noTSX-IBRS",
|
||||
+ "typename": "Broadwell-noTSX-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "Broadwell-IBRS",
|
||||
+ "typename": "Broadwell-IBRS-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "486",
|
||||
+ "typename": "486-x86_64-cpu",
|
||||
+ "unavailable-features": [],
|
||||
+ "static": false,
|
||||
+ "migration-safe": true
|
||||
+ }
|
||||
+ ],
|
||||
+ "id": "definitions"
|
||||
+}
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.sig b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.sig
|
||||
new file mode 100644
|
||||
index 0000000000..7e57c2ded6
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.sig
|
||||
@@ -0,0 +1,4 @@
|
||||
+0506e3
|
||||
+family: 6 (0x06)
|
||||
+model: 94 (0x5e)
|
||||
+stepping: 3 (0x03)
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.xml
|
||||
new file mode 100644
|
||||
index 0000000000..437429d61d
|
||||
--- /dev/null
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5.xml
|
||||
@@ -0,0 +1,47 @@
|
||||
+<!-- Intel(R) Xeon(R) CPU E3-1225 v5 @ 3.30GHz -->
|
||||
+<cpudata arch='x86'>
|
||||
+ <cpuid eax_in='0x00000000' ecx_in='0x00' eax='0x00000016' ebx='0x756e6547' ecx='0x6c65746e' edx='0x49656e69'/>
|
||||
+ <cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x000506e3' ebx='0x06100800' ecx='0x7ffafbff' edx='0xbfebfbff'/>
|
||||
+ <cpuid eax_in='0x00000002' ecx_in='0x00' eax='0x76036301' ebx='0x00f0b6ff' ecx='0x00000000' edx='0x00c30000'/>
|
||||
+ <cpuid eax_in='0x00000003' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000004' ecx_in='0x00' eax='0x1c004121' ebx='0x01c0003f' ecx='0x0000003f' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000004' ecx_in='0x01' eax='0x1c004122' ebx='0x01c0003f' ecx='0x0000003f' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000004' ecx_in='0x02' eax='0x1c004143' ebx='0x00c0003f' ecx='0x000003ff' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000004' ecx_in='0x03' eax='0x1c03c163' ebx='0x03c0003f' ecx='0x00001fff' edx='0x00000006'/>
|
||||
+ <cpuid eax_in='0x00000005' ecx_in='0x00' eax='0x00000040' ebx='0x00000040' ecx='0x00000003' edx='0x00142120'/>
|
||||
+ <cpuid eax_in='0x00000006' ecx_in='0x00' eax='0x000027f7' ebx='0x00000002' ecx='0x00000009' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0x029c6fbf' ecx='0x00000000' edx='0x9c002400'/>
|
||||
+ <cpuid eax_in='0x00000008' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000009' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000a' ecx_in='0x00' eax='0x07300804' ebx='0x00000000' ecx='0x00000000' edx='0x00000603'/>
|
||||
+ <cpuid eax_in='0x0000000b' ecx_in='0x00' eax='0x00000001' ebx='0x00000001' ecx='0x00000100' edx='0x00000006'/>
|
||||
+ <cpuid eax_in='0x0000000b' ecx_in='0x01' eax='0x00000004' ebx='0x00000004' ecx='0x00000201' edx='0x00000006'/>
|
||||
+ <cpuid eax_in='0x0000000c' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x00' eax='0x0000001f' ebx='0x00000440' ecx='0x00000440' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x01' eax='0x0000000f' ebx='0x000003c0' ecx='0x00000100' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x02' eax='0x00000100' ebx='0x00000240' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x03' eax='0x00000040' ebx='0x000003c0' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x04' eax='0x00000040' ebx='0x00000400' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000d' ecx_in='0x08' eax='0x00000080' ebx='0x00000000' ecx='0x00000001' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000e' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x0000000f' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000010' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000011' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000012' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000013' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000014' ecx_in='0x00' eax='0x00000001' ebx='0x0000000f' ecx='0x00000007' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000014' ecx_in='0x01' eax='0x02490002' ebx='0x003f3fff' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000015' ecx_in='0x00' eax='0x00000002' ebx='0x00000114' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x00000016' ecx_in='0x00' eax='0x00000ce4' ebx='0x00000e74' ecx='0x00000064' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000000' ecx_in='0x00' eax='0x80000008' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000121' edx='0x2c100800'/>
|
||||
+ <cpuid eax_in='0x80000002' ecx_in='0x00' eax='0x65746e49' ebx='0x2952286c' ecx='0x6f655820' edx='0x2952286e'/>
|
||||
+ <cpuid eax_in='0x80000003' ecx_in='0x00' eax='0x55504320' ebx='0x2d334520' ecx='0x35323231' edx='0x20357620'/>
|
||||
+ <cpuid eax_in='0x80000004' ecx_in='0x00' eax='0x2e332040' ebx='0x48473033' ecx='0x0000007a' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000005' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000006' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x01006040' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80000007' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000100'/>
|
||||
+ <cpuid eax_in='0x80000008' ecx_in='0x00' eax='0x00003027' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0x80860000' ecx_in='0x00' eax='0x00000ce4' ebx='0x00000e74' ecx='0x00000064' edx='0x00000000'/>
|
||||
+ <cpuid eax_in='0xc0000000' ecx_in='0x00' eax='0x00000ce4' ebx='0x00000e74' ecx='0x00000064' edx='0x00000000'/>
|
||||
+</cpudata>
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 7 Apr 2017 17:43:59 +0200
|
||||
Subject: [PATCH] qemu: Introduce virQEMUCapsHostCPUDataClear
|
||||
|
||||
To keep freeing of host CPU data in one place.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit b0605e848724c5dc478382398b734398abff674c)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 30 +++++++++++++++++-------------
|
||||
1 file changed, 17 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index d17e0e8b8..2da53a60b 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -2106,6 +2106,21 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsPtr dst,
|
||||
}
|
||||
|
||||
|
||||
+static void
|
||||
+virQEMUCapsHostCPUDataClear(virQEMUCapsPtr qemuCaps)
|
||||
+{
|
||||
+ qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo);
|
||||
+ qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo);
|
||||
+ qemuCaps->kvmCPUModelInfo = NULL;
|
||||
+ qemuCaps->tcgCPUModelInfo = NULL;
|
||||
+
|
||||
+ virCPUDefFree(qemuCaps->kvmCPUModel);
|
||||
+ virCPUDefFree(qemuCaps->tcgCPUModel);
|
||||
+ qemuCaps->kvmCPUModel = NULL;
|
||||
+ qemuCaps->tcgCPUModel = NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
|
||||
{
|
||||
virQEMUCapsPtr ret = virQEMUCapsNew();
|
||||
@@ -2192,10 +2207,7 @@ void virQEMUCapsDispose(void *obj)
|
||||
|
||||
VIR_FREE(qemuCaps->gicCapabilities);
|
||||
|
||||
- qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo);
|
||||
- qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo);
|
||||
- virCPUDefFree(qemuCaps->kvmCPUModel);
|
||||
- virCPUDefFree(qemuCaps->tcgCPUModel);
|
||||
+ virQEMUCapsHostCPUDataClear(qemuCaps);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -4068,15 +4080,7 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps)
|
||||
VIR_FREE(qemuCaps->gicCapabilities);
|
||||
qemuCaps->ngicCapabilities = 0;
|
||||
|
||||
- qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo);
|
||||
- qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo);
|
||||
- qemuCaps->kvmCPUModelInfo = NULL;
|
||||
- qemuCaps->tcgCPUModelInfo = NULL;
|
||||
-
|
||||
- virCPUDefFree(qemuCaps->kvmCPUModel);
|
||||
- virCPUDefFree(qemuCaps->tcgCPUModel);
|
||||
- qemuCaps->kvmCPUModel = NULL;
|
||||
- qemuCaps->tcgCPUModel = NULL;
|
||||
+ virQEMUCapsHostCPUDataClear(qemuCaps);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
From 7bde733e906a9eb513448fd58201a333a1793811 Mon Sep 17 00:00:00 2001
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 5 Apr 2019 15:11:20 +0200
|
||||
Subject: [PATCH 4/4] cpu_map: Define md-clear CPUID bit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
CVE-2018-12126, CVE-2018-12127, CVE-2018-12130
|
||||
|
||||
The bit is set when microcode provides the mechanism to invoke a flush
|
||||
of various exploitable CPU buffers by invoking the VERW instruction.
|
||||
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 538d873571d7a682852dc1d70e5f4478f4d64e85)
|
||||
|
||||
Conflicts:
|
||||
src/cpu_map/x86_features.xml
|
||||
- no CPU map split downstream
|
||||
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-Platinum-8268-guest.xml
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-Platinum-8268-host.xml
|
||||
- test data missing downstream
|
||||
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
- intel-pt feature is missing downstream
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
src/cpu/cpu_map.xml | 3 +++
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml | 2 +-
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml | 1 +
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml | 1 +
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml | 1 +
|
||||
5 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
|
||||
index 96daa0f9af..250e241df9 100644
|
||||
--- a/src/cpu/cpu_map.xml
|
||||
+++ b/src/cpu/cpu_map.xml
|
||||
@@ -295,6 +295,9 @@
|
||||
<feature name='avx512-4fmaps'>
|
||||
<cpuid eax_in='0x07' ecx_in='0x00' edx='0x00000008'/>
|
||||
</feature>
|
||||
+ <feature name='md-clear'> <!-- md_clear -->
|
||||
+ <cpuid eax_in='0x07' ecx_in='0x00' edx='0x00000400'/>
|
||||
+ </feature>
|
||||
<feature name='spec-ctrl'>
|
||||
<cpuid eax_in='0x07' ecx_in='0x00' edx='0x04000000'/>
|
||||
</feature>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml
|
||||
index 0deca9fba6..74763a462b 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-enabled.xml
|
||||
@@ -2,7 +2,7 @@
|
||||
<cpudata arch='x86'>
|
||||
<cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0xf7fa3203' edx='0x0f8bfbff'/>
|
||||
<cpuid eax_in='0x00000006' ecx_in='0x00' eax='0x00000004' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
- <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0x009c4fbb' ecx='0x00000000' edx='0x8c000000'/>
|
||||
+ <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0x009c4fbb' ecx='0x00000000' edx='0x8c000400'/>
|
||||
<cpuid eax_in='0x0000000d' ecx_in='0x01' eax='0x00000007' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
|
||||
<cpuid eax_in='0x80000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000121' edx='0x2c100800'/>
|
||||
</cpudata>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
index 141c01c841..3b3472742e 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
@@ -19,6 +19,7 @@
|
||||
<feature policy='require' name='osxsave'/>
|
||||
<feature policy='require' name='tsc_adjust'/>
|
||||
<feature policy='require' name='clflushopt'/>
|
||||
+ <feature policy='require' name='md-clear'/>
|
||||
<feature policy='require' name='stibp'/>
|
||||
<feature policy='require' name='ssbd'/>
|
||||
<feature policy='require' name='xsaves'/>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
index 53bfc9728d..df4f97417c 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
@@ -20,6 +20,7 @@
|
||||
<feature name='osxsave'/>
|
||||
<feature name='tsc_adjust'/>
|
||||
<feature name='clflushopt'/>
|
||||
+ <feature name='md-clear'/>
|
||||
<feature name='stibp'/>
|
||||
<feature name='ssbd'/>
|
||||
<feature name='xsaves'/>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
index 1f321db273..a5591278df 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
@@ -5,6 +5,7 @@
|
||||
<feature policy='require' name='hypervisor'/>
|
||||
<feature policy='require' name='tsc_adjust'/>
|
||||
<feature policy='require' name='clflushopt'/>
|
||||
+ <feature policy='require' name='md-clear'/>
|
||||
<feature policy='require' name='stibp'/>
|
||||
<feature policy='require' name='ssbd'/>
|
||||
<feature policy='require' name='pdpe1gb'/>
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,342 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Fri, 7 Apr 2017 18:15:26 +0200
|
||||
Subject: [PATCH] qemu: Move qemuCaps host CPU data in a struct
|
||||
|
||||
We need to store several CPU related data structure for both KVM and
|
||||
TCG. So instead of keeping two different copies of everything let's
|
||||
make a virQEMUCapsHostCPUData struct and use it twice.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit b0a84ffb7f38f990120c231cfb74956a0ed10d95)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 168 +++++++++++++++++++++----------------------
|
||||
1 file changed, 82 insertions(+), 86 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 2da53a60b..bbb234538 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -373,6 +373,19 @@ struct virQEMUCapsMachineType {
|
||||
unsigned int maxCpus;
|
||||
bool hotplugCpus;
|
||||
};
|
||||
+
|
||||
+typedef struct _virQEMUCapsHostCPUData virQEMUCapsHostCPUData;
|
||||
+typedef virQEMUCapsHostCPUData *virQEMUCapsHostCPUDataPtr;
|
||||
+struct _virQEMUCapsHostCPUData {
|
||||
+ /* Only the "info" part is stored in the capabilities cache, the rest is
|
||||
+ * re-computed from other fields and external data sources everytime we
|
||||
+ * probe QEMU or load the cache.
|
||||
+ */
|
||||
+ qemuMonitorCPUModelInfoPtr info;
|
||||
+ /* Host CPU definition reported in domain capabilities. */
|
||||
+ virCPUDefPtr reported;
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* Update the XML parser/formatter when adding more
|
||||
* information to this struct so that it gets cached
|
||||
@@ -407,15 +420,8 @@ struct _virQEMUCaps {
|
||||
size_t ngicCapabilities;
|
||||
virGICCapability *gicCapabilities;
|
||||
|
||||
- qemuMonitorCPUModelInfoPtr kvmCPUModelInfo;
|
||||
- qemuMonitorCPUModelInfoPtr tcgCPUModelInfo;
|
||||
-
|
||||
- /* Anything below is not stored in the cache since the values are
|
||||
- * re-computed from the other fields or external data sources every
|
||||
- * time we probe QEMU or load the results from the cache.
|
||||
- */
|
||||
- virCPUDefPtr kvmCPUModel;
|
||||
- virCPUDefPtr tcgCPUModel;
|
||||
+ virQEMUCapsHostCPUData kvmCPU;
|
||||
+ virQEMUCapsHostCPUData tcgCPU;
|
||||
};
|
||||
|
||||
struct virQEMUCapsSearchData {
|
||||
@@ -2083,23 +2089,15 @@ virQEMUCapsNew(void)
|
||||
|
||||
|
||||
static int
|
||||
-virQEMUCapsHostCPUDataCopy(virQEMUCapsPtr dst,
|
||||
- virQEMUCapsPtr src)
|
||||
+virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUDataPtr dst,
|
||||
+ virQEMUCapsHostCPUDataPtr src)
|
||||
{
|
||||
- if (src->kvmCPUModel &&
|
||||
- !(dst->kvmCPUModel = virCPUDefCopy(src->kvmCPUModel)))
|
||||
+ if (src->info &&
|
||||
+ !(dst->info = qemuMonitorCPUModelInfoCopy(src->info)))
|
||||
return -1;
|
||||
|
||||
- if (src->tcgCPUModel &&
|
||||
- !(dst->tcgCPUModel = virCPUDefCopy(src->tcgCPUModel)))
|
||||
- return -1;
|
||||
-
|
||||
- if (src->kvmCPUModelInfo &&
|
||||
- !(dst->kvmCPUModelInfo = qemuMonitorCPUModelInfoCopy(src->kvmCPUModelInfo)))
|
||||
- return -1;
|
||||
-
|
||||
- if (src->tcgCPUModelInfo &&
|
||||
- !(dst->tcgCPUModelInfo = qemuMonitorCPUModelInfoCopy(src->tcgCPUModelInfo)))
|
||||
+ if (src->reported &&
|
||||
+ !(dst->reported = virCPUDefCopy(src->reported)))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@@ -2107,17 +2105,12 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsPtr dst,
|
||||
|
||||
|
||||
static void
|
||||
-virQEMUCapsHostCPUDataClear(virQEMUCapsPtr qemuCaps)
|
||||
+virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUDataPtr cpuData)
|
||||
{
|
||||
- qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo);
|
||||
- qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo);
|
||||
- qemuCaps->kvmCPUModelInfo = NULL;
|
||||
- qemuCaps->tcgCPUModelInfo = NULL;
|
||||
-
|
||||
- virCPUDefFree(qemuCaps->kvmCPUModel);
|
||||
- virCPUDefFree(qemuCaps->tcgCPUModel);
|
||||
- qemuCaps->kvmCPUModel = NULL;
|
||||
- qemuCaps->tcgCPUModel = NULL;
|
||||
+ qemuMonitorCPUModelInfoFree(cpuData->info);
|
||||
+ virCPUDefFree(cpuData->reported);
|
||||
+
|
||||
+ memset(cpuData, 0, sizeof(*cpuData));
|
||||
}
|
||||
|
||||
|
||||
@@ -2158,7 +2151,8 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
|
||||
goto error;
|
||||
}
|
||||
|
||||
- if (virQEMUCapsHostCPUDataCopy(ret, qemuCaps) < 0)
|
||||
+ if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 ||
|
||||
+ virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0)
|
||||
goto error;
|
||||
|
||||
if (VIR_ALLOC_N(ret->machineTypes, qemuCaps->nmachineTypes) < 0)
|
||||
@@ -2207,7 +2201,8 @@ void virQEMUCapsDispose(void *obj)
|
||||
|
||||
VIR_FREE(qemuCaps->gicCapabilities);
|
||||
|
||||
- virQEMUCapsHostCPUDataClear(qemuCaps);
|
||||
+ virQEMUCapsHostCPUDataClear(&qemuCaps->kvmCPU);
|
||||
+ virQEMUCapsHostCPUDataClear(&qemuCaps->tcgCPU);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2431,14 +2426,24 @@ virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
|
||||
}
|
||||
|
||||
|
||||
+static virQEMUCapsHostCPUDataPtr
|
||||
+virQEMUCapsGetHostCPUData(virQEMUCapsPtr qemuCaps,
|
||||
+ virDomainVirtType type)
|
||||
+{
|
||||
+ if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
+ return &qemuCaps->kvmCPU;
|
||||
+ else
|
||||
+ return &qemuCaps->tcgCPU;
|
||||
+}
|
||||
+
|
||||
+
|
||||
virCPUDefPtr
|
||||
virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type)
|
||||
{
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- return qemuCaps->kvmCPUModel;
|
||||
- else
|
||||
- return qemuCaps->tcgCPUModel;
|
||||
+ virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
+
|
||||
+ return cpuData->reported;
|
||||
}
|
||||
|
||||
|
||||
@@ -2447,10 +2452,9 @@ virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
virCPUDefPtr cpu)
|
||||
{
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- qemuCaps->kvmCPUModel = cpu;
|
||||
- else
|
||||
- qemuCaps->tcgCPUModel = cpu;
|
||||
+ virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
+
|
||||
+ cpuData->reported = cpu;
|
||||
}
|
||||
|
||||
|
||||
@@ -2841,24 +2845,28 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
|
||||
qemuMonitorPtr mon,
|
||||
bool tcg)
|
||||
{
|
||||
- qemuMonitorCPUModelInfoPtr *modelInfo;
|
||||
+ qemuMonitorCPUModelInfoPtr modelInfo = NULL;
|
||||
qemuMonitorCPUModelInfoPtr nonMigratable = NULL;
|
||||
virHashTablePtr hash = NULL;
|
||||
const char *model;
|
||||
qemuMonitorCPUModelExpansionType type;
|
||||
+ virDomainVirtType virtType;
|
||||
+ virQEMUCapsHostCPUDataPtr cpuData;
|
||||
int ret = -1;
|
||||
|
||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
|
||||
return 0;
|
||||
|
||||
if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
|
||||
- modelInfo = &qemuCaps->tcgCPUModelInfo;
|
||||
+ virtType = VIR_DOMAIN_VIRT_QEMU;
|
||||
model = "max";
|
||||
} else {
|
||||
- modelInfo = &qemuCaps->kvmCPUModelInfo;
|
||||
+ virtType = VIR_DOMAIN_VIRT_KVM;
|
||||
model = "host";
|
||||
}
|
||||
|
||||
+ cpuData = virQEMUCapsGetHostCPUData(qemuCaps, virtType);
|
||||
+
|
||||
/* Some x86_64 features defined in cpu_map.xml use spelling which differ
|
||||
* from the one preferred by QEMU. Static expansion would give us only the
|
||||
* preferred spelling, thus we need to do a full expansion on the result of
|
||||
@@ -2869,14 +2877,14 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
|
||||
else
|
||||
type = QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC;
|
||||
|
||||
- if (qemuMonitorGetCPUModelExpansion(mon, type, model, true, modelInfo) < 0)
|
||||
- return -1;
|
||||
+ if (qemuMonitorGetCPUModelExpansion(mon, type, model, true, &modelInfo) < 0)
|
||||
+ goto cleanup;
|
||||
|
||||
/* Try to check migratability of each feature. */
|
||||
- if (*modelInfo &&
|
||||
+ if (modelInfo &&
|
||||
qemuMonitorGetCPUModelExpansion(mon, type, model, false,
|
||||
&nonMigratable) < 0)
|
||||
- goto error;
|
||||
+ goto cleanup;
|
||||
|
||||
if (nonMigratable) {
|
||||
qemuMonitorCPUPropertyPtr prop;
|
||||
@@ -2884,12 +2892,12 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
|
||||
size_t i;
|
||||
|
||||
if (!(hash = virHashCreate(0, NULL)))
|
||||
- goto error;
|
||||
+ goto cleanup;
|
||||
|
||||
- for (i = 0; i < (*modelInfo)->nprops; i++) {
|
||||
- prop = (*modelInfo)->props + i;
|
||||
+ for (i = 0; i < modelInfo->nprops; i++) {
|
||||
+ prop = modelInfo->props + i;
|
||||
if (virHashAddEntry(hash, prop->name, prop) < 0)
|
||||
- goto error;
|
||||
+ goto cleanup;
|
||||
}
|
||||
|
||||
for (i = 0; i < nonMigratable->nprops; i++) {
|
||||
@@ -2907,21 +2915,18 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
|
||||
}
|
||||
}
|
||||
|
||||
- (*modelInfo)->migratability = true;
|
||||
+ modelInfo->migratability = true;
|
||||
}
|
||||
|
||||
+ VIR_STEAL_PTR(cpuData->info, modelInfo);
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virHashFree(hash);
|
||||
qemuMonitorCPUModelInfoFree(nonMigratable);
|
||||
+ qemuMonitorCPUModelInfoFree(modelInfo);
|
||||
|
||||
return ret;
|
||||
-
|
||||
- error:
|
||||
- qemuMonitorCPUModelInfoFree(*modelInfo);
|
||||
- *modelInfo = NULL;
|
||||
- goto cleanup;
|
||||
}
|
||||
|
||||
struct tpmTypeToCaps {
|
||||
@@ -3274,21 +3279,19 @@ virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virCPUDefPtr cpu,
|
||||
bool migratable)
|
||||
{
|
||||
- qemuMonitorCPUModelInfoPtr model;
|
||||
+ virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
int ret = 1;
|
||||
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- model = qemuCaps->kvmCPUModelInfo;
|
||||
- else
|
||||
- model = qemuCaps->tcgCPUModelInfo;
|
||||
-
|
||||
- if (migratable && model && !model->migratability)
|
||||
+ if (migratable && cpuData->info && !cpuData->info->migratability)
|
||||
return 1;
|
||||
|
||||
- if (ARCH_IS_S390(qemuCaps->arch))
|
||||
- ret = virQEMUCapsInitCPUModelS390(qemuCaps, model, cpu, migratable);
|
||||
- else if (ARCH_IS_X86(qemuCaps->arch))
|
||||
- ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, model, cpu, migratable);
|
||||
+ if (ARCH_IS_S390(qemuCaps->arch)) {
|
||||
+ ret = virQEMUCapsInitCPUModelS390(qemuCaps, cpuData->info,
|
||||
+ cpu, migratable);
|
||||
+ } else if (ARCH_IS_X86(qemuCaps->arch)) {
|
||||
+ ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, cpuData->info,
|
||||
+ cpu, migratable);
|
||||
+ }
|
||||
|
||||
if (ret == 0)
|
||||
cpu->fallback = VIR_CPU_FALLBACK_FORBID;
|
||||
@@ -3348,10 +3351,9 @@ virQEMUCapsSetCPUModelInfo(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
qemuMonitorCPUModelInfoPtr modelInfo)
|
||||
{
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
- qemuCaps->kvmCPUModelInfo = modelInfo;
|
||||
- else
|
||||
- qemuCaps->tcgCPUModelInfo = modelInfo;
|
||||
+ virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
+
|
||||
+ cpuData->info = modelInfo;
|
||||
}
|
||||
|
||||
|
||||
@@ -3810,18 +3812,11 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
|
||||
virBufferPtr buf,
|
||||
virDomainVirtType type)
|
||||
{
|
||||
- qemuMonitorCPUModelInfoPtr model;
|
||||
- const char *typeStr;
|
||||
+ virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
+ qemuMonitorCPUModelInfoPtr model = cpuData->info;
|
||||
+ const char *typeStr = type == VIR_DOMAIN_VIRT_KVM ? "kvm" : "tcg";
|
||||
size_t i;
|
||||
|
||||
- if (type == VIR_DOMAIN_VIRT_KVM) {
|
||||
- typeStr = "kvm";
|
||||
- model = qemuCaps->kvmCPUModelInfo;
|
||||
- } else {
|
||||
- typeStr = "tcg";
|
||||
- model = qemuCaps->tcgCPUModelInfo;
|
||||
- }
|
||||
-
|
||||
if (!model)
|
||||
return;
|
||||
|
||||
@@ -4080,7 +4075,8 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps)
|
||||
VIR_FREE(qemuCaps->gicCapabilities);
|
||||
qemuCaps->ngicCapabilities = 0;
|
||||
|
||||
- virQEMUCapsHostCPUDataClear(qemuCaps);
|
||||
+ virQEMUCapsHostCPUDataClear(&qemuCaps->kvmCPU);
|
||||
+ virQEMUCapsHostCPUDataClear(&qemuCaps->tcgCPU);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
From 4cb90fa2335b75a0fc39440853bd681955b326a4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 14 May 2019 21:09:59 +0100
|
||||
Subject: [PATCH] cputest: remove stibp flag from test data
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
stibp flag doesn't exist in this maint branch.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml | 1 -
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml | 1 -
|
||||
tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml | 1 -
|
||||
3 files changed, 3 deletions(-)
|
||||
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
index 3b3472742e..29c1fdb80a 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-guest.xml
|
||||
@@ -20,7 +20,6 @@
|
||||
<feature policy='require' name='tsc_adjust'/>
|
||||
<feature policy='require' name='clflushopt'/>
|
||||
<feature policy='require' name='md-clear'/>
|
||||
- <feature policy='require' name='stibp'/>
|
||||
<feature policy='require' name='ssbd'/>
|
||||
<feature policy='require' name='xsaves'/>
|
||||
<feature policy='require' name='pdpe1gb'/>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
index df4f97417c..2003ca9ef6 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-host.xml
|
||||
@@ -21,7 +21,6 @@
|
||||
<feature name='tsc_adjust'/>
|
||||
<feature name='clflushopt'/>
|
||||
<feature name='md-clear'/>
|
||||
- <feature name='stibp'/>
|
||||
<feature name='ssbd'/>
|
||||
<feature name='xsaves'/>
|
||||
<feature name='pdpe1gb'/>
|
||||
diff --git a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
index a5591278df..d6529c59a3 100644
|
||||
--- a/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
+++ b/tests/cputestdata/x86_64-cpuid-Xeon-E3-1225-v5-json.xml
|
||||
@@ -6,7 +6,6 @@
|
||||
<feature policy='require' name='tsc_adjust'/>
|
||||
<feature policy='require' name='clflushopt'/>
|
||||
<feature policy='require' name='md-clear'/>
|
||||
- <feature policy='require' name='stibp'/>
|
||||
<feature policy='require' name='ssbd'/>
|
||||
<feature policy='require' name='pdpe1gb'/>
|
||||
</cpu>
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 11 Apr 2017 11:14:30 +0200
|
||||
Subject: [PATCH] qemu: Prepare qemuCaps for multiple host CPU defs
|
||||
|
||||
Soon we will need to store multiple host CPU definitions in
|
||||
virQEMUCapsHostCPUData and qemuCaps users will want to request the one
|
||||
they need. This patch introduces virQEMUCapsHostCPUType enum which will
|
||||
be used for specifying the requested CPU definition.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 1fe517c68df92eb7f379fa87cb0d29d566aad6f4)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 16 ++++++++++++----
|
||||
src/qemu/qemu_capabilities.h | 10 +++++++++-
|
||||
src/qemu/qemu_command.c | 3 ++-
|
||||
src/qemu/qemu_process.c | 6 ++++--
|
||||
4 files changed, 27 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index bbb234538..a6324a398 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -2439,11 +2439,17 @@ virQEMUCapsGetHostCPUData(virQEMUCapsPtr qemuCaps,
|
||||
|
||||
virCPUDefPtr
|
||||
virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
- virDomainVirtType type)
|
||||
+ virDomainVirtType type,
|
||||
+ virQEMUCapsHostCPUType cpuType)
|
||||
{
|
||||
virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
|
||||
- return cpuData->reported;
|
||||
+ switch (cpuType) {
|
||||
+ case VIR_QEMU_CAPS_HOST_CPU_REPORTED:
|
||||
+ return cpuData->reported;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -2472,7 +2478,8 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
|
||||
virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
|
||||
|
||||
case VIR_CPU_MODE_HOST_MODEL:
|
||||
- return !!virQEMUCapsGetHostModel(qemuCaps, type);
|
||||
+ return !!virQEMUCapsGetHostModel(qemuCaps, type,
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_REPORTED);
|
||||
|
||||
case VIR_CPU_MODE_CUSTOM:
|
||||
if (type == VIR_DOMAIN_VIRT_KVM)
|
||||
@@ -5456,7 +5463,8 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
|
||||
|
||||
if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
|
||||
VIR_CPU_MODE_HOST_MODEL)) {
|
||||
- virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype);
|
||||
+ virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_REPORTED);
|
||||
domCaps->cpu.hostModel = virCPUDefCopy(cpu);
|
||||
}
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index d44682f2a..88e27855b 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -449,8 +449,16 @@ int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
char ***names,
|
||||
size_t *count);
|
||||
+
|
||||
+typedef enum {
|
||||
+ /* Host CPU definition reported in domain capabilities. */
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_REPORTED,
|
||||
+} virQEMUCapsHostCPUType;
|
||||
+
|
||||
virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
- virDomainVirtType type);
|
||||
+ virDomainVirtType type,
|
||||
+ virQEMUCapsHostCPUType cpuType);
|
||||
+
|
||||
bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
|
||||
virCapsPtr caps,
|
||||
virDomainVirtType type,
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 3abfe7b55..311edd13e 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -6879,7 +6879,8 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
|
||||
if (def->cpu->mode == VIR_CPU_MODE_CUSTOM)
|
||||
cpuDef = def->cpu;
|
||||
else if (def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
|
||||
- cpuDef = virQEMUCapsGetHostModel(qemuCaps, def->virtType);
|
||||
+ cpuDef = virQEMUCapsGetHostModel(qemuCaps, def->virtType,
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_REPORTED);
|
||||
|
||||
if (cpuDef) {
|
||||
int svm = virCPUCheckFeature(def->os.arch, cpuDef, "svm");
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 26a668d27..07a88a3a7 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -5299,12 +5299,14 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
|
||||
|
||||
if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
|
||||
virCPUCompare(caps->host.arch,
|
||||
- virQEMUCapsGetHostModel(qemuCaps, def->virtType),
|
||||
+ virQEMUCapsGetHostModel(qemuCaps, def->virtType,
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_REPORTED),
|
||||
def->cpu, true) < 0)
|
||||
return -1;
|
||||
|
||||
if (virCPUUpdate(def->os.arch, def->cpu,
|
||||
- virQEMUCapsGetHostModel(qemuCaps, def->virtType)) < 0)
|
||||
+ virQEMUCapsGetHostModel(qemuCaps, def->virtType,
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_REPORTED)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType,
|
||||
@@ -0,0 +1,58 @@
|
||||
From 39fb5ab3125d1669344bab94ccb71bce814d9ae2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 30 Apr 2019 17:26:13 +0100
|
||||
Subject: [PATCH 1/3] admin: reject clients unless their UID matches the
|
||||
current UID
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The admin protocol RPC messages are only intended for use by the user
|
||||
running the daemon. As such they should not be allowed for any client
|
||||
UID that does not match the server UID.
|
||||
|
||||
Fixes CVE-2019-10132
|
||||
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit 96f41cd765c9e525fe28ee5abbfbf4a79b3720c7)
|
||||
---
|
||||
src/admin/admin_server_dispatch.c | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/src/admin/admin_server_dispatch.c b/src/admin/admin_server_dispatch.c
|
||||
index b78ff902c0..9f25813ae3 100644
|
||||
--- a/src/admin/admin_server_dispatch.c
|
||||
+++ b/src/admin/admin_server_dispatch.c
|
||||
@@ -66,6 +66,28 @@ remoteAdmClientNew(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||
void *opaque)
|
||||
{
|
||||
struct daemonAdmClientPrivate *priv;
|
||||
+ uid_t clientuid;
|
||||
+ gid_t clientgid;
|
||||
+ pid_t clientpid;
|
||||
+ unsigned long long timestamp;
|
||||
+
|
||||
+ if (virNetServerClientGetUNIXIdentity(client,
|
||||
+ &clientuid,
|
||||
+ &clientgid,
|
||||
+ &clientpid,
|
||||
+ ×tamp) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ VIR_DEBUG("New client pid %lld uid %lld",
|
||||
+ (long long)clientpid,
|
||||
+ (long long)clientuid);
|
||||
+
|
||||
+ if (geteuid() != clientuid) {
|
||||
+ virReportRestrictedError(_("Disallowing client %lld with uid %lld"),
|
||||
+ (long long)clientpid,
|
||||
+ (long long)clientuid);
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
if (VIR_ALLOC(priv) < 0)
|
||||
return NULL;
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,210 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 29 Mar 2017 15:31:17 +0200
|
||||
Subject: [PATCH] qemu: Pass migratable host CPU model to virCPUUpdate
|
||||
|
||||
We already know from QEMU which CPU features will block migration. Let's
|
||||
use this information to make a migratable copy of the host CPU model and
|
||||
use it for updating guest CPU specification. This will allow us to drop
|
||||
feature filtering from virCPUUpdate where it was just a hack.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 56bd7edcb5dc878beffb80d4e6a9cfb812378ded)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 57 +++++++++++++++++++++++++++++++++++++-------
|
||||
src/qemu/qemu_capabilities.h | 2 ++
|
||||
src/qemu/qemu_process.c | 2 +-
|
||||
tests/cputest.c | 7 +++++-
|
||||
4 files changed, 57 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index a6324a398..7fc577546 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -384,6 +384,8 @@ struct _virQEMUCapsHostCPUData {
|
||||
qemuMonitorCPUModelInfoPtr info;
|
||||
/* Host CPU definition reported in domain capabilities. */
|
||||
virCPUDefPtr reported;
|
||||
+ /* Migratable host CPU definition used for updating guest CPU. */
|
||||
+ virCPUDefPtr migratable;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -2100,6 +2102,10 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUDataPtr dst,
|
||||
!(dst->reported = virCPUDefCopy(src->reported)))
|
||||
return -1;
|
||||
|
||||
+ if (src->migratable &&
|
||||
+ !(dst->migratable = virCPUDefCopy(src->migratable)))
|
||||
+ return -1;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2109,6 +2115,7 @@ virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUDataPtr cpuData)
|
||||
{
|
||||
qemuMonitorCPUModelInfoFree(cpuData->info);
|
||||
virCPUDefFree(cpuData->reported);
|
||||
+ virCPUDefFree(cpuData->migratable);
|
||||
|
||||
memset(cpuData, 0, sizeof(*cpuData));
|
||||
}
|
||||
@@ -2447,6 +2454,9 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
switch (cpuType) {
|
||||
case VIR_QEMU_CAPS_HOST_CPU_REPORTED:
|
||||
return cpuData->reported;
|
||||
+
|
||||
+ case VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE:
|
||||
+ return cpuData->migratable;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -2456,11 +2466,13 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
static void
|
||||
virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
- virCPUDefPtr cpu)
|
||||
+ virCPUDefPtr reported,
|
||||
+ virCPUDefPtr migratable)
|
||||
{
|
||||
virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
|
||||
- cpuData->reported = cpu;
|
||||
+ cpuData->reported = reported;
|
||||
+ cpuData->migratable = migratable;
|
||||
}
|
||||
|
||||
|
||||
@@ -3307,26 +3319,39 @@ virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
}
|
||||
|
||||
|
||||
+static virCPUDefPtr
|
||||
+virQEMUCapsNewHostCPUModel(void)
|
||||
+{
|
||||
+ virCPUDefPtr cpu;
|
||||
+
|
||||
+ if (VIR_ALLOC(cpu) < 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ cpu->type = VIR_CPU_TYPE_GUEST;
|
||||
+ cpu->mode = VIR_CPU_MODE_CUSTOM;
|
||||
+ cpu->match = VIR_CPU_MATCH_EXACT;
|
||||
+ cpu->fallback = VIR_CPU_FALLBACK_ALLOW;
|
||||
+
|
||||
+ return cpu;
|
||||
+}
|
||||
+
|
||||
+
|
||||
void
|
||||
virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virCapsPtr caps,
|
||||
virDomainVirtType type)
|
||||
{
|
||||
virCPUDefPtr cpu = NULL;
|
||||
+ virCPUDefPtr migCPU = NULL;
|
||||
virCPUDefPtr hostCPU = NULL;
|
||||
int rc;
|
||||
|
||||
if (!caps || !virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch))
|
||||
return;
|
||||
|
||||
- if (VIR_ALLOC(cpu) < 0)
|
||||
+ if (!(cpu = virQEMUCapsNewHostCPUModel()))
|
||||
goto error;
|
||||
|
||||
- cpu->type = VIR_CPU_TYPE_GUEST;
|
||||
- cpu->mode = VIR_CPU_MODE_CUSTOM;
|
||||
- cpu->match = VIR_CPU_MATCH_EXACT;
|
||||
- cpu->fallback = VIR_CPU_FALLBACK_ALLOW;
|
||||
-
|
||||
if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) {
|
||||
goto error;
|
||||
} else if (rc == 1) {
|
||||
@@ -3340,7 +3365,20 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
goto error;
|
||||
}
|
||||
|
||||
- virQEMUCapsSetHostModel(qemuCaps, type, cpu);
|
||||
+ if (!(migCPU = virQEMUCapsNewHostCPUModel()))
|
||||
+ goto error;
|
||||
+
|
||||
+ if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, migCPU, true)) < 0) {
|
||||
+ goto error;
|
||||
+ } else if (rc == 1) {
|
||||
+ VIR_DEBUG("CPU migratability not provided by QEMU");
|
||||
+
|
||||
+ virCPUDefFree(migCPU);
|
||||
+ if (!(migCPU = virCPUCopyMigratable(qemuCaps->arch, cpu)))
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
+ virQEMUCapsSetHostModel(qemuCaps, type, cpu, migCPU);
|
||||
|
||||
cleanup:
|
||||
virCPUDefFree(hostCPU);
|
||||
@@ -3348,6 +3386,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
|
||||
error:
|
||||
virCPUDefFree(cpu);
|
||||
+ virCPUDefFree(migCPU);
|
||||
virResetLastError();
|
||||
goto cleanup;
|
||||
}
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index 88e27855b..31818c940 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -453,6 +453,8 @@ int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
|
||||
typedef enum {
|
||||
/* Host CPU definition reported in domain capabilities. */
|
||||
VIR_QEMU_CAPS_HOST_CPU_REPORTED,
|
||||
+ /* Migratable host CPU definition used for updating guest CPU. */
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE,
|
||||
} virQEMUCapsHostCPUType;
|
||||
|
||||
virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 07a88a3a7..e67736638 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -5306,7 +5306,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
|
||||
|
||||
if (virCPUUpdate(def->os.arch, def->cpu,
|
||||
virQEMUCapsGetHostModel(qemuCaps, def->virtType,
|
||||
- VIR_QEMU_CAPS_HOST_CPU_REPORTED)) < 0)
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType,
|
||||
diff --git a/tests/cputest.c b/tests/cputest.c
|
||||
index 8c07cf4f6..efa891dc1 100644
|
||||
--- a/tests/cputest.c
|
||||
+++ b/tests/cputest.c
|
||||
@@ -393,6 +393,7 @@ cpuTestUpdate(const void *arg)
|
||||
const struct data *data = arg;
|
||||
int ret = -1;
|
||||
virCPUDefPtr host = NULL;
|
||||
+ virCPUDefPtr migHost = NULL;
|
||||
virCPUDefPtr cpu = NULL;
|
||||
char *result = NULL;
|
||||
|
||||
@@ -400,7 +401,10 @@ cpuTestUpdate(const void *arg)
|
||||
!(cpu = cpuTestLoadXML(data->arch, data->name)))
|
||||
goto cleanup;
|
||||
|
||||
- if (virCPUUpdate(host->arch, cpu, host) < 0)
|
||||
+ if (!(migHost = virCPUCopyMigratable(data->arch, host)))
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (virCPUUpdate(host->arch, cpu, migHost) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virAsprintf(&result, "%s+%s", data->host, data->name) < 0)
|
||||
@@ -411,6 +415,7 @@ cpuTestUpdate(const void *arg)
|
||||
cleanup:
|
||||
virCPUDefFree(host);
|
||||
virCPUDefFree(cpu);
|
||||
+ virCPUDefFree(migHost);
|
||||
VIR_FREE(result);
|
||||
return ret;
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Wed, 29 Mar 2017 15:00:21 +0200
|
||||
Subject: [PATCH] cpu: Drop feature filtering from virCPUUpdate
|
||||
|
||||
Because of the changes done in the previous commit, @host is already a
|
||||
migratable CPU and there's no need to do any additional filtering.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 232d87c7dd081d126a079fb45178e0be096cc680)
|
||||
---
|
||||
src/cpu/cpu_x86.c | 9 +++------
|
||||
1 file changed, 3 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
|
||||
index a771b251e..53359ff9b 100644
|
||||
--- a/src/cpu/cpu_x86.c
|
||||
+++ b/src/cpu/cpu_x86.c
|
||||
@@ -2549,8 +2549,7 @@ x86Baseline(virCPUDefPtr *cpus,
|
||||
|
||||
static int
|
||||
x86UpdateHostModel(virCPUDefPtr guest,
|
||||
- const virCPUDef *host,
|
||||
- virCPUx86MapPtr map)
|
||||
+ const virCPUDef *host)
|
||||
{
|
||||
virCPUDefPtr updated = NULL;
|
||||
size_t i;
|
||||
@@ -2559,11 +2558,9 @@ x86UpdateHostModel(virCPUDefPtr guest,
|
||||
if (!(updated = virCPUDefCopyWithoutModel(host)))
|
||||
goto cleanup;
|
||||
|
||||
- /* Remove non-migratable features by default */
|
||||
updated->type = VIR_CPU_TYPE_GUEST;
|
||||
updated->mode = VIR_CPU_MODE_CUSTOM;
|
||||
- if (virCPUDefCopyModelFilter(updated, host, true,
|
||||
- x86FeatureIsMigratable, map) < 0)
|
||||
+ if (virCPUDefCopyModel(updated, host, true) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (guest->vendor_id) {
|
||||
@@ -2627,7 +2624,7 @@ virCPUx86Update(virCPUDefPtr guest,
|
||||
|
||||
if (guest->mode == VIR_CPU_MODE_HOST_MODEL ||
|
||||
guest->match == VIR_CPU_MATCH_MINIMUM)
|
||||
- ret = x86UpdateHostModel(guest, host, map);
|
||||
+ ret = x86UpdateHostModel(guest, host);
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
From 41f06e6095e17b61b2af35821d204afc5c34777c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 30 Apr 2019 16:51:37 +0100
|
||||
Subject: [PATCH 2/3] locking: restrict sockets to mode 0600
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The virtlockd daemon's only intended client is the libvirtd daemon. As
|
||||
such it should never allow clients from other user accounts to connect.
|
||||
The code already enforces this and drops clients from other UIDs, but
|
||||
we can get earlier (and thus stronger) protection against DoS by setting
|
||||
the socket permissions to 0600
|
||||
|
||||
Fixes CVE-2019-10132
|
||||
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit f111e09468693909b1f067aa575efdafd9a262a1)
|
||||
---
|
||||
src/locking/virtlockd-admin.socket.in | 1 +
|
||||
src/locking/virtlockd.socket.in | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/locking/virtlockd-admin.socket.in b/src/locking/virtlockd-admin.socket.in
|
||||
index 2a7500f3d0..f674c492f7 100644
|
||||
--- a/src/locking/virtlockd-admin.socket.in
|
||||
+++ b/src/locking/virtlockd-admin.socket.in
|
||||
@@ -5,6 +5,7 @@ Before=libvirtd.service
|
||||
[Socket]
|
||||
ListenStream=@localstatedir@/run/libvirt/virtlockd-admin-sock
|
||||
Service=virtlockd.service
|
||||
+SocketMode=0600
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
diff --git a/src/locking/virtlockd.socket.in b/src/locking/virtlockd.socket.in
|
||||
index 45e0f20235..d701b27516 100644
|
||||
--- a/src/locking/virtlockd.socket.in
|
||||
+++ b/src/locking/virtlockd.socket.in
|
||||
@@ -4,6 +4,7 @@ Before=libvirtd.service
|
||||
|
||||
[Socket]
|
||||
ListenStream=@localstatedir@/run/libvirt/virtlockd-sock
|
||||
+SocketMode=0600
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 11 Apr 2017 20:45:07 +0200
|
||||
Subject: [PATCH] cpu: Introduce virCPUGetHostIsSupported
|
||||
|
||||
Sometimes we want to call virCPUGetHost only when it is implemented for
|
||||
a given architecture to avoid logging expected and possibly misleading
|
||||
errors. The new virCPUGetHostIsSupported API may be used to guard such
|
||||
calls to virCPUGetHost.
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit bf1a881715c905c67f7d38dcd5bd6c2afbff1f9b)
|
||||
---
|
||||
src/cpu/cpu.c | 20 ++++++++++++++++++++
|
||||
src/cpu/cpu.h | 3 +++
|
||||
src/libvirt_private.syms | 1 +
|
||||
3 files changed, 24 insertions(+)
|
||||
|
||||
diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
|
||||
index 8a407ac18..702b14dbb 100644
|
||||
--- a/src/cpu/cpu.c
|
||||
+++ b/src/cpu/cpu.c
|
||||
@@ -357,6 +357,26 @@ virCPUDataFree(virCPUDataPtr data)
|
||||
}
|
||||
|
||||
|
||||
+/**
|
||||
+ * virCPUGetHostIsSupported:
|
||||
+ *
|
||||
+ * @arch: CPU architecture
|
||||
+ *
|
||||
+ * Check whether virCPUGetHost is supported for @arch.
|
||||
+ *
|
||||
+ * Returns true if virCPUGetHost is supported, false otherwise.
|
||||
+ */
|
||||
+bool
|
||||
+virCPUGetHostIsSupported(virArch arch)
|
||||
+{
|
||||
+ struct cpuArchDriver *driver;
|
||||
+
|
||||
+ VIR_DEBUG("arch=%s", virArchToString(arch));
|
||||
+
|
||||
+ return (driver = cpuGetSubDriver(arch)) && driver->getHost;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/**
|
||||
* virCPUGetHost:
|
||||
*
|
||||
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
|
||||
index 352445c40..c6ca111e9 100644
|
||||
--- a/src/cpu/cpu.h
|
||||
+++ b/src/cpu/cpu.h
|
||||
@@ -183,6 +183,9 @@ virCPUDataNew(virArch arch);
|
||||
void
|
||||
virCPUDataFree(virCPUDataPtr data);
|
||||
|
||||
+bool
|
||||
+virCPUGetHostIsSupported(virArch arch);
|
||||
+
|
||||
virCPUDefPtr
|
||||
virCPUGetHost(virArch arch,
|
||||
virCPUType type,
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index dc6db3b28..2d8a9ddec 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -1024,6 +1024,7 @@ virCPUDataNew;
|
||||
virCPUDataParse;
|
||||
virCPUExpandFeatures;
|
||||
virCPUGetHost;
|
||||
+virCPUGetHostIsSupported;
|
||||
virCPUGetModels;
|
||||
virCPUProbeHost;
|
||||
virCPUTranslate;
|
||||
@@ -0,0 +1,51 @@
|
||||
From f0e014133104cdb5af5c7d96a7aa6dc0f1bbb03c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 30 Apr 2019 17:27:41 +0100
|
||||
Subject: [PATCH 3/3] logging: restrict sockets to mode 0600
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The virtlogd daemon's only intended client is the libvirtd daemon. As
|
||||
such it should never allow clients from other user accounts to connect.
|
||||
The code already enforces this and drops clients from other UIDs, but
|
||||
we can get earlier (and thus stronger) protection against DoS by setting
|
||||
the socket permissions to 0600
|
||||
|
||||
Fixes CVE-2019-10132
|
||||
|
||||
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
(cherry picked from commit e37bd65f9948c1185456b2cdaa3bd6e875af680f)
|
||||
---
|
||||
src/logging/virtlogd-admin.socket.in | 1 +
|
||||
src/logging/virtlogd.socket.in | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/logging/virtlogd-admin.socket.in b/src/logging/virtlogd-admin.socket.in
|
||||
index 595e6c4c4b..5c41dfeb7b 100644
|
||||
--- a/src/logging/virtlogd-admin.socket.in
|
||||
+++ b/src/logging/virtlogd-admin.socket.in
|
||||
@@ -5,6 +5,7 @@ Before=libvirtd.service
|
||||
[Socket]
|
||||
ListenStream=@localstatedir@/run/libvirt/virtlogd-admin-sock
|
||||
Service=virtlogd.service
|
||||
+SocketMode=0600
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
diff --git a/src/logging/virtlogd.socket.in b/src/logging/virtlogd.socket.in
|
||||
index 22b9360c8d..ae48cdab9a 100644
|
||||
--- a/src/logging/virtlogd.socket.in
|
||||
+++ b/src/logging/virtlogd.socket.in
|
||||
@@ -4,6 +4,7 @@ Before=libvirtd.service
|
||||
|
||||
[Socket]
|
||||
ListenStream=@localstatedir@/run/libvirt/virtlogd-sock
|
||||
+SocketMode=0600
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
--
|
||||
2.21.0
|
||||
|
||||
@@ -1,164 +0,0 @@
|
||||
From: Jiri Denemark <jdenemar@redhat.com>
|
||||
Date: Tue, 11 Apr 2017 20:46:05 +0200
|
||||
Subject: [PATCH] qemu: Use more data for comparing CPUs
|
||||
|
||||
With QEMU older than 2.9.0 libvirt uses CPUID instruction to determine
|
||||
what CPU features are supported on the host. This was later used when
|
||||
checking compatibility of guest CPUs. Since QEMU 2.9.0 we ask QEMU for
|
||||
the host CPU data. But the two methods we use usually provide disjoint
|
||||
sets of CPU features because QEMU/KVM does not support all features
|
||||
provided by the host CPU and on the other hand it can enable some
|
||||
feature even if the host CPU does not support them.
|
||||
|
||||
So if there is a domain which requires a CPU features disabled by
|
||||
QEMU/KVM, libvirt will refuse to start it with QEMU > 2.9.0 as its guest
|
||||
CPU is incompatible with the host CPU data we got from QEMU. But such
|
||||
domain would happily start on older QEMU (of course, the features would
|
||||
be missing the guest CPU). To fix this regression, we need to combine
|
||||
both CPU feature sets when checking guest CPU compatibility.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1439933
|
||||
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit 5b4a6adb5ca24a6cb91cdc55c31506fb278d3a91)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 35 +++++++++++++++++++++++++++++++++--
|
||||
src/qemu/qemu_capabilities.h | 4 ++++
|
||||
src/qemu/qemu_process.c | 2 +-
|
||||
3 files changed, 38 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 7fc577546..01bd4750c 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -386,6 +386,10 @@ struct _virQEMUCapsHostCPUData {
|
||||
virCPUDefPtr reported;
|
||||
/* Migratable host CPU definition used for updating guest CPU. */
|
||||
virCPUDefPtr migratable;
|
||||
+ /* CPU definition with features detected by libvirt using virCPUGetHost
|
||||
+ * combined with features reported by QEMU. This is used for backward
|
||||
+ * compatible comparison between a guest CPU and a host CPU. */
|
||||
+ virCPUDefPtr full;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -2106,6 +2110,10 @@ virQEMUCapsHostCPUDataCopy(virQEMUCapsHostCPUDataPtr dst,
|
||||
!(dst->migratable = virCPUDefCopy(src->migratable)))
|
||||
return -1;
|
||||
|
||||
+ if (src->full &&
|
||||
+ !(dst->full = virCPUDefCopy(src->full)))
|
||||
+ return -1;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2116,6 +2124,7 @@ virQEMUCapsHostCPUDataClear(virQEMUCapsHostCPUDataPtr cpuData)
|
||||
qemuMonitorCPUModelInfoFree(cpuData->info);
|
||||
virCPUDefFree(cpuData->reported);
|
||||
virCPUDefFree(cpuData->migratable);
|
||||
+ virCPUDefFree(cpuData->full);
|
||||
|
||||
memset(cpuData, 0, sizeof(*cpuData));
|
||||
}
|
||||
@@ -2457,6 +2466,11 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
|
||||
case VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE:
|
||||
return cpuData->migratable;
|
||||
+
|
||||
+ case VIR_QEMU_CAPS_HOST_CPU_FULL:
|
||||
+ /* 'full' is non-NULL only if we have data from both QEMU and
|
||||
+ * virCPUGetHost */
|
||||
+ return cpuData->full ? cpuData->full : cpuData->reported;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -2467,12 +2481,14 @@ static void
|
||||
virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
virDomainVirtType type,
|
||||
virCPUDefPtr reported,
|
||||
- virCPUDefPtr migratable)
|
||||
+ virCPUDefPtr migratable,
|
||||
+ virCPUDefPtr full)
|
||||
{
|
||||
virQEMUCapsHostCPUDataPtr cpuData = virQEMUCapsGetHostCPUData(qemuCaps, type);
|
||||
|
||||
cpuData->reported = reported;
|
||||
cpuData->migratable = migratable;
|
||||
+ cpuData->full = full;
|
||||
}
|
||||
|
||||
|
||||
@@ -3344,6 +3360,8 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virCPUDefPtr cpu = NULL;
|
||||
virCPUDefPtr migCPU = NULL;
|
||||
virCPUDefPtr hostCPU = NULL;
|
||||
+ virCPUDefPtr fullCPU = NULL;
|
||||
+ size_t i;
|
||||
int rc;
|
||||
|
||||
if (!caps || !virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch))
|
||||
@@ -3363,6 +3381,18 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
virQEMUCapsCPUFilterFeatures,
|
||||
qemuCaps) < 0)
|
||||
goto error;
|
||||
+ } else if (type == VIR_DOMAIN_VIRT_KVM &&
|
||||
+ virCPUGetHostIsSupported(qemuCaps->arch)) {
|
||||
+ if (!(fullCPU = virCPUGetHost(qemuCaps->arch, VIR_CPU_TYPE_GUEST,
|
||||
+ NULL, NULL, 0)))
|
||||
+ goto error;
|
||||
+
|
||||
+ for (i = 0; i < cpu->nfeatures; i++) {
|
||||
+ if (cpu->features[i].policy == VIR_CPU_FEATURE_REQUIRE &&
|
||||
+ virCPUDefUpdateFeature(fullCPU, cpu->features[i].name,
|
||||
+ VIR_CPU_FEATURE_REQUIRE) < 0)
|
||||
+ goto error;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!(migCPU = virQEMUCapsNewHostCPUModel()))
|
||||
@@ -3378,7 +3408,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
goto error;
|
||||
}
|
||||
|
||||
- virQEMUCapsSetHostModel(qemuCaps, type, cpu, migCPU);
|
||||
+ virQEMUCapsSetHostModel(qemuCaps, type, cpu, migCPU, fullCPU);
|
||||
|
||||
cleanup:
|
||||
virCPUDefFree(hostCPU);
|
||||
@@ -3387,6 +3417,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
|
||||
error:
|
||||
virCPUDefFree(cpu);
|
||||
virCPUDefFree(migCPU);
|
||||
+ virCPUDefFree(fullCPU);
|
||||
virResetLastError();
|
||||
goto cleanup;
|
||||
}
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index 31818c940..4e9561c0a 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -455,6 +455,10 @@ typedef enum {
|
||||
VIR_QEMU_CAPS_HOST_CPU_REPORTED,
|
||||
/* Migratable host CPU definition used for updating guest CPU. */
|
||||
VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE,
|
||||
+ /* CPU definition with features detected by libvirt using virCPUGetHost
|
||||
+ * combined with features reported by QEMU. This is used for backward
|
||||
+ * compatible comparison between a guest CPU and a host CPU. */
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_FULL,
|
||||
} virQEMUCapsHostCPUType;
|
||||
|
||||
virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index e67736638..992a7174b 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -5300,7 +5300,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
|
||||
if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
|
||||
virCPUCompare(caps->host.arch,
|
||||
virQEMUCapsGetHostModel(qemuCaps, def->virtType,
|
||||
- VIR_QEMU_CAPS_HOST_CPU_REPORTED),
|
||||
+ VIR_QEMU_CAPS_HOST_CPU_FULL),
|
||||
def->cpu, true) < 0)
|
||||
return -1;
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
From: Neal Gompa <ngompa13@gmail.com>
|
||||
Date: Mon, 17 Jul 2017 11:32:46 -0400
|
||||
Subject: [PATCH] spec: Add support for building the zfs storage driver
|
||||
|
||||
Where it can be supported in Fedora, the driver is built and made
|
||||
available as a subpackage.
|
||||
|
||||
Signed-off-by: Neal Gompa <ngompa13@gmail.com>
|
||||
(cherry picked from commit 9af764e86aef7dfb0191a9561bf1d1abf941da05)
|
||||
---
|
||||
libvirt.spec.in | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 49 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libvirt.spec.in b/libvirt.spec.in
|
||||
index 079b5f386..46a3e97d1 100644
|
||||
--- a/libvirt.spec.in
|
||||
+++ b/libvirt.spec.in
|
||||
@@ -71,6 +71,13 @@
|
||||
%define with_storage_gluster 0%{!?_without_storage_gluster:1}
|
||||
%define with_numactl 0%{!?_without_numactl:1}
|
||||
|
||||
+# F25+ has zfs-fuse
|
||||
+%if 0%{?fedora} >= 25
|
||||
+ %define with_storage_zfs 0%{!?_without_storage_zfs:1}
|
||||
+%else
|
||||
+ %define with_storage_zfs 0
|
||||
+%endif
|
||||
+
|
||||
# A few optional bits off by default, we enable later
|
||||
%define with_fuse 0%{!?_without_fuse:0}
|
||||
%define with_cgconfig 0%{!?_without_cgconfig:0}
|
||||
@@ -115,6 +122,12 @@
|
||||
%endif
|
||||
%endif
|
||||
|
||||
+# zfs-fuse is not available on some architectures
|
||||
+%ifarch s390 s390x aarch64
|
||||
+ %define with_storage_zfs 0
|
||||
+%endif
|
||||
+
|
||||
+
|
||||
# RHEL doesn't ship OpenVZ, VBox, UML, PowerHypervisor,
|
||||
# VMware, libxenserver (xenapi), libxenlight (Xen 4.1 and newer),
|
||||
# or HyperV.
|
||||
@@ -373,6 +386,12 @@ BuildRequires: glusterfs-devel >= 3.4.1
|
||||
%if %{with_storage_sheepdog}
|
||||
BuildRequires: sheepdog
|
||||
%endif
|
||||
+%if %{with_storage_zfs}
|
||||
+# Support any conforming implementation of zfs. On stock Fedora
|
||||
+# this is zfs-fuse, but could be zfsonlinux upstream RPMs
|
||||
+BuildRequires: /sbin/zfs
|
||||
+BuildRequires: /sbin/zpool
|
||||
+%endif
|
||||
%if %{with_numactl}
|
||||
# For QEMU/LXC numa info
|
||||
BuildRequires: numactl-devel
|
||||
@@ -705,6 +724,21 @@ sheepdog volumes using.
|
||||
%endif
|
||||
|
||||
|
||||
+%if %{with_storage_zfs}
|
||||
+%package daemon-driver-storage-zfs
|
||||
+Summary: Storage driver plugin for ZFS
|
||||
+Group: Development/Libraries
|
||||
+Requires: libvirt-daemon-driver-storage-core = %{version}-%{release}
|
||||
+# Support any conforming implementation of zfs
|
||||
+Requires: /sbin/zfs
|
||||
+Requires: /sbin/zpool
|
||||
+
|
||||
+%description daemon-driver-storage-zfs
|
||||
+The storage driver backend adding implementation of the storage APIs for
|
||||
+ZFS volumes.
|
||||
+%endif
|
||||
+
|
||||
+
|
||||
%package daemon-driver-storage
|
||||
Summary: Storage driver plugin including all backends for the libvirtd daemon
|
||||
Group: Development/Libraries
|
||||
@@ -723,6 +757,9 @@ Requires: libvirt-daemon-driver-storage-rbd = %{version}-%{release}
|
||||
%if %{with_storage_sheepdog}
|
||||
Requires: libvirt-daemon-driver-storage-sheepdog = %{version}-%{release}
|
||||
%endif
|
||||
+%if %{with_storage_zfs}
|
||||
+Requires: libvirt-daemon-driver-storage-zfs = %{version}-%{release}
|
||||
+%endif
|
||||
|
||||
%description daemon-driver-storage
|
||||
The storage driver plugin for the libvirtd daemon, providing
|
||||
@@ -1180,6 +1217,12 @@ rm -rf .git
|
||||
%define arg_storage_gluster --without-storage-gluster
|
||||
%endif
|
||||
|
||||
+%if %{with_storage_zfs}
|
||||
+ %define arg_storage_zfs --with-storage-zfs
|
||||
+%else
|
||||
+ %define arg_storage_zfs --without-storage-zfs
|
||||
+%endif
|
||||
+
|
||||
%if %{with_numactl}
|
||||
%define arg_numactl --with-numactl
|
||||
%else
|
||||
@@ -1288,7 +1331,7 @@ rm -f po/stamp-po
|
||||
%{?arg_storage_rbd} \
|
||||
%{?arg_storage_sheepdog} \
|
||||
%{?arg_storage_gluster} \
|
||||
- --without-storage-zfs \
|
||||
+ %{?arg_storage_zfs} \
|
||||
--without-storage-vstorage \
|
||||
%{?arg_numactl} \
|
||||
%{?arg_numad} \
|
||||
@@ -1850,6 +1893,11 @@ exit 0
|
||||
%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_sheepdog.so
|
||||
%endif
|
||||
|
||||
+%if %{with_storage_zfs}
|
||||
+%files daemon-driver-storage-zfs
|
||||
+%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_zfs.so
|
||||
+%endif
|
||||
+
|
||||
%if %{with_qemu}
|
||||
%files daemon-driver-qemu
|
||||
%dir %attr(0700, root, root) %{_sysconfdir}/libvirt/qemu/
|
||||
@@ -1,150 +0,0 @@
|
||||
From: Juan Hernandez <jhernand@redhat.com>
|
||||
Date: Thu, 6 Jul 2017 17:03:31 +0200
|
||||
Subject: [PATCH] Avoid hidden cgroup mount points
|
||||
|
||||
Currently the scan of the /proc/mounts file used to find cgroup mount
|
||||
points doesn't take into account that mount points may hidden by other
|
||||
mount points. For, example in certain Kubernetes environments the
|
||||
/proc/mounts contains the following lines:
|
||||
|
||||
cgroup /sys/fs/cgroup/net_prio,net_cls cgroup ...
|
||||
tmpfs /sys/fs/cgroup tmpfs ...
|
||||
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup ...
|
||||
|
||||
In this particular environment the first mount point is hidden by the
|
||||
second one. The correct mount point is the third one, but libvirt will
|
||||
never process it because it only checks the first mount point for each
|
||||
controller (net_cls in this case). So libvirt will try to use the first
|
||||
mount point, which doesn't actually exist, and the complete detection
|
||||
process will fail.
|
||||
|
||||
To avoid that issue this patch changes the virCgroupDetectMountsFromFile
|
||||
function so that when there are duplicates it takes the information from
|
||||
the last line in /proc/mounts. This requires removing the previous
|
||||
explicit condition to skip duplicates, and adding code to free the
|
||||
memory used by the processing of duplicated lines.
|
||||
|
||||
Related-To: https://bugzilla.redhat.com/1468214
|
||||
Related-To: https://github.com/kubevirt/libvirt/issues/4
|
||||
Signed-off-by: Juan Hernandez <jhernand@redhat.com>
|
||||
(cherry picked from commit dacd160d7479e0ec2d8a63f102145fd30636a1c8)
|
||||
---
|
||||
src/util/vircgroup.c | 23 ++++++++++++++---------
|
||||
tests/vircgroupdata/kubevirt.mounts | 25 +++++++++++++++++++++++++
|
||||
tests/vircgroupdata/kubevirt.parsed | 10 ++++++++++
|
||||
tests/vircgrouptest.c | 1 +
|
||||
4 files changed, 50 insertions(+), 9 deletions(-)
|
||||
create mode 100644 tests/vircgroupdata/kubevirt.mounts
|
||||
create mode 100644 tests/vircgroupdata/kubevirt.parsed
|
||||
|
||||
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
|
||||
index 5aa1db5b1..a53908fc9 100644
|
||||
--- a/src/util/vircgroup.c
|
||||
+++ b/src/util/vircgroup.c
|
||||
@@ -397,6 +397,7 @@ virCgroupDetectMountsFromFile(virCgroupPtr group,
|
||||
const char *typestr = virCgroupControllerTypeToString(i);
|
||||
int typelen = strlen(typestr);
|
||||
char *tmp = entry.mnt_opts;
|
||||
+ struct virCgroupController *controller = &group->controllers[i];
|
||||
while (tmp) {
|
||||
char *next = strchr(tmp, ',');
|
||||
int len;
|
||||
@@ -406,18 +407,22 @@ virCgroupDetectMountsFromFile(virCgroupPtr group,
|
||||
} else {
|
||||
len = strlen(tmp);
|
||||
}
|
||||
- /* NB, the same controller can appear >1 time in mount list
|
||||
- * due to bind mounts from one location to another. Pick the
|
||||
- * first entry only
|
||||
- */
|
||||
- if (typelen == len && STREQLEN(typestr, tmp, len) &&
|
||||
- !group->controllers[i].mountPoint) {
|
||||
+
|
||||
+ if (typelen == len && STREQLEN(typestr, tmp, len)) {
|
||||
char *linksrc;
|
||||
struct stat sb;
|
||||
char *tmp2;
|
||||
|
||||
- if (VIR_STRDUP(group->controllers[i].mountPoint,
|
||||
- entry.mnt_dir) < 0)
|
||||
+ /* Note that the lines in /proc/mounts have the same
|
||||
+ * order than the mount operations, and that there may
|
||||
+ * be duplicates due to bind mounts. This means
|
||||
+ * that the same mount point may be processed more than
|
||||
+ * once. We need to save the results of the last one,
|
||||
+ * and we need to be careful to release the memory used
|
||||
+ * by previous processing. */
|
||||
+ VIR_FREE(controller->mountPoint);
|
||||
+ VIR_FREE(controller->linkPoint);
|
||||
+ if (VIR_STRDUP(controller->mountPoint, entry.mnt_dir) < 0)
|
||||
goto error;
|
||||
|
||||
tmp2 = strrchr(entry.mnt_dir, '/');
|
||||
@@ -453,7 +458,7 @@ virCgroupDetectMountsFromFile(virCgroupPtr group,
|
||||
VIR_WARN("Expecting a symlink at %s for controller %s",
|
||||
linksrc, typestr);
|
||||
} else {
|
||||
- group->controllers[i].linkPoint = linksrc;
|
||||
+ controller->linkPoint = linksrc;
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/tests/vircgroupdata/kubevirt.mounts b/tests/vircgroupdata/kubevirt.mounts
|
||||
new file mode 100644
|
||||
index 000000000..ca036196b
|
||||
--- /dev/null
|
||||
+++ b/tests/vircgroupdata/kubevirt.mounts
|
||||
@@ -0,0 +1,25 @@
|
||||
+rootfs / rootfs rw 0 0
|
||||
+proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
|
||||
+udev /dev devtmpfs rw,nosuid,relatime,size=10240k,nr_inodes=1006404,mode=755 0 0
|
||||
+devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
|
||||
+sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
|
||||
+/dev/sda1 / ext4 rw,noatime,data=ordered 0 0
|
||||
+tmpfs /run tmpfs rw,nodev,relatime,size=812296k,mode=755 0 0
|
||||
+mqueue /dev/mqueue mqueue rw,nosuid,nodev,noexec,relatime 0 0
|
||||
+shm /dev/shm tmpfs rw,nosuid,nodev,noexec,relatime 0 0
|
||||
+debugfs /sys/kernel/debug debugfs rw,nosuid,nodev,noexec,relatime 0 0
|
||||
+cgroup_root /sys/fs/cgroup tmpfs rw,nosuid,nodev,noexec,relatime,size=10240k,mode=755 0 0
|
||||
+openrc /sys/fs/cgroup/openrc cgroup rw,nosuid,nodev,noexec,relatime,release_agent=/lib64/rc/sh/cgroup-release-agent.sh,name=openrc 0 0
|
||||
+cpuset /some/random/location/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
|
||||
+cpuset /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
|
||||
+cpu /sys/fs/cgroup/cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu 0 0
|
||||
+cpuacct /some/random/location/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuacct 0 0
|
||||
+cpuacct /sys/fs/cgroup/cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct 0 0
|
||||
+memory /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
|
||||
+devices /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
|
||||
+freezer /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
|
||||
+blkio /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
|
||||
+perf_event /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
|
||||
+hugetlb /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0
|
||||
+binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,nosuid,nodev,noexec,relatime 0 0
|
||||
+freezer /some/random/location/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
|
||||
diff --git a/tests/vircgroupdata/kubevirt.parsed b/tests/vircgroupdata/kubevirt.parsed
|
||||
new file mode 100644
|
||||
index 000000000..694870723
|
||||
--- /dev/null
|
||||
+++ b/tests/vircgroupdata/kubevirt.parsed
|
||||
@@ -0,0 +1,10 @@
|
||||
+cpu /sys/fs/cgroup/cpu
|
||||
+cpuacct /sys/fs/cgroup/cpuacct
|
||||
+cpuset /sys/fs/cgroup/cpuset
|
||||
+memory /sys/fs/cgroup/memory
|
||||
+devices /sys/fs/cgroup/devices
|
||||
+freezer /some/random/location/freezer
|
||||
+blkio /sys/fs/cgroup/blkio
|
||||
+net_cls <null>
|
||||
+perf_event /sys/fs/cgroup/perf_event
|
||||
+name=systemd <null>
|
||||
diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c
|
||||
index f55ef74a1..cf0315f16 100644
|
||||
--- a/tests/vircgrouptest.c
|
||||
+++ b/tests/vircgrouptest.c
|
||||
@@ -885,6 +885,7 @@ mymain(void)
|
||||
DETECT_MOUNTS("cgroups3");
|
||||
DETECT_MOUNTS("all-in-one");
|
||||
DETECT_MOUNTS("no-cgroups");
|
||||
+ DETECT_MOUNTS("kubevirt");
|
||||
|
||||
if (virTestRun("New cgroup for self", testCgroupNewForSelf, NULL) < 0)
|
||||
ret = -1;
|
||||
@@ -1,53 +0,0 @@
|
||||
From: Jim Fehlig <jfehlig@suse.com>
|
||||
Date: Tue, 18 Jul 2017 10:20:35 -0600
|
||||
Subject: [PATCH] docs: schema: make disk driver name attribute optional
|
||||
|
||||
/domain/devices/disk/driver/@name is not a required or mandatory
|
||||
attribute according to formatdomain, and indeed it was agreed on
|
||||
IRC that the attribute is "optional for input, recommended (but
|
||||
not required) for output". Currently the schema requires the
|
||||
attribute, causing virt-xml-validate to fail on disk config where
|
||||
the driver name is not explicitly specified. E.g.
|
||||
|
||||
# cat test.xml | grep -A 5 cdrom
|
||||
<disk type='file' device='cdrom'>
|
||||
<driver type='raw'/>
|
||||
<target dev='hdb' bus='ide'/>
|
||||
<readonly/>
|
||||
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
|
||||
</disk>
|
||||
|
||||
# virt-xml-validate test.xml
|
||||
Relax-NG validity error : Extra element devices in interleave
|
||||
test.xml:21: element devices: Relax-NG validity error : Element domain failed to validate content
|
||||
test.xml fails to validate
|
||||
|
||||
Relaxing the name attribute to be optional fixes the validation
|
||||
|
||||
# virt-xml-validate test.xml
|
||||
test.xml validates
|
||||
|
||||
(cherry picked from commit b494e09d058f09b48d0fd8855edd557101294671)
|
||||
---
|
||||
docs/schemas/domaincommon.rng | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
|
||||
index edc225fe5..dfc7e2470 100644
|
||||
--- a/docs/schemas/domaincommon.rng
|
||||
+++ b/docs/schemas/domaincommon.rng
|
||||
@@ -1720,9 +1720,11 @@
|
||||
</element>
|
||||
</define>
|
||||
<define name="driverFormat">
|
||||
- <attribute name="name">
|
||||
- <ref name="genericName"/>
|
||||
- </attribute>
|
||||
+ <optional>
|
||||
+ <attribute name="name">
|
||||
+ <ref name="genericName"/>
|
||||
+ </attribute>
|
||||
+ </optional>
|
||||
<optional>
|
||||
<attribute name='type'>
|
||||
<choice>
|
||||
@@ -1,34 +0,0 @@
|
||||
From: Stefan Berger <stefanb@linux.vnet.ibm.com>
|
||||
Date: Thu, 29 Jun 2017 14:01:11 -0400
|
||||
Subject: [PATCH] tpm: Use /dev/null for cancel path if none was found
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
TPM 2 does not implement sysfs files for cancellation of commands.
|
||||
We therefore use /dev/null for the cancel path passed to QEMU.
|
||||
|
||||
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
|
||||
Tested-by: Javier Martinez Canillas <javierm@redhat.com>
|
||||
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||
(cherry picked from commit dfbb15b75433e520fb1b905c1c3e28753e53e4a5)
|
||||
---
|
||||
src/util/virtpm.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/util/virtpm.c b/src/util/virtpm.c
|
||||
index 6d9b0657a..d5c10da38 100644
|
||||
--- a/src/util/virtpm.c
|
||||
+++ b/src/util/virtpm.c
|
||||
@@ -61,9 +61,7 @@ virTPMCreateCancelPath(const char *devpath)
|
||||
VIR_FREE(path);
|
||||
}
|
||||
if (!path)
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
- _("No usable sysfs TPM cancel file could be "
|
||||
- "found"));
|
||||
+ ignore_value(VIR_STRDUP(path, "/dev/null"));
|
||||
} else {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("TPM device path %s is invalid"), devpath);
|
||||
@@ -1,108 +0,0 @@
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Sun, 27 Aug 2017 11:23:47 -0400
|
||||
Subject: [PATCH] security: add MANAGER_MOUNT_NAMESPACE flag
|
||||
|
||||
The VIR_SECURITY_MANAGER_MOUNT_NAMESPACE flag informs the DAC driver
|
||||
if mount namespaces are in use for the VM. Will be used for future
|
||||
changes.
|
||||
|
||||
Wire it up in the qemu driver
|
||||
|
||||
(cherry picked from commit 321031e482425dfeae0f125cdac6df870f079efd)
|
||||
---
|
||||
src/qemu/qemu_driver.c | 2 ++
|
||||
src/security/security_dac.c | 10 ++++++++++
|
||||
src/security/security_dac.h | 3 +++
|
||||
src/security/security_manager.c | 4 +++-
|
||||
src/security/security_manager.h | 1 +
|
||||
5 files changed, 19 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index ce844bb04..555a1009b 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -417,6 +417,8 @@ qemuSecurityInit(virQEMUDriverPtr driver)
|
||||
if (virQEMUDriverIsPrivileged(driver)) {
|
||||
if (cfg->dynamicOwnership)
|
||||
flags |= VIR_SECURITY_MANAGER_DYNAMIC_OWNERSHIP;
|
||||
+ if (virBitmapIsBitSet(cfg->namespaces, QEMU_DOMAIN_NS_MOUNT))
|
||||
+ flags |= VIR_SECURITY_MANAGER_MOUNT_NAMESPACE;
|
||||
if (!(mgr = qemuSecurityNewDAC(QEMU_DRIVER_NAME,
|
||||
cfg->user,
|
||||
cfg->group,
|
||||
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
|
||||
index 922e48494..1f8d279bf 100644
|
||||
--- a/src/security/security_dac.c
|
||||
+++ b/src/security/security_dac.c
|
||||
@@ -57,6 +57,7 @@ struct _virSecurityDACData {
|
||||
gid_t *groups;
|
||||
int ngroups;
|
||||
bool dynamicOwnership;
|
||||
+ bool mountNamespace;
|
||||
char *baselabel;
|
||||
virSecurityManagerDACChownCallback chownCallback;
|
||||
};
|
||||
@@ -237,6 +238,15 @@ virSecurityDACSetDynamicOwnership(virSecurityManagerPtr mgr,
|
||||
priv->dynamicOwnership = dynamicOwnership;
|
||||
}
|
||||
|
||||
+void
|
||||
+virSecurityDACSetMountNamespace(virSecurityManagerPtr mgr,
|
||||
+ bool mountNamespace)
|
||||
+{
|
||||
+ virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||
+ priv->mountNamespace = mountNamespace;
|
||||
+}
|
||||
+
|
||||
+
|
||||
void
|
||||
virSecurityDACSetChownCallback(virSecurityManagerPtr mgr,
|
||||
virSecurityManagerDACChownCallback chownCallback)
|
||||
diff --git a/src/security/security_dac.h b/src/security/security_dac.h
|
||||
index 846cefbb5..97681c961 100644
|
||||
--- a/src/security/security_dac.h
|
||||
+++ b/src/security/security_dac.h
|
||||
@@ -32,6 +32,9 @@ int virSecurityDACSetUserAndGroup(virSecurityManagerPtr mgr,
|
||||
void virSecurityDACSetDynamicOwnership(virSecurityManagerPtr mgr,
|
||||
bool dynamic);
|
||||
|
||||
+void virSecurityDACSetMountNamespace(virSecurityManagerPtr mgr,
|
||||
+ bool mountNamespace);
|
||||
+
|
||||
void virSecurityDACSetChownCallback(virSecurityManagerPtr mgr,
|
||||
virSecurityManagerDACChownCallback chownCallback);
|
||||
|
||||
diff --git a/src/security/security_manager.c b/src/security/security_manager.c
|
||||
index 6c777db1e..b2d04d4b9 100644
|
||||
--- a/src/security/security_manager.c
|
||||
+++ b/src/security/security_manager.c
|
||||
@@ -146,7 +146,8 @@ virSecurityManagerNewDAC(const char *virtDriver,
|
||||
virSecurityManagerPtr mgr;
|
||||
|
||||
virCheckFlags(VIR_SECURITY_MANAGER_NEW_MASK |
|
||||
- VIR_SECURITY_MANAGER_DYNAMIC_OWNERSHIP, NULL);
|
||||
+ VIR_SECURITY_MANAGER_DYNAMIC_OWNERSHIP |
|
||||
+ VIR_SECURITY_MANAGER_MOUNT_NAMESPACE, NULL);
|
||||
|
||||
mgr = virSecurityManagerNewDriver(&virSecurityDriverDAC,
|
||||
virtDriver,
|
||||
@@ -161,6 +162,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
|
||||
}
|
||||
|
||||
virSecurityDACSetDynamicOwnership(mgr, flags & VIR_SECURITY_MANAGER_DYNAMIC_OWNERSHIP);
|
||||
+ virSecurityDACSetMountNamespace(mgr, flags & VIR_SECURITY_MANAGER_MOUNT_NAMESPACE);
|
||||
virSecurityDACSetChownCallback(mgr, chownCallback);
|
||||
|
||||
return mgr;
|
||||
diff --git a/src/security/security_manager.h b/src/security/security_manager.h
|
||||
index 238e66cd0..96937a892 100644
|
||||
--- a/src/security/security_manager.h
|
||||
+++ b/src/security/security_manager.h
|
||||
@@ -36,6 +36,7 @@ typedef enum {
|
||||
VIR_SECURITY_MANAGER_REQUIRE_CONFINED = 1 << 2,
|
||||
VIR_SECURITY_MANAGER_PRIVILEGED = 1 << 3,
|
||||
VIR_SECURITY_MANAGER_DYNAMIC_OWNERSHIP = 1 << 4,
|
||||
+ VIR_SECURITY_MANAGER_MOUNT_NAMESPACE = 1 << 5,
|
||||
} virSecurityManagerNewFlags;
|
||||
|
||||
# define VIR_SECURITY_MANAGER_NEW_MASK \
|
||||
@@ -1,101 +0,0 @@
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Mon, 17 Jul 2017 08:57:57 -0400
|
||||
Subject: [PATCH] security: dac: relabel spice rendernode
|
||||
|
||||
For a logged in user this a path like /dev/dri/renderD128 will have
|
||||
default ownership root:video which won't work for the qemu:qemu user,
|
||||
so we need to chown it.
|
||||
|
||||
We only do this when mount namespaces are enabled in the qemu driver,
|
||||
so the chown'ing doesn't interfere with other users of the shared
|
||||
render node path
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1460804
|
||||
(cherry picked from commit 98931187eefdec6f2dea5cb82ab6d23a3ffa6634)
|
||||
---
|
||||
src/security/security_dac.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 58 insertions(+)
|
||||
|
||||
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
|
||||
index 1f8d279bf..5f13bcee8 100644
|
||||
--- a/src/security/security_dac.c
|
||||
+++ b/src/security/security_dac.c
|
||||
@@ -1379,6 +1379,54 @@ virSecurityDACRestoreTPMFileLabel(virSecurityManagerPtr mgr,
|
||||
}
|
||||
|
||||
|
||||
+static int
|
||||
+virSecurityDACSetGraphicsLabel(virSecurityManagerPtr mgr,
|
||||
+ virDomainDefPtr def,
|
||||
+ virDomainGraphicsDefPtr gfx)
|
||||
+
|
||||
+{
|
||||
+ virSecurityDACDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||
+ virSecurityLabelDefPtr seclabel;
|
||||
+ uid_t user;
|
||||
+ gid_t group;
|
||||
+
|
||||
+ /* Skip chowning the shared render file if namespaces are disabled */
|
||||
+ if (!priv->mountNamespace)
|
||||
+ return 0;
|
||||
+
|
||||
+ seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_DAC_NAME);
|
||||
+ if (seclabel && !seclabel->relabel)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (virSecurityDACGetIds(seclabel, priv, &user, &group, NULL, NULL) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (gfx->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
|
||||
+ gfx->data.spice.gl == VIR_TRISTATE_BOOL_YES &&
|
||||
+ gfx->data.spice.rendernode) {
|
||||
+ if (virSecurityDACSetOwnership(priv, NULL,
|
||||
+ gfx->data.spice.rendernode,
|
||||
+ user, group) < 0)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int
|
||||
+virSecurityDACRestoreGraphicsLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||
+ virDomainDefPtr def ATTRIBUTE_UNUSED,
|
||||
+ virDomainGraphicsDefPtr gfx ATTRIBUTE_UNUSED)
|
||||
+
|
||||
+{
|
||||
+ /* The only graphics labelling we do is dependent on mountNamespaces,
|
||||
+ in which case 'restoring' the label doesn't actually accomplish
|
||||
+ anything, so there's nothing to do here */
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
virSecurityDACSetInputLabel(virSecurityManagerPtr mgr,
|
||||
virDomainDefPtr def,
|
||||
@@ -1489,6 +1537,11 @@ virSecurityDACRestoreAllLabel(virSecurityManagerPtr mgr,
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
+ for (i = 0; i < def->ngraphics; i++) {
|
||||
+ if (virSecurityDACRestoreGraphicsLabel(mgr, def, def->graphics[i]) < 0)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < def->ninputs; i++) {
|
||||
if (virSecurityDACRestoreInputLabel(mgr, def, def->inputs[i]) < 0)
|
||||
rc = -1;
|
||||
@@ -1602,6 +1655,11 @@ virSecurityDACSetAllLabel(virSecurityManagerPtr mgr,
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ for (i = 0; i < def->ngraphics; i++) {
|
||||
+ if (virSecurityDACSetGraphicsLabel(mgr, def, def->graphics[i]) < 0)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
for (i = 0; i < def->ninputs; i++) {
|
||||
if (virSecurityDACSetInputLabel(mgr, def, def->inputs[i]) < 0)
|
||||
return -1;
|
||||
@@ -1,63 +0,0 @@
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Mon, 31 Jul 2017 16:55:58 +0200
|
||||
Subject: [PATCH] qemu: Honour <on_reboot/>
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1476866
|
||||
|
||||
For some reason, we completely ignore <on_reboot/> setting for
|
||||
domains. The implementation is simply not there. It never was.
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
(cherry picked from commit 3ee9bdbe351c0b80d4c469571ef31df3f1b148ea)
|
||||
---
|
||||
src/qemu/qemu_process.c | 27 ++++++++++++++++++++++++---
|
||||
1 file changed, 24 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
||||
index 992a7174b..7588212ba 100644
|
||||
--- a/src/qemu/qemu_process.c
|
||||
+++ b/src/qemu/qemu_process.c
|
||||
@@ -487,6 +487,7 @@ qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
|
||||
virObjectEventPtr event;
|
||||
qemuDomainObjPrivatePtr priv;
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
+ int ret = -1;
|
||||
|
||||
virObjectLock(vm);
|
||||
|
||||
@@ -498,12 +499,32 @@ qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
|
||||
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
|
||||
VIR_WARN("Failed to save status on vm %s", vm->def->name);
|
||||
|
||||
- virObjectUnlock(vm);
|
||||
+ if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_DESTROY ||
|
||||
+ vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_PRESERVE) {
|
||||
|
||||
- qemuDomainEventQueue(driver, event);
|
||||
+ if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (!virDomainObjIsActive(vm)) {
|
||||
+ VIR_DEBUG("Ignoring RESET event from inactive domain %s",
|
||||
+ vm->def->name);
|
||||
+ goto endjob;
|
||||
+ }
|
||||
+
|
||||
+ qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED,
|
||||
+ QEMU_ASYNC_JOB_NONE, 0);
|
||||
+ virDomainAuditStop(vm, "destroyed");
|
||||
+ qemuDomainRemoveInactive(driver, vm);
|
||||
+ endjob:
|
||||
+ qemuDomainObjEndJob(driver, vm);
|
||||
+ }
|
||||
|
||||
+ ret = 0;
|
||||
+ cleanup:
|
||||
+ virObjectUnlock(vm);
|
||||
+ qemuDomainEventQueue(driver, event);
|
||||
virObjectUnref(cfg);
|
||||
- return 0;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Thu, 27 Apr 2017 16:29:21 +0200
|
||||
Subject: [PATCH] qemuDomainBuildNamespace: Move /dev/* mountpoints later
|
||||
|
||||
When setting up mount namespace for a qemu domain the following
|
||||
steps are executed:
|
||||
|
||||
1) get list of mountpoints under /dev/
|
||||
2) move them to /var/run/libvirt/qemu/$domName.ext
|
||||
3) start constructing new device tree under /var/run/libvirt/qemu/$domName.dev
|
||||
4) move the mountpoint of the new device tree to /dev
|
||||
5) restore original mountpoints from step 2)
|
||||
|
||||
Note the problem with this approach is that if some device in step
|
||||
3) requires access to a mountpoint from step 2) it will fail as
|
||||
the mountpoint is not there anymore. For instance consider the
|
||||
following domain disk configuration:
|
||||
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='raw'/>
|
||||
<source file='/dev/shm/vhostmd0'/>
|
||||
<target dev='vdb' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
|
||||
</disk>
|
||||
|
||||
In this case operation fails as we are unable to create vhostmd0
|
||||
in the new device tree because after step 2) there is no /dev/shm
|
||||
anymore. Leave aside fact that we shouldn't try to create devices
|
||||
living in other mountpoints. That's a separate bug that will be
|
||||
addressed later.
|
||||
|
||||
Currently, the order described above is rearranged to:
|
||||
|
||||
1) get list of mountpoints under /dev/
|
||||
2) start constructing new device tree under /var/run/libvirt/qemu/$domName.dev
|
||||
3) move them to /var/run/libvirt/qemu/$domName.ext
|
||||
4) move the mountpoint of the new device tree to /dev
|
||||
5) restore original mountpoints from step 3)
|
||||
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Cedric Bosdonnat <cbosdonnat@suse.com>
|
||||
(cherry picked from commit a7cc039dc796f541793955598377807af48341fb)
|
||||
(cherry picked from commit 469bf7cb7a44a0798c63e4b5e4682d8e38bce66e)
|
||||
---
|
||||
src/qemu/qemu_domain.c | 48 ++++++++++++++++++++++++------------------------
|
||||
1 file changed, 24 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index 4a127cedf..64f18f493 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -7854,6 +7854,30 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
|
||||
if (qemuDomainSetupDev(cfg, mgr, vm, devPath) < 0)
|
||||
goto cleanup;
|
||||
|
||||
+ if (qemuDomainSetupAllDisks(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupAllHostdevs(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupAllMemories(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupAllChardevs(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupTPM(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupAllGraphics(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupAllInputs(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ if (qemuDomainSetupAllRNGs(cfg, vm, devPath) < 0)
|
||||
+ goto cleanup;
|
||||
+
|
||||
/* Save some mount points because we want to share them with the host */
|
||||
for (i = 0; i < ndevMountsPath; i++) {
|
||||
struct stat sb;
|
||||
@@ -7881,30 +7905,6 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (qemuDomainSetupAllDisks(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupAllHostdevs(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupAllMemories(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupAllChardevs(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupTPM(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupAllGraphics(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupAllInputs(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
- if (qemuDomainSetupAllRNGs(cfg, vm, devPath) < 0)
|
||||
- goto cleanup;
|
||||
-
|
||||
if (virFileMoveMount(devPath, "/dev") < 0)
|
||||
goto cleanup;
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||
Date: Thu, 5 Oct 2017 17:54:28 +0100
|
||||
Subject: [PATCH] qemu: ensure TLS clients always verify the server certificate
|
||||
|
||||
The default_tls_x509_verify (and related) parameters in qemu.conf
|
||||
control whether the QEMU TLS servers request & verify certificates
|
||||
from clients. This works as a simple access control system for
|
||||
servers by requiring the CA to issue certs to permitted clients.
|
||||
This use of client certificates is disabled by default, since it
|
||||
requires extra work to issue client certificates.
|
||||
|
||||
Unfortunately the code was using this configuration parameter when
|
||||
setting up both TLS clients and servers in QEMU. The result was that
|
||||
TLS clients for character devices and disk devices had verification
|
||||
turned off, meaning they would ignore errors while validating the
|
||||
server certificate.
|
||||
|
||||
This allows for trivial MITM attacks between client and server,
|
||||
as any certificate returned by the attacker will be accepted by
|
||||
the client.
|
||||
|
||||
This is assigned CVE-2017-1000256 / LSN-2017-0002
|
||||
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
||||
(cherry picked from commit 441d3eb6d1be940a67ce45a286602a967601b157)
|
||||
---
|
||||
src/qemu/qemu_command.c | 2 +-
|
||||
tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args | 2 +-
|
||||
.../qemuxml2argv-serial-tcp-tlsx509-secret-chardev.args | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
|
||||
index 311edd13e..141831635 100644
|
||||
--- a/src/qemu/qemu_command.c
|
||||
+++ b/src/qemu/qemu_command.c
|
||||
@@ -727,7 +727,7 @@ qemuBuildTLSx509BackendProps(const char *tlspath,
|
||||
if (virJSONValueObjectCreate(propsret,
|
||||
"s:dir", path,
|
||||
"s:endpoint", (isListen ? "server": "client"),
|
||||
- "b:verify-peer", verifypeer,
|
||||
+ "b:verify-peer", (isListen ? verifypeer : true),
|
||||
NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args
|
||||
index b456cce30..003d11de7 100644
|
||||
--- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-chardev.args
|
||||
@@ -26,7 +26,7 @@ server,nowait \
|
||||
localport=1111 \
|
||||
-device isa-serial,chardev=charserial0,id=serial0 \
|
||||
-object tls-creds-x509,id=objcharserial1_tls0,dir=/etc/pki/libvirt-chardev,\
|
||||
-endpoint=client,verify-peer=no \
|
||||
+endpoint=client,verify-peer=yes \
|
||||
-chardev socket,id=charserial1,host=127.0.0.1,port=5555,\
|
||||
tls-creds=objcharserial1_tls0 \
|
||||
-device isa-serial,chardev=charserial1,id=serial1 \
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-secret-chardev.args b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-secret-chardev.args
|
||||
index 7f9fedb6c..a020ff006 100644
|
||||
--- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-secret-chardev.args
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-tlsx509-secret-chardev.args
|
||||
@@ -31,7 +31,7 @@ localport=1111 \
|
||||
data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
|
||||
keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
|
||||
-object tls-creds-x509,id=objcharserial1_tls0,dir=/etc/pki/libvirt-chardev,\
|
||||
-endpoint=client,verify-peer=no,passwordid=charserial1-secret0 \
|
||||
+endpoint=client,verify-peer=yes,passwordid=charserial1-secret0 \
|
||||
-chardev socket,id=charserial1,host=127.0.0.1,port=5555,\
|
||||
tls-creds=objcharserial1_tls0 \
|
||||
-device isa-serial,chardev=charserial1,id=serial1 \
|
||||
+235
-270
@@ -1,10 +1,12 @@
|
||||
# -*- rpm-spec -*-
|
||||
|
||||
# This spec file assumes you are building on a Fedora or RHEL version
|
||||
# that's still supported by the vendor: that means Fedora 23 or newer,
|
||||
# or RHEL 6 or newer. It may need some tweaks for other distros.
|
||||
# If neither fedora nor rhel was defined, try to guess them from dist
|
||||
%if (0%{?fedora} && 0%{?fedora} >= 23) || (0%{?rhel} && 0%{?rhel} >= 6)
|
||||
# that's still supported by the vendor. It may work on other distros
|
||||
# or versions, but no effort will be made to ensure that going forward.
|
||||
%define min_rhel 6
|
||||
%define min_fedora 26
|
||||
|
||||
%if (0%{?fedora} && 0%{?fedora} >= %{min_fedora}) || (0%{?rhel} && 0%{?rhel} >= %{min_rhel})
|
||||
%define supported_platform 1
|
||||
%else
|
||||
%define supported_platform 0
|
||||
@@ -15,7 +17,6 @@
|
||||
# touch configure.ac or Makefile.am.
|
||||
%{!?enable_autotools:%global enable_autotools 0}
|
||||
|
||||
|
||||
# The hypervisor drivers that run in libvirtd
|
||||
%define with_xen 0%{!?_without_xen:1}
|
||||
%define with_qemu 0%{!?_without_qemu:1}
|
||||
@@ -36,7 +37,7 @@
|
||||
%define with_qemu_tcg 0
|
||||
%define qemu_kvm_arches x86_64
|
||||
%if 0%{?rhel} >= 7
|
||||
%define qemu_kvm_arches x86_64 %{power64} aarch64
|
||||
%define qemu_kvm_arches x86_64 %{power64} aarch64 s390x
|
||||
%endif
|
||||
%endif
|
||||
|
||||
@@ -72,7 +73,7 @@
|
||||
%define with_numactl 0%{!?_without_numactl:1}
|
||||
|
||||
# F25+ has zfs-fuse
|
||||
%if 0%{?fedora} >= 25
|
||||
%if 0%{?fedora}
|
||||
%define with_storage_zfs 0%{!?_without_storage_zfs:1}
|
||||
%else
|
||||
%define with_storage_zfs 0
|
||||
@@ -88,6 +89,7 @@
|
||||
%define with_libssh2 0%{!?_without_libssh2:0}
|
||||
%define with_wireshark 0%{!?_without_wireshark:0}
|
||||
%define with_libssh 0%{!?_without_libssh:0}
|
||||
%define with_bash_completion 0%{!?_without_bash_completion:0}
|
||||
%define with_pm_utils 1
|
||||
|
||||
# Finally set the OS / architecture specific special cases
|
||||
@@ -141,6 +143,10 @@
|
||||
%define with_libxl 0
|
||||
%define with_hyperv 0
|
||||
%define with_vz 0
|
||||
|
||||
%if 0%{?rhel} > 7
|
||||
%define with_lxc 0
|
||||
%endif
|
||||
%endif
|
||||
|
||||
# Fedora 17 / RHEL-7 are first where we use systemd. Although earlier
|
||||
@@ -161,7 +167,7 @@
|
||||
%endif
|
||||
|
||||
# fuse is used to provide virtualized /proc for LXC
|
||||
%if 0%{?fedora} || 0%{?rhel} >= 7
|
||||
%if %{with_lxc} && 0%{?rhel} != 6
|
||||
%define with_fuse 0%{!?_without_fuse:1}
|
||||
%endif
|
||||
|
||||
@@ -185,12 +191,22 @@
|
||||
%if 0%{?fedora}
|
||||
%define with_wireshark 0%{!?_without_wireshark:1}
|
||||
%endif
|
||||
%if 0%{?fedora} || 0%{?rhel} > 7
|
||||
%define wireshark_plugindir %(pkg-config --variable plugindir wireshark)
|
||||
%else
|
||||
%define wireshark_plugindir %{_libdir}/wireshark/plugins
|
||||
%endif
|
||||
|
||||
# Enable libssh transport for new enough distros
|
||||
%if 0%{?fedora}
|
||||
%define with_libssh 0%{!?_without_libssh:1}
|
||||
%endif
|
||||
|
||||
# Enable bash-completion for new enough distros
|
||||
%if 0%{?fedora} || 0%{?rhel} >= 7
|
||||
%define with_bash_completion 0%{!?_without_bash_completion:1}
|
||||
%endif
|
||||
|
||||
|
||||
%if %{with_qemu} || %{with_lxc} || %{with_uml}
|
||||
# numad is used to manage the CPU and memory placement dynamically,
|
||||
@@ -226,70 +242,52 @@
|
||||
%define enable_werror --disable-werror
|
||||
%endif
|
||||
|
||||
%if 0%{?fedora} >= 25
|
||||
%if 0%{?fedora}
|
||||
%define tls_priority "@LIBVIRT,SYSTEM"
|
||||
%else
|
||||
%if 0%{?fedora}
|
||||
%define tls_priority "@SYSTEM"
|
||||
%else
|
||||
%define tls_priority "NORMAL"
|
||||
%endif
|
||||
%define tls_priority "NORMAL"
|
||||
%endif
|
||||
|
||||
|
||||
Summary: Library providing a simple virtualization API
|
||||
Name: libvirt
|
||||
Version: 3.2.1
|
||||
Version: 4.1.0
|
||||
Release: 7%{?dist}%{?extra_release}
|
||||
License: LGPLv2+
|
||||
Group: Development/Libraries
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
||||
URL: http://libvirt.org/
|
||||
URL: https://libvirt.org/
|
||||
|
||||
%if %(echo %{version} | grep -q "\.0$"; echo $?) == 1
|
||||
%define mainturl stable_updates/
|
||||
%endif
|
||||
Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.xz
|
||||
Source: https://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.xz
|
||||
|
||||
# Fix aarch64 gic default for non-kvm VMs (bz #1449837)
|
||||
Patch0001: 0001-tests-Check-default-GIC-version-for-aarch64-virt-TCG.patch
|
||||
Patch0002: 0002-qemu-Use-GICv2-for-aarch64-virt-TCG-guests.patch
|
||||
Patch0003: 0003-gic-Remove-VIR_GIC_VERSION_DEFAULT.patch
|
||||
# Fix resuming qemu VMs suspended before libvirt 3.2.0
|
||||
Patch0004: 0004-Revert-qemu-propagate-bridge-MTU-into-qemu-host_mtu-.patch
|
||||
# Fix issues with AMD CPU models, and some others
|
||||
Patch0005: 0005-cpu-Introduce-virCPUCopyMigratable.patch
|
||||
Patch0006: 0006-qemu-Move-common-code-in-virQEMUCapsInitCPUModel-one.patch
|
||||
Patch0007: 0007-qemu-Add-migratable-parameter-to-virQEMUCapsInitCPUM.patch
|
||||
Patch0008: 0008-qemu-Introduce-virQEMUCapsSetHostModel.patch
|
||||
Patch0009: 0009-qemu-Move-qemuCaps-CPU-data-copying-into-a-separate-.patch
|
||||
Patch0010: 0010-qemu-Introduce-virQEMUCapsHostCPUDataClear.patch
|
||||
Patch0011: 0011-qemu-Move-qemuCaps-host-CPU-data-in-a-struct.patch
|
||||
Patch0012: 0012-qemu-Prepare-qemuCaps-for-multiple-host-CPU-defs.patch
|
||||
Patch0013: 0013-qemu-Pass-migratable-host-CPU-model-to-virCPUUpdate.patch
|
||||
Patch0014: 0014-cpu-Drop-feature-filtering-from-virCPUUpdate.patch
|
||||
Patch0015: 0015-cpu-Introduce-virCPUGetHostIsSupported.patch
|
||||
Patch0016: 0016-qemu-Use-more-data-for-comparing-CPUs.patch
|
||||
|
||||
# Enable ZFS storage driver (bz #1471912)
|
||||
Patch0101: 0101-spec-Add-support-for-building-the-zfs-storage-driver.patch
|
||||
# Don't use cgroup mount points from /proc/mounts that are hidden (bz
|
||||
# #1470593)
|
||||
Patch0102: 0102-Avoid-hidden-cgroup-mount-points.patch
|
||||
# disk driver name=... should be optional (bz #1473091)
|
||||
Patch0103: 0103-docs-schema-make-disk-driver-name-attribute-optional.patch
|
||||
# Fix TPM2 passthrough (bz #1486240)
|
||||
Patch0104: 0104-tpm-Use-dev-null-for-cancel-path-if-none-was-found.patch
|
||||
# Fix spice GL qemu:///system rendernode permissions (bz #1460804)
|
||||
Patch0105: 0105-security-add-MANAGER_MOUNT_NAMESPACE-flag.patch
|
||||
Patch0106: 0106-security-dac-relabel-spice-rendernode.patch
|
||||
# Fix on_reboot=destroy setting (bz #1476866)
|
||||
Patch0107: 0107-qemu-Honour-on_reboot.patch
|
||||
# Fix disk images in /dev/shm (bz #1482146)
|
||||
Patch0108: 0108-qemuDomainBuildNamespace-Move-dev-mountpoints-later.patch
|
||||
# CVE-2017-1000256: libvirt: TLS certificate verification disabled for
|
||||
# clients (bz #1503687)
|
||||
Patch0109: 0109-qemu-ensure-TLS-clients-always-verify-the-server-cer.patch
|
||||
# Fix test suite
|
||||
Patch0001: 0001-cpu-define-the-ssbd-CPUID-feature-bit-CVE-2018-3639.patch
|
||||
# Add new CPU features for speculative store bypass (CVE-2018-3639)
|
||||
Patch0002: 0002-tests-force-use-of-NORMAL-TLS-priority-in-test-suite.patch
|
||||
Patch0003: 0003-cpu-define-the-virt-ssbd-CPUID-feature-bit-CVE-2018-.patch
|
||||
# Fix virtlockd-admin.socket syntax (bz #1586239)
|
||||
Patch0004: 0004-lockd-fix-typo-in-virtlockd-admin.socket.patch
|
||||
# nwfilter: increase pcap buffer size to be compatible with TPACKET_V3 (bz
|
||||
# #1547237)
|
||||
Patch0005: 0005-nwfilter-increase-pcap-buffer-size-to-be-compatible-.patch
|
||||
# Fix *LookupBy* APIs hash races (bz #1621471)
|
||||
Patch0006: 0006-util-don-t-check-for-parallel-iteration-in-hash-rela.patch
|
||||
# ESX: crash when user sets autostart flags to a domain (bz #1611921)
|
||||
Patch0007: 0007-esx-Fix-double-free-and-freeing-static-strings-in-es.patch
|
||||
# Define md-clear CPUID bit (CVE-2018-12126, CVE-2018-12127, CVE-2018-12130,
|
||||
# CVE-2019-11091)
|
||||
Patch0008: 0008-cpu_x86-Do-not-cache-microcode-version.patch
|
||||
Patch0009: 0009-qemu-Don-t-cache-microcode-version.patch
|
||||
Patch0010: 0010-cputest-Add-data-for-Intel-R-Xeon-R-CPU-E3-1225-v5.patch
|
||||
Patch0011: 0011-cpu_map-Define-md-clear-CPUID-bit.patch
|
||||
Patch0012: 0012-cpu-remove-stibp-flag-from-test-data.patch
|
||||
# Fix systemd socket permissions (CVE-2019-10132)
|
||||
Patch0013: 0013-admin-reject-clients-unless-their-UID-matches-the-cu.patch
|
||||
Patch0014: 0014-locking-restrict-sockets-to-mode-0600.patch
|
||||
Patch0015: 0015-logging-restrict-sockets-to-mode-0600.patch
|
||||
|
||||
Requires: libvirt-daemon = %{version}-%{release}
|
||||
Requires: libvirt-daemon-config-network = %{version}-%{release}
|
||||
@@ -332,7 +330,11 @@ BuildRequires: libtool
|
||||
BuildRequires: /usr/bin/pod2man
|
||||
%endif
|
||||
BuildRequires: git
|
||||
%if 0%{?fedora} >= 27 || 0%{?rhel} > 7
|
||||
BuildRequires: perl-interpreter
|
||||
%else
|
||||
BuildRequires: perl
|
||||
%endif
|
||||
BuildRequires: python
|
||||
%if %{with_systemd}
|
||||
BuildRequires: systemd-units
|
||||
@@ -341,9 +343,11 @@ BuildRequires: systemd-units
|
||||
BuildRequires: xen-devel
|
||||
%endif
|
||||
BuildRequires: libxml2-devel
|
||||
BuildRequires: xhtml1-dtds
|
||||
BuildRequires: libxslt
|
||||
BuildRequires: readline-devel
|
||||
%if %{with_bash_completion}
|
||||
BuildRequires: bash-completion >= 2.0
|
||||
%endif
|
||||
BuildRequires: ncurses-devel
|
||||
BuildRequires: gettext
|
||||
BuildRequires: libtasn1-devel
|
||||
@@ -478,17 +482,18 @@ BuildRequires: numad
|
||||
%endif
|
||||
|
||||
%if %{with_wireshark}
|
||||
%if 0%{fedora} >= 24
|
||||
BuildRequires: wireshark-devel >= 2.1.0
|
||||
%else
|
||||
BuildRequires: wireshark-devel >= 1.12.1
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%if %{with_libssh}
|
||||
BuildRequires: libssh-devel >= 0.7.0
|
||||
%endif
|
||||
|
||||
%if 0%{?fedora} > 27 || 0%{?rhel} > 7
|
||||
BuildRequires: rpcgen
|
||||
BuildRequires: libtirpc-devel
|
||||
%endif
|
||||
|
||||
Provides: bundled(gnulib)
|
||||
|
||||
%description
|
||||
@@ -821,7 +826,7 @@ Requires: gzip
|
||||
Requires: bzip2
|
||||
Requires: lzop
|
||||
Requires: xz
|
||||
%if 0%{?fedora} >= 24
|
||||
%if 0%{?fedora} || 0%{?rhel} > 7
|
||||
Requires: systemd-container
|
||||
%endif
|
||||
|
||||
@@ -839,7 +844,7 @@ Group: Development/Libraries
|
||||
Requires: libvirt-daemon = %{version}-%{release}
|
||||
# There really is a hard cross-driver dependency here
|
||||
Requires: libvirt-daemon-driver-network = %{version}-%{release}
|
||||
%if 0%{?fedora} >= 24
|
||||
%if 0%{?fedora} || 0%{?rhel} > 7
|
||||
Requires: systemd-container
|
||||
%endif
|
||||
|
||||
@@ -1044,6 +1049,9 @@ Requires: gnutls-utils
|
||||
# Needed for probing the power management features of the host.
|
||||
Requires: pm-utils
|
||||
%endif
|
||||
%if %{with_bash_completion}
|
||||
Requires: %{name}-bash-completion = %{version}-%{release}
|
||||
%endif
|
||||
|
||||
%description client
|
||||
The client binaries needed to access the virtualization
|
||||
@@ -1068,10 +1076,22 @@ Summary: Set of tools to control libvirt daemon
|
||||
Group: Development/Libraries
|
||||
Requires: %{name}-libs = %{version}-%{release}
|
||||
Requires: readline
|
||||
%if %{with_bash_completion}
|
||||
Requires: %{name}-bash-completion = %{version}-%{release}
|
||||
%endif
|
||||
|
||||
%description admin
|
||||
The client side utilities to control the libvirt daemon.
|
||||
|
||||
%if %{with_bash_completion}
|
||||
%package bash-completion
|
||||
Summary: Bash completion script
|
||||
Group: Development/Libraries
|
||||
|
||||
%description bash-completion
|
||||
Bash completion script stub.
|
||||
%endif
|
||||
|
||||
%if %{with_wireshark}
|
||||
%package wireshark
|
||||
Summary: Wireshark dissector plugin for libvirt RPC transactions
|
||||
@@ -1129,10 +1149,6 @@ Libvirt plugin for NSS for translating domain names into IP addresses.
|
||||
|
||||
|
||||
%prep
|
||||
%if ! %{supported_platform}
|
||||
echo "This RPM requires either Fedora >= 20 or RHEL >= 6"
|
||||
exit 1
|
||||
%endif
|
||||
|
||||
%setup -q
|
||||
|
||||
@@ -1173,6 +1189,11 @@ rm -f $PATCHLIST
|
||||
rm -rf .git
|
||||
|
||||
%build
|
||||
%if ! %{supported_platform}
|
||||
echo "This RPM requires either Fedora >= %{min_fedora} or RHEL >= %{min_rhel}"
|
||||
exit 1
|
||||
%endif
|
||||
|
||||
%if %{with_xen}
|
||||
%define arg_xen --with-xen
|
||||
%else
|
||||
@@ -1193,8 +1214,10 @@ rm -rf .git
|
||||
|
||||
%if %{with_lxc}
|
||||
%define arg_lxc --with-lxc
|
||||
%define arg_login_shell --with-login-shell
|
||||
%else
|
||||
%define arg_lxc --without-lxc
|
||||
%define arg_login_shell --without-login-shell
|
||||
%endif
|
||||
|
||||
%if %{with_vbox}
|
||||
@@ -1337,6 +1360,8 @@ rm -rf .git
|
||||
|
||||
# place macros above and build commands below this comment
|
||||
|
||||
export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec)
|
||||
|
||||
%if 0%{?enable_autotools}
|
||||
autoreconf -if
|
||||
%endif
|
||||
@@ -1402,19 +1427,22 @@ rm -f po/stamp-po
|
||||
%{?arg_loader_nvram} \
|
||||
%{?enable_werror} \
|
||||
--enable-expensive-tests \
|
||||
%{arg_init_script}
|
||||
make %{?_smp_mflags}
|
||||
%{arg_init_script} \
|
||||
%{?arg_login_shell}
|
||||
make %{?_smp_mflags} V=1
|
||||
gzip -9 ChangeLog
|
||||
|
||||
%install
|
||||
rm -fr %{buildroot}
|
||||
|
||||
export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec)
|
||||
|
||||
# Avoid using makeinstall macro as it changes prefixes rather than setting
|
||||
# DESTDIR. Newer make_install macro would be better but it's not available
|
||||
# on RHEL 5, thus we need to expand it here.
|
||||
make %{?_smp_mflags} install DESTDIR=%{?buildroot} SYSTEMD_UNIT_DIR=%{_unitdir}
|
||||
make %{?_smp_mflags} install DESTDIR=%{?buildroot} SYSTEMD_UNIT_DIR=%{_unitdir} V=1
|
||||
|
||||
make %{?_smp_mflags} -C examples distclean
|
||||
make %{?_smp_mflags} -C examples distclean V=1
|
||||
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
|
||||
@@ -1425,13 +1453,7 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/connection-driver/*.a
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/storage-backend/*.la
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/storage-backend/*.a
|
||||
%if %{with_wireshark}
|
||||
%if 0%{fedora} >= 24
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/wireshark/plugins/libvirt.la
|
||||
%else
|
||||
rm -f $RPM_BUILD_ROOT%{_libdir}/wireshark/plugins/*/libvirt.la
|
||||
mv $RPM_BUILD_ROOT%{_libdir}/wireshark/plugins/*/libvirt.so \
|
||||
$RPM_BUILD_ROOT%{_libdir}/wireshark/plugins/libvirt.so
|
||||
%endif
|
||||
rm -f $RPM_BUILD_ROOT%{wireshark_plugindir}/libvirt.la
|
||||
%endif
|
||||
|
||||
install -d -m 0755 $RPM_BUILD_ROOT%{_datadir}/lib/libvirt/dnsmasq/
|
||||
@@ -1527,13 +1549,17 @@ exit 0
|
||||
|
||||
%if %{with_systemd}
|
||||
%if %{with_systemd_macros}
|
||||
%systemd_post virtlockd.socket virtlogd.socket libvirtd.service
|
||||
%systemd_post virtlockd.socket virtlockd-admin.socket
|
||||
%systemd_post virtlogd.socket virtlogd-admin.socket
|
||||
%systemd_post libvirtd.service
|
||||
%else
|
||||
if [ $1 -eq 1 ] ; then
|
||||
# Initial installation
|
||||
/bin/systemctl enable \
|
||||
virtlockd.socket \
|
||||
virtlockd-admin.socket \
|
||||
virtlogd.socket \
|
||||
virtlogd-admin.socket \
|
||||
libvirtd.service >/dev/null 2>&1 || :
|
||||
fi
|
||||
%endif
|
||||
@@ -1553,24 +1579,34 @@ fi
|
||||
/sbin/chkconfig --add virtlockd
|
||||
%endif
|
||||
|
||||
# request daemon restart in posttrans
|
||||
mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || :
|
||||
touch %{_localstatedir}/lib/rpm-state/libvirt/restart || :
|
||||
|
||||
%preun daemon
|
||||
%if %{with_systemd}
|
||||
%if %{with_systemd_macros}
|
||||
%systemd_preun libvirtd.service virtlogd.socket virtlogd.service virtlockd.socket virtlockd.service
|
||||
%systemd_preun libvirtd.service
|
||||
%systemd_preun virtlogd.socket virtlogd-admin.socket virtlogd.service
|
||||
%systemd_preun virtlockd.socket virtlockd-admin.socket virtlockd.service
|
||||
%else
|
||||
if [ $1 -eq 0 ] ; then
|
||||
# Package removal, not upgrade
|
||||
/bin/systemctl --no-reload disable \
|
||||
libvirtd.service \
|
||||
virtlogd.socket \
|
||||
virtlogd-admin.socket \
|
||||
virtlogd.service \
|
||||
virtlockd.socket \
|
||||
virtlockd-admin.socket \
|
||||
virtlockd.service > /dev/null 2>&1 || :
|
||||
/bin/systemctl stop \
|
||||
libvirtd.service \
|
||||
virtlogd.socket \
|
||||
virtlogd-admin.socket \
|
||||
virtlogd.service \
|
||||
virtlockd.socket \
|
||||
virtlockd-admin.socket \
|
||||
virtlockd.service > /dev/null 2>&1 || :
|
||||
fi
|
||||
%endif
|
||||
@@ -1591,23 +1627,11 @@ fi
|
||||
if [ $1 -ge 1 ] ; then
|
||||
/bin/systemctl reload-or-try-restart virtlockd.service >/dev/null 2>&1 || :
|
||||
/bin/systemctl reload-or-try-restart virtlogd.service >/dev/null 2>&1 || :
|
||||
/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || :
|
||||
fi
|
||||
%else
|
||||
if [ $1 -ge 1 ]; then
|
||||
/sbin/service virtlockd reload > /dev/null 2>&1 || :
|
||||
/sbin/service virtlogd reload > /dev/null 2>&1 || :
|
||||
/sbin/service libvirtd condrestart > /dev/null 2>&1
|
||||
fi
|
||||
%endif
|
||||
|
||||
%if %{with_systemd}
|
||||
%else
|
||||
%triggerpostun daemon -- libvirt-daemon < 1.2.1
|
||||
if [ "$1" -ge "1" ]; then
|
||||
/sbin/service virtlockd reload > /dev/null 2>&1 || :
|
||||
/sbin/service virtlogd reload > /dev/null 2>&1 || :
|
||||
/sbin/service libvirtd condrestart > /dev/null 2>&1
|
||||
fi
|
||||
%endif
|
||||
|
||||
@@ -1618,18 +1642,30 @@ fi
|
||||
%triggerpostun daemon -- libvirt-daemon < 1.3.0
|
||||
if [ $1 -ge 1 ] ; then
|
||||
%if %{with_systemd}
|
||||
/bin/systemctl is-enabled libvirtd.service 1>/dev/null 2>&1 &&
|
||||
/bin/systemctl enable virtlogd.socket || :
|
||||
/bin/systemctl is-active libvirtd.service 1>/dev/null 2>&1 &&
|
||||
/bin/systemctl start virtlogd.socket || :
|
||||
/bin/systemctl is-enabled libvirtd.service 1>/dev/null 2>&1 &&
|
||||
/bin/systemctl enable virtlogd.socket virtlogd-admin.socket || :
|
||||
/bin/systemctl is-active libvirtd.service 1>/dev/null 2>&1 &&
|
||||
/bin/systemctl start virtlogd.socket virtlogd-admin.socket || :
|
||||
%else
|
||||
/sbin/chkconfig libvirtd 1>/dev/null 2>&1 &&
|
||||
/sbin/chkconfig virtlogd on || :
|
||||
/sbin/service libvirtd status 1>/dev/null 2>&1 &&
|
||||
/sbin/service virtlogd start || :
|
||||
/sbin/chkconfig libvirtd 1>/dev/null 2>&1 &&
|
||||
/sbin/chkconfig virtlogd on || :
|
||||
/sbin/service libvirtd status 1>/dev/null 2>&1 &&
|
||||
/sbin/service virtlogd start || :
|
||||
/sbin/service virtlockd reload > /dev/null 2>&1 || :
|
||||
/sbin/service virtlogd reload > /dev/null 2>&1 || :
|
||||
%endif
|
||||
fi
|
||||
|
||||
%posttrans daemon
|
||||
if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then
|
||||
%if %{with_systemd}
|
||||
/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || :
|
||||
%else
|
||||
/sbin/service libvirtd condrestart > /dev/null 2>&1 || :
|
||||
%endif
|
||||
fi
|
||||
rm -rf %{_localstatedir}/lib/rpm-state/libvirt || :
|
||||
|
||||
%post daemon-config-network
|
||||
if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ; then
|
||||
# see if the network used by default network creates a conflict,
|
||||
@@ -1668,23 +1704,35 @@ if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ;
|
||||
ln -s ../default.xml %{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml
|
||||
|
||||
# Make sure libvirt picks up the new network defininiton
|
||||
mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || :
|
||||
touch %{_localstatedir}/lib/rpm-state/libvirt/restart || :
|
||||
fi
|
||||
|
||||
%posttrans daemon-config-network
|
||||
if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then
|
||||
%if %{with_systemd}
|
||||
/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 ||:
|
||||
/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || :
|
||||
%else
|
||||
/sbin/service libvirtd condrestart > /dev/null 2>&1 || :
|
||||
%endif
|
||||
|
||||
fi
|
||||
|
||||
rm -rf %{_localstatedir}/lib/rpm-state/libvirt || :
|
||||
|
||||
%post daemon-config-nwfilter
|
||||
cp %{_datadir}/libvirt/nwfilter/*.xml %{_sysconfdir}/libvirt/nwfilter/
|
||||
# Make sure libvirt picks up the new nwfilter defininitons
|
||||
mkdir -p %{_localstatedir}/lib/rpm-state/libvirt || :
|
||||
touch %{_localstatedir}/lib/rpm-state/libvirt/restart || :
|
||||
|
||||
%posttrans daemon-config-nwfilter
|
||||
if [ -f %{_localstatedir}/lib/rpm-state/libvirt/restart ]; then
|
||||
%if %{with_systemd}
|
||||
/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 ||:
|
||||
/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || :
|
||||
%else
|
||||
/sbin/service libvirtd condrestart > /dev/null 2>&1 || :
|
||||
%endif
|
||||
fi
|
||||
rm -rf %{_localstatedir}/lib/rpm-state/libvirt || :
|
||||
|
||||
|
||||
%if %{with_systemd}
|
||||
@@ -1774,7 +1822,7 @@ exit 0
|
||||
%files
|
||||
|
||||
%files docs
|
||||
%doc AUTHORS ChangeLog.gz NEWS README TODO
|
||||
%doc AUTHORS ChangeLog.gz NEWS README README.md
|
||||
%doc libvirt-docs/*
|
||||
|
||||
# API docs
|
||||
@@ -1804,14 +1852,15 @@ exit 0
|
||||
%{_unitdir}/virt-guest-shutdown.target
|
||||
%{_unitdir}/virtlogd.service
|
||||
%{_unitdir}/virtlogd.socket
|
||||
%{_unitdir}/virtlogd-admin.socket
|
||||
%{_unitdir}/virtlockd.service
|
||||
%{_unitdir}/virtlockd.socket
|
||||
%{_unitdir}/virtlockd-admin.socket
|
||||
%else
|
||||
%{_sysconfdir}/rc.d/init.d/libvirtd
|
||||
%{_sysconfdir}/rc.d/init.d/virtlogd
|
||||
%{_sysconfdir}/rc.d/init.d/virtlockd
|
||||
%endif
|
||||
%doc daemon/libvirtd.upstart
|
||||
%config(noreplace) %{_sysconfdir}/sysconfig/libvirtd
|
||||
%config(noreplace) %{_sysconfdir}/sysconfig/virtlogd
|
||||
%config(noreplace) %{_sysconfdir}/sysconfig/virtlockd
|
||||
@@ -1831,6 +1880,8 @@ exit 0
|
||||
%dir %attr(0711, root, root) %{_localstatedir}/cache/libvirt/
|
||||
|
||||
|
||||
%dir %attr(0755, root, root) %{_libdir}/libvirt/
|
||||
%dir %attr(0755, root, root) %{_libdir}/libvirt/connection-driver/
|
||||
%dir %attr(0755, root, root) %{_libdir}/libvirt/lock-driver
|
||||
%attr(0755, root, root) %{_libdir}/libvirt/lock-driver/lockd.so
|
||||
|
||||
@@ -1860,6 +1911,7 @@ exit 0
|
||||
%{_mandir}/man8/libvirtd.8*
|
||||
%{_mandir}/man8/virtlogd.8*
|
||||
%{_mandir}/man8/virtlockd.8*
|
||||
%{_mandir}/man7/virkey*.7*
|
||||
|
||||
%doc examples/polkit/*.rules
|
||||
|
||||
@@ -2054,6 +2106,10 @@ exit 0
|
||||
%{_datadir}/systemtap/tapset/libvirt_qemu_probes*.stp
|
||||
%{_datadir}/systemtap/tapset/libvirt_functions.stp
|
||||
|
||||
%if %{with_bash_completion}
|
||||
%{_datadir}/bash-completion/completions/virsh
|
||||
%endif
|
||||
|
||||
|
||||
%if %{with_systemd}
|
||||
%{_unitdir}/libvirt-guests.service
|
||||
@@ -2064,7 +2120,9 @@ exit 0
|
||||
%attr(0755, root, root) %{_libexecdir}/libvirt-guests.sh
|
||||
|
||||
%files libs -f %{name}.lang
|
||||
%doc COPYING COPYING.LESSER
|
||||
# RHEL6 doesn't have 'license' macro
|
||||
%{!?_licensedir:%global license %%doc}
|
||||
%license COPYING COPYING.LESSER
|
||||
%config(noreplace) %{_sysconfdir}/libvirt/libvirt.conf
|
||||
%config(noreplace) %{_sysconfdir}/libvirt/libvirt-admin.conf
|
||||
%{_libdir}/libvirt.so.*
|
||||
@@ -2101,11 +2159,18 @@ exit 0
|
||||
%files admin
|
||||
%{_mandir}/man1/virt-admin.1*
|
||||
%{_bindir}/virt-admin
|
||||
%if %{with_bash_completion}
|
||||
%{_datadir}/bash-completion/completions/virt-admin
|
||||
%endif
|
||||
|
||||
%if %{with_bash_completion}
|
||||
%files bash-completion
|
||||
%{_datadir}/bash-completion/completions/vsh
|
||||
%endif
|
||||
|
||||
%if %{with_wireshark}
|
||||
%files wireshark
|
||||
%{_libdir}/wireshark/plugins/libvirt.so
|
||||
%{wireshark_plugindir}/libvirt.so
|
||||
%endif
|
||||
|
||||
%files nss
|
||||
@@ -2157,36 +2222,74 @@ exit 0
|
||||
|
||||
|
||||
%changelog
|
||||
* Mon Dec 04 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-7
|
||||
- CVE-2017-1000256: libvirt: TLS certificate verification disabled for
|
||||
clients (bz #1503687)
|
||||
* Tue May 21 2019 Daniel P. Berrangé <berrange@redhat.com> - 4.1.0-7
|
||||
- Fix systemd socket permissions
|
||||
- Resolves: rhbz #1712498 (CVE-2019-10132)
|
||||
|
||||
* Fri Sep 15 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-6
|
||||
- Fix TPM2 passthrough (bz #1486240)
|
||||
- Fix spice GL qemu:///system rendernode permissions (bz #1460804)
|
||||
- Fix on_reboot=destroy setting (bz #1476866)
|
||||
- Fix disk images in /dev/shm (bz #1482146)
|
||||
* Tue May 14 2019 Daniel P. Berrangé <berrange@redhat.com> - 4.1.0-6
|
||||
- Define md-clear CPUID bit
|
||||
- Resolves: rhbz #1709977 (CVE-2018-12126), rhbz #1709979 (CVE-2018-12127),
|
||||
rhbz #1709997 (CVE-2018-12130), rhbz #1709984 (CVE-2019-11091)
|
||||
|
||||
* Fri Aug 04 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-5
|
||||
- Enable ZFS storage driver (bz #1471912)
|
||||
- Don't use cgroup mount points from /proc/mounts that are hidden (bz
|
||||
#1470593)
|
||||
- disk driver name=... should be optional (bz #1473091)
|
||||
* Thu Aug 23 2018 Cole Robinson <crobinso@redhat.com> - 4.1.0-5
|
||||
- Fix *LookupBy* APIs hash races (bz #1621471)
|
||||
- ESX: crash when user sets autostart flags to a domain (bz #1611921)
|
||||
|
||||
* Wed Jul 12 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-4
|
||||
- Fix resuming qemu VMs suspended before libvirt 3.2.0
|
||||
- Fix issues with AMD CPU models, and some others
|
||||
* Tue Jul 03 2018 Cole Robinson <crobinso@redhat.com> - 4.1.0-4
|
||||
- Fix virtlockd-admin.socket syntax (bz #1586239)
|
||||
- nwfilter: increase pcap buffer size to be compatible with TPACKET_V3 (bz
|
||||
#1547237)
|
||||
|
||||
* Wed May 31 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-3
|
||||
- Tweak condition for not starting in live environment (bz #1146232)
|
||||
* Mon Jun 18 2018 Daniel P. Berrangé <berrange@redhat.com> - 4.1.0-3
|
||||
- Add new CPU features for speculative store bypass (CVE-2018-3639)
|
||||
|
||||
* Tue May 30 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-2
|
||||
- Fix aarch64 gic default for non-kvm VMs (bz #1449837)
|
||||
- Don't run libvirtd in live environment, to avoid network collision (bz
|
||||
#1146232)
|
||||
* Wed Mar 21 2018 Daniel P. Berrangé <berrange@redhat.com> - 4.1.0-2
|
||||
- Fix systemd macro argument with line continuations (rhbz#1558648)
|
||||
|
||||
* Wed May 10 2017 Cole Robinson <crobinso@redhat.com> - 3.2.1-1
|
||||
- Rebased to version 3.2.1
|
||||
* Mon Mar 5 2018 Daniel Berrange <berrange@redhat.com> - 4.1.0-1
|
||||
- Rebase to version 4.1.0
|
||||
|
||||
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||
|
||||
* Fri Jan 19 2018 Daniel P. Berrange <berrange@redhat.com> - 4.0.0-1
|
||||
- Rebase to version 4.0.0
|
||||
|
||||
* Wed Dec 20 2017 Cole Robinson <crobinso@redhat.com> - 3.10.0-2
|
||||
- Rebuild for xen 4.10
|
||||
|
||||
* Tue Dec 5 2017 Daniel P. Berrange <berrange@redhat.com> - 3.10.0-1
|
||||
- Rebase to version 3.10.0
|
||||
|
||||
* Fri Nov 3 2017 Daniel P. Berrange <berrange@redhat.com> - 3.9.0-1
|
||||
- Rebase to version 3.9.0
|
||||
|
||||
* Wed Oct 4 2017 Daniel P. Berrange <berrange@redhat.com> - 3.8.0-1
|
||||
- Rebase to version 3.8.0
|
||||
|
||||
* Mon Sep 4 2017 Daniel P. Berrange <berrange@redhat.com> - 3.7.0-1
|
||||
- Rebase to version 3.7.0
|
||||
|
||||
* Wed Aug 2 2017 Daniel P. Berrange <berrange@redhat.com> - 3.6.0-1
|
||||
- Rebase to version 3.6.0
|
||||
|
||||
* Sun Jul 30 2017 Florian Weimer <fweimer@redhat.com> - 3.5.0-4
|
||||
- Rebuild with binutils fix for ppc64le (#1475636)
|
||||
|
||||
* Tue Jul 25 2017 Daniel P. Berrange <berrange@redhat.com> - 3.5.0-3
|
||||
- Disabled RBD on i386, arm, ppc64 (rhbz #1474743)
|
||||
|
||||
* Mon Jul 17 2017 Cole Robinson <crobinso@redhat.com> - 3.5.0-2
|
||||
- Rebuild for xen 4.9
|
||||
|
||||
* Thu Jul 6 2017 Daniel P. Berrange <berrange@redhat.com> - 3.5.0-1
|
||||
- Rebase to version 3.5.0
|
||||
|
||||
* Fri Jun 2 2017 Daniel P. Berrange <berrange@redhat.com> - 3.4.0-1
|
||||
- Rebase to version 3.4.0
|
||||
|
||||
* Mon May 8 2017 Daniel P. Berrange <berrange@redhat.com> - 3.3.0-1
|
||||
- Rebase to version 3.3.0
|
||||
|
||||
* Mon Apr 3 2017 Daniel P. Berrange <berrange@redhat.com> - 3.2.0-1
|
||||
- Rebase to version 3.2.0
|
||||
@@ -2199,141 +2302,3 @@ exit 0
|
||||
|
||||
* Thu Jan 19 2017 Daniel P. Berrange <berrange@redhat.com> - 3.0.0-1
|
||||
- Rebase to version 3.0.0
|
||||
|
||||
* Thu Jan 12 2017 Igor Gnatenko <ignatenko@redhat.com> - 2.5.0-3
|
||||
- Rebuild for readline 7.x
|
||||
|
||||
* Thu Dec 8 2016 Daniel P. Berrange <berrange@redhat.com> - 2.5.0-2
|
||||
- Rebuild to pick up new libxen* soname
|
||||
|
||||
* Mon Dec 5 2016 Daniel P. Berrange <berrange@redhat.com> - 2.5.0-1
|
||||
- Rebase to version 2.5.0
|
||||
|
||||
* Wed Nov 2 2016 Daniel P. Berrange <berrange@redhat.com> - 2.4.0-1
|
||||
- Rebase to version 2.4.0
|
||||
|
||||
* Thu Oct 6 2016 Daniel P. Berrange <berrange@redhat.com> - 2.3.0-1
|
||||
- Rebase to version 2.3.0
|
||||
|
||||
* Mon Sep 5 2016 Daniel P. Berrange <berrange@redhat.com> - 2.2.0-1
|
||||
- Rebase to version 2.2.0
|
||||
|
||||
* Tue Aug 2 2016 Daniel P. Berrange <berrange@redhat.com> - 2.1.0-1
|
||||
- Rebase to version 2.1.0
|
||||
|
||||
* Sat Jul 23 2016 Richard W.M. Jones <rjones@redhat.com> - 2.0.0-2
|
||||
- Rebuild to attempt to fix 'nothing provides libxenctrl.so.4.6()(64bit) needed
|
||||
by libvirt-daemon-2.0.0-1.fc25.x86_64'
|
||||
|
||||
* Fri Jul 1 2016 Daniel P. Berrange <berrange@redhat.com> - 2.0.0-1
|
||||
- Rebase to version 2.0.0
|
||||
- Temporarily disable wireshark plugin due to broken wireshark headers (rhbz #1351984)
|
||||
|
||||
* Mon Jun 13 2016 Richard W.M. Jones <rjones@redhat.com> - 1.3.5-2
|
||||
- Rebuild against new glibc
|
||||
(see https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/VUOTESHSWFRCYPXIVG6BSMAUITS7QCK2/).
|
||||
|
||||
* Mon Jun 6 2016 Daniel P. Berrange <berrange@redhat.com> - 1.3.5-1
|
||||
- Rebase to version 1.3.5
|
||||
- Pull in refactored, simplified spec file from upstream
|
||||
|
||||
* Fri May 20 2016 Cole Robinson <crobinso@redhat.com> - 1.3.4-2
|
||||
- Fix libxl video config via virt-install (bz #1334557)
|
||||
- Advertise fedora edk2 firmware builds to apps (bz #1335395)
|
||||
|
||||
* Mon May 02 2016 Cole Robinson <crobinso@redhat.com> - 1.3.4-1
|
||||
- Rebased to version 1.3.4
|
||||
|
||||
* Tue Apr 19 2016 Cole Robinson <crobinso@redhat.com> - 1.3.3-3
|
||||
- Fix 200ms performance problem when waiting for monitor socket of new domains.
|
||||
|
||||
* Thu Apr 14 2016 Cole Robinson <crobinso@redhat.com> - 1.3.3-2
|
||||
- libvirt assigns same address to two PCI devices (bz #1325085)
|
||||
- Fix build with -Werror
|
||||
|
||||
* Thu Apr 07 2016 Cole Robinson <crobinso@redhat.com> - 1.3.3-1
|
||||
- Rebased to version 1.3.3
|
||||
|
||||
* Thu Mar 17 2016 Cole Robinson <crobinso@redhat.com> - 1.3.2-3
|
||||
- Fix qemu:///session disconnect after 30 seconds
|
||||
- Fix 'permission denied' errors trying to unlink disk images (bz #1289327)
|
||||
- Fix qemu:///session connect race failures (bz #1271183)
|
||||
- driver: log missing modules as INFO, not WARN (bz #1274849)
|
||||
|
||||
* Wed Mar 9 2016 Richard W.M. Jones <rjones@redhat.com> - 1.3.2-2
|
||||
- Add fix for RHBZ#1315606.
|
||||
|
||||
* Tue Mar 1 2016 Daniel Berrange <berrange@redhat.com> - 1.3.2-1
|
||||
- Update to 1.3.2 release
|
||||
|
||||
* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 1.3.1-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
|
||||
|
||||
* Tue Jan 19 2016 Daniel Berrange <berrange@redhat.com> - 1.3.1-1
|
||||
- Update to 1.3.1 release
|
||||
|
||||
* Wed Dec 9 2015 Daniel Berrange <berrange@redhat.com> - 1.3.0-1
|
||||
- Update to 1.3.0 release
|
||||
|
||||
* Wed Nov 11 2015 Cole Robinson <crobinso@redhat.com> - 1.2.21-1
|
||||
- Update to 1.2.21 release
|
||||
|
||||
* Sun Oct 11 2015 Cole Robinson <crobinso@redhat.com> - 1.2.20-2
|
||||
- Rebuild for xen 4.6
|
||||
|
||||
* Fri Oct 2 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.20-1
|
||||
- Update to 1.2.20 release
|
||||
|
||||
* Wed Sep 2 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.19-1
|
||||
- Update to 1.2.19 release
|
||||
|
||||
* Tue Aug 4 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.18-1
|
||||
- Update to 1.2.18 release
|
||||
|
||||
* Wed Jul 29 2015 Richard W.M. Jones <rjones@redhat.com> - 1.2.17-2
|
||||
- Fix 'Cannot write data: Broken pipe [code=38 domain=7]' (RHBZ#1247746).
|
||||
|
||||
* Tue Jul 14 2015 Cole Robinson <crobinso@redhat.com> - 1.2.17-1
|
||||
- numerous improvements and refactoring of the parallels driver
|
||||
- hardening of vcpu code
|
||||
- hardening of migration code
|
||||
- a lot of improvement and bug fixes
|
||||
|
||||
* Sun Jul 12 2015 Peter Robinson <pbrobinson@fedoraproject.org> 1.2.16-3
|
||||
- Rebuild (aarch64)
|
||||
|
||||
* Tue Jun 16 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.16-2
|
||||
- Rebuild for libwsman soname bump
|
||||
|
||||
* Mon Jun 01 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.16-1
|
||||
- Update to 1.2.16 release
|
||||
|
||||
* Thu May 07 2015 Richard W.M. Jones <rjones@redhat.com> - 1.2.15-2
|
||||
- Add Cole Robinson's patch to fix arch selection (bz# 1219198, bz#1219191)
|
||||
|
||||
* Mon May 04 2015 Cole Robinson <crobinso@redhat.com> - 1.2.15-1
|
||||
- Rebased to version 1.2.15
|
||||
|
||||
* Wed Apr 15 2015 Cole Robinson <crobinso@redhat.com> - 1.2.14-2
|
||||
- Fix LXC domain startup (bz #1210397)
|
||||
- Fix race starting multiple session daemons (bz #1200149)
|
||||
- Fix change-media success messages
|
||||
- Strip invalid control codes from XML (bz #1066564, bz #1184131)
|
||||
|
||||
* Thu Apr 02 2015 Cole Robinson <crobinso@redhat.com> - 1.2.14-1
|
||||
- Rebased to version 1.2.14
|
||||
|
||||
* Tue Mar 10 2015 Cole Robinson <crobinso@redhat.com> - 1.2.13-2
|
||||
- Fix connecting to qemu:///session (bz #1198244)
|
||||
|
||||
* Mon Mar 02 2015 Cole Robinson <crobinso@redhat.com> - 1.2.13-1
|
||||
- Rebased to version 1.2.13
|
||||
- lot of improvements around NUMA code
|
||||
- a lot of improvement and bug fixes
|
||||
|
||||
* Tue Feb 3 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.12-2
|
||||
- Rebuild for changed xen soname
|
||||
|
||||
* Tue Jan 27 2015 Daniel P. Berrange <berrange@redhat.com> - 1.2.12-1
|
||||
- Update to 1.2.12 release
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
SHA512 (libvirt-3.2.1.tar.xz) = 4ec4faceedcad3a5419e91444b0c83adcbed0ff6482fb53c058a75412064de69e09fd096de4a30b8c1149da6ba03287b10e8af925b01d725e655658035e43d9a
|
||||
SHA512 (libvirt-4.1.0.tar.xz) = 62d1a228adf3270cc6defe3cbf92dac8c4ce2c434c4d97219571ccef799a4f6304cfd1ba9938338356641285f53ac71145d7b398523021c5ea1dc8e3d49cf894
|
||||
|
||||
Reference in New Issue
Block a user