From 245ac5673700f54479e9408e8659cb68f80c344a Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Tue, 9 Feb 2010 16:30:18 +0000 Subject: [PATCH] Add -enable-kvm option to qemu command line. If the version of qemu being used supports -enable-kvm option, then check if /dev/kvm is openable and add this option. I have found this option makes no difference, although it is *supposed* to enable KVM (hardware virtualization) support. --- src/guestfs.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/guestfs.c b/src/guestfs.c index 1d6d40b..9908e7f 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -858,6 +858,7 @@ static void print_timestamped_message (guestfs_h *g, const char *fs, ...); static int build_supermin_appliance (guestfs_h *g, const char *path, char **kernel, char **initrd); static int test_qemu (guestfs_h *g); static int qemu_supports (guestfs_h *g, const char *option); +static int is_openable (guestfs_h *g, const char *path, int flags); static void print_cmdline (guestfs_h *g); static const char *kernel_name = "vmlinuz." REPO "." host_cpu; @@ -1091,6 +1092,22 @@ guestfs__launch (guestfs_h *g) */ g->cmdline[0] = g->qemu; + /* qemu sometimes needs this option to enable hardware + * virtualization, but some versions of 'qemu-kvm' will use KVM + * regardless (even where this option appears in the help text). + * It is rumoured that there are versions of qemu where supplying + * this option when hardware virtualization is not available will + * cause qemu to fail, so we we have to check at least that + * /dev/kvm is openable. That's not reliable, since /dev/kvm + * might be openable by qemu but not by us (think: SELinux) in + * which case the user would not get hardware virtualization, + * although at least shouldn't fail. A giant clusterfuck with the + * qemu command line, again. + */ + if (qemu_supports (g, "-enable-kvm") && + is_openable (g, "/dev/kvm", O_RDWR)) + add_cmdline (g, "-enable-kvm"); + /* Newer versions of qemu (from around 2009/12) changed the * behaviour of monitors so that an implicit '-monitor stdio' is * assumed if we are in -nographic mode and there is no other @@ -1647,6 +1664,20 @@ qemu_supports (guestfs_h *g, const char *option) return g->qemu_help && strstr (g->qemu_help, option) != NULL; } +/* Check if a file can be opened. */ +static int +is_openable (guestfs_h *g, const char *path, int flags) +{ + int fd = open (path, flags); + if (fd == -1) { + if (g->verbose) + perror (path); + return 0; + } + close (fd); + return 1; +} + /* Check the peer effective UID for a TCP socket. Ideally we'd like * SO_PEERCRED for a loopback TCP socket. This isn't possible on * Linux (but it is on Solaris!) so we read /proc/net/tcp instead. -- 1.8.3.1