[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: [libvirt] [PATCH] Don't list capabilities entries if emulators can't be accessed
- From: Cole Robinson <crobinso redhat com>
- To: "Daniel P. Berrange" <berrange redhat com>
- Cc: libvir-list redhat com
- Subject: Re: [libvirt] [PATCH] Don't list capabilities entries if emulators can't be accessed
- Date: Mon, 25 Aug 2008 13:16:39 -0400
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)
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]