Richard W.M. Jones
2017-Jan-17 14:04 UTC
[Libguestfs] [PATCH 0/2] lib: appliance: qemu 2.9.0 supports TCG with -cpu host on x86 (RHBZ#1277744).
NB: This requires a qemu patch by Eduardo which is currently awaiting review: https://www.mail-archive.com/qemu-devel@nongnu.org/msg422959.html So not to be applied yet unless that qemu change goes upstream. Rich.
Richard W.M. Jones
2017-Jan-17 14:04 UTC
[Libguestfs] [PATCH 1/2] lib: appliance: Pass qemu version to guestfs_int_get_cpu_model function.
Pass the qemu version struct to this function so that in future we can
make decisions here based on the version of qemu.
---
src/appliance-cpu.c | 2 +-
src/guestfs-internal.h | 2 +-
src/launch-direct.c | 3 ++-
src/launch-libvirt.c | 3 ++-
4 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/appliance-cpu.c b/src/appliance-cpu.c
index 6a9fb0d..a7cf1eb 100644
--- a/src/appliance-cpu.c
+++ b/src/appliance-cpu.c
@@ -68,7 +68,7 @@
* =back
*/
const char *
-guestfs_int_get_cpu_model (int kvm)
+guestfs_int_get_cpu_model (int kvm, const struct version *qemu_version)
{
#if defined(__aarch64__)
/* With -M virt, the default -cpu is cortex-a15. Stupid. */
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
index 40dad35..6e314ea 100644
--- a/src/guestfs-internal.h
+++ b/src/guestfs-internal.h
@@ -833,7 +833,7 @@ extern const char *guestfs_int_drive_protocol_to_string
(enum drive_protocol pro
extern int guestfs_int_build_appliance (guestfs_h *g, char **kernel, char
**initrd, char **appliance);
/* appliance-cpu.c */
-const char *guestfs_int_get_cpu_model (int kvm);
+const char *guestfs_int_get_cpu_model (int kvm, const struct version
*qemu_version);
/* appliance-kcmdline.c */
extern char *guestfs_int_appliance_command_line (guestfs_h *g, const char
*appliance_dev, int flags);
diff --git a/src/launch-direct.c b/src/launch-direct.c
index efedf92..a12fa8b 100644
--- a/src/launch-direct.c
+++ b/src/launch-direct.c
@@ -391,7 +391,8 @@ launch_direct (guestfs_h *g, void *datav, const char *arg)
#endif
!force_tcg ? "kvm:tcg" : "tcg");
- cpu_model = guestfs_int_get_cpu_model (has_kvm && !force_tcg);
+ cpu_model = guestfs_int_get_cpu_model (has_kvm && !force_tcg,
+ &data->qemu_version);
if (cpu_model) {
ADD_CMDLINE ("-cpu");
ADD_CMDLINE (cpu_model);
diff --git a/src/launch-libvirt.c b/src/launch-libvirt.c
index 168bba6..b32efd8 100644
--- a/src/launch-libvirt.c
+++ b/src/launch-libvirt.c
@@ -1139,7 +1139,8 @@ construct_libvirt_xml_cpu (guestfs_h *g,
string_format ("%d", g->memsize);
} end_element ();
- cpu_model = guestfs_int_get_cpu_model (params->data->is_kvm);
+ cpu_model = guestfs_int_get_cpu_model (params->data->is_kvm,
+
¶ms->data->qemu_version);
if (cpu_model) {
start_element ("cpu") {
if (STREQ (cpu_model, "host")) {
--
2.10.2
Richard W.M. Jones
2017-Jan-17 14:04 UTC
[Libguestfs] [PATCH 2/2] lib: appliance: qemu 2.9.0 supports TCG with -cpu host on x86 (RHBZ#1277744).
Starting with version 2.9.0, qemu can use:
qemu-system-x86_64 -M accel=tcg -cpu host
without breaking. This only applies to x86 (i386 or x86_64) at the
moment. If we detect these conditions, pass -cpu host
unconditionally.
This should hopefully address problems where other hypervisors
(eg. VirtualBox) are running, which breaks KVM in a way that we cannot
detect, and consequently breaks libguestfs.
---
src/appliance-cpu.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/appliance-cpu.c b/src/appliance-cpu.c
index a7cf1eb..fa7e941 100644
--- a/src/appliance-cpu.c
+++ b/src/appliance-cpu.c
@@ -63,7 +63,7 @@
*
* We don't know for sure if KVM will work, but C<-cpu host> is
broken
* with TCG, so we almost always pass a broken C<-cpu> flag if KVM is
- * semi-broken in any way.
+ * semi-broken in any way. (This is fixed in qemu 2.9, thanks Eduardo!)
*
* =back
*/
@@ -77,6 +77,14 @@ guestfs_int_get_cpu_model (int kvm, const struct version
*qemu_version)
else
return "cortex-a57";
#else
+#if defined(__i386__) || defined(__x86_64__)
+ /* Eduardo added the ability to use -cpu host with TCG on x86 in
+ * qemu 2.9.
+ */
+ if (guestfs_int_version_ge (qemu_version, 2, 9, 0))
+ return "host";
+ /* otherwise fallthrough */
+#endif
/* On most architectures, it is faster to pass the CPU host model to
* the appliance, allowing maximum speed for things like checksums
* and encryption. Only do this with KVM. It is broken in subtle
--
2.10.2
Apparently Analagous Threads
- [PATCH v3] launch: direct: Add DAX root filesystem support.
- [PATCH v2] launch: direct: Add DAX root filesystem support.
- [PATCH 0/4] common: Add a simple mini-library for handling qemu command and config files.
- [QEMU PATCH v4] create struct for machine initialization arguments
- [PATCH v3] ppc64le: Use -machine cap-htm=off unconditionally