Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
kvm: Move /dev/kvm opening/closing to open/close methods
This will allow TYPE_KVM_ACCEL objects to be created for querying host
capabilities without affecting global QEMU state.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
  • Loading branch information
ehabkost committed Mar 6, 2015
1 parent 34adf07 commit 36a250e
Showing 1 changed file with 42 additions and 19 deletions.
61 changes: 42 additions & 19 deletions kvm-all.c
Expand Up @@ -1411,6 +1411,44 @@ static int kvm_max_vcpus(KVMState *s)
return (ret) ? ret : kvm_recommended_vcpus(s);
}

static void kvm_close(Object *obj, Error **errp)
{
KVMState *s = KVM_STATE(obj);

if (s->fd != -1) {
close(s->fd);
s->fd = -1;
}
}

static void kvm_open(Object *obj, Error **errp)
{
KVMState *s = KVM_STATE(obj);
int ret;

s->fd = qemu_open("/dev/kvm", O_RDWR);
if (s->fd == -1) {
error_setg_errno(errp, errno, "Could not access KVM kernel module");
goto err;
}

ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
if (ret < KVM_API_VERSION) {
error_setg(errp, "kvm version too old");
goto err;
}

if (ret > KVM_API_VERSION) {
error_setg(errp, "kvm version not supported");
goto err;
}

return;

err:
kvm_close(obj, &error_abort);
}

static void kvm_init(MachineState *ms, Error **errp)
{
MachineClass *mc = MACHINE_GET_CLASS(ms);
Expand Down Expand Up @@ -1449,22 +1487,6 @@ static void kvm_init(MachineState *ms, Error **errp)
QTAILQ_INIT(&s->kvm_sw_breakpoints);
#endif
s->vmfd = -1;
s->fd = qemu_open("/dev/kvm", O_RDWR);
if (s->fd == -1) {
error_setg_errno(errp, errno, "Could not access KVM kernel module");
goto err;
}

ret = kvm_ioctl(s, KVM_GET_API_VERSION, 0);
if (ret < KVM_API_VERSION) {
error_setg(errp, "kvm version too old");
goto err;
}

if (ret > KVM_API_VERSION) {
error_setg(errp, "kvm version not supported");
goto err;
}

s->nr_slots = kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);

Expand Down Expand Up @@ -1619,9 +1641,6 @@ static void kvm_init(MachineState *ms, Error **errp)
if (s->vmfd >= 0) {
close(s->vmfd);
}
if (s->fd != -1) {
close(s->fd);
}
g_free(s->slots);
}

Expand Down Expand Up @@ -1864,6 +1883,8 @@ int kvm_ioctl(KVMState *s, int type, ...)
void *arg;
va_list ap;

assert(s->fd >= 0);

va_start(ap, type);
arg = va_arg(ap, void *);
va_end(ap);
Expand Down Expand Up @@ -2260,6 +2281,8 @@ static void kvm_accel_class_init(ObjectClass *oc, void *data)
{
AccelClass *ac = ACCEL_CLASS(oc);
ac->name = "KVM";
ac->open = kvm_open;
ac->close = kvm_close;
ac->init_machine = kvm_init;
ac->allowed = &kvm_allowed;
}
Expand Down

0 comments on commit 36a250e

Please sign in to comment.