Daniel P. Berrange wrote:
On Wed, Aug 20, 2008 at 12:51:05PM -0400, Cole Robinson wrote:
> diff --git a/src/qemu_conf.c b/src/qemu_conf.c
> index dc9e42a..0328cc1 100644
> --- a/src/qemu_conf.c
> +++ b/src/qemu_conf.c
> @@ -230,6 +230,10 @@ qemudCapsInitGuest(virCapsPtr caps,
> virCapsGuestPtr guest;
> int i;
>
> + /* Check for existance of base emulator */
> + if (access(info->binary, X_OK) == -1)
> + return 0;
> +
This isn't right - this means that if KVM is installed, but QEMU is
not installed you won't get any capabilities.
Basically we need todo all the access() checks for QEMU, KVM, /dev/kvm
up-front. And then generated the capabilites if either QEMU or KVM is
available.
Okay, I think this patch solves the issues. We check upfront
for the base emulator and potential kvm emulators (qemu-kvm,
and /usr/bin/kvm for ubuntu/upstream .spec). If nothing is
found, just return. If only the base emulator is found, skip
kvm even if /dev/kvm exists. If only kvm bin is found, add
the base emulator capabilities only if emulator and host arch
matches.
Thanks,
Cole
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index ee5851d..4ef75dd 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -226,7 +226,29 @@ qemudCapsInitGuest(virCapsPtr caps,
const struct qemu_arch_info *info,
int hvm) {
virCapsGuestPtr guest;
- int i;
+ int i, haskvm, hasbase, samearch;
+ const char *kvmbin = NULL;
+
+ /* Check for existance of base emulator */
+ hasbase = (access(info->binary, X_OK) == 0);
+
+ samearch = STREQ(info->arch, hostmachine);
+ if (samearch) {
+ const char *const kvmbins[] = { "/usr/bin/qemu-kvm", /* Fedora */
+ "/usr/bin/kvm" }; /* Upstream .spec */
+
+ for (i = 0; i < ARRAY_CARDINALITY(kvmbins); ++i) {
+ if ((haskvm = (access(kvmbins[i], X_OK) == 0))) {
+ kvmbin = kvmbins[i];
+ break;
+ }
+ }
+ } else {
+ haskvm = 0;
+ }
+
+ if (!hasbase && !haskvm)
+ return 0;
if ((guest = virCapabilitiesAddGuest(caps,
hvm ? "hvm" : "xen",
@@ -239,8 +261,7 @@ qemudCapsInitGuest(virCapsPtr caps,
return -1;
if (hvm) {
- /* Check for existance of base emulator */
- if (access(info->binary, X_OK) == 0 &&
+ if (hasbase &&
virCapabilitiesAddGuestDomain(guest,
"qemu",
NULL,
@@ -250,7 +271,7 @@ qemudCapsInitGuest(virCapsPtr caps,
return -1;
/* If guest & host match, then we can accelerate */
- if (STREQ(info->arch, hostmachine)) {
+ if (samearch) {
if (access("/dev/kqemu", F_OK) == 0 &&
virCapabilitiesAddGuestDomain(guest,
"kqemu",
@@ -261,9 +282,10 @@ qemudCapsInitGuest(virCapsPtr caps,
return -1;
if (access("/dev/kvm", F_OK) == 0 &&
+ haskvm &&
virCapabilitiesAddGuestDomain(guest,
"kvm",
- "/usr/bin/qemu-kvm",
+ kvmbin,
NULL,
0,
NULL) == NULL)