Put kvm_context inside KVMState. We can then start using
KVMState where we need to, to mid-term, start sharing
code with qemu mainline.

Signed-off-by: Glauber Costa <[email protected]>
---
 kvm.h        |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 libkvm-all.c |   19 ++++++++++---------
 libkvm-all.h |   47 +----------------------------------------------
 qemu-kvm.c   |    9 +++++----
 4 files changed, 68 insertions(+), 62 deletions(-)

diff --git a/kvm.h b/kvm.h
index 553c03e..32af545 100644
--- a/kvm.h
+++ b/kvm.h
@@ -16,7 +16,53 @@
 
 #include "config.h"
 #include "sys-queue.h"
-#include "libkvm-all.h"
+
+/**
+ * \brief The KVM context
+ *
+ * The verbose KVM context
+ */
+
+struct kvm_context {
+       /// Filedescriptor to /dev/kvm
+       int fd;
+       int vm_fd;
+       /// Callbacks that KVM uses to emulate various unvirtualizable 
functionality
+       struct kvm_callbacks *callbacks;
+       void *opaque;
+       /// is dirty pages logging enabled for all regions or not
+       int dirty_pages_log_all;
+       /// do not create in-kernel irqchip if set
+       int no_irqchip_creation;
+       /// in-kernel irqchip status
+       int irqchip_in_kernel;
+       /// ioctl to use to inject interrupts
+       int irqchip_inject_ioctl;
+       /// do not create in-kernel pit if set
+       int no_pit_creation;
+       /// in-kernel pit status
+       int pit_in_kernel;
+       /// in-kernel coalesced mmio
+       int coalesced_mmio;
+#ifdef KVM_CAP_IRQ_ROUTING
+       struct kvm_irq_routing *irq_routes;
+       int nr_allocated_irq_routes;
+#endif
+       void *used_gsi_bitmap;
+       int max_gsi;
+};
+
+struct kvm_vcpu_context
+{
+       int fd;
+       struct kvm_run *run;
+       struct kvm_context *kvm;
+       uint32_t id;
+};
+
+typedef struct kvm_context *kvm_context_t;
+typedef struct kvm_vcpu_context *kvm_vcpu_context_t;
+
 
 typedef struct KVMSlot
 {
@@ -47,8 +93,13 @@ struct KVMState
 #ifdef KVM_CAP_SET_GUEST_DEBUG
     struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
 #endif
+#ifdef USE_KVM
+    struct kvm_context kvm_context;
+#endif
 };
 
+typedef struct KVMState KVMState;
+
 #ifdef KVM_UPSTREAM
 
 #ifdef CONFIG_KVM
@@ -97,8 +148,6 @@ int kvm_update_guest_debug(CPUState *env, unsigned long 
reinject_trap);
 
 /* internal API */
 
-struct KVMState;
-typedef struct KVMState KVMState;
 
 int kvm_ioctl(KVMState *s, int type, ...);
 
diff --git a/libkvm-all.c b/libkvm-all.c
index 45679fb..32fdf96 100644
--- a/libkvm-all.c
+++ b/libkvm-all.c
@@ -288,11 +288,12 @@ int kvm_dirty_pages_log_reset(kvm_context_t kvm)
 }
 
 
-kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
+KVMState *kvm_init(struct kvm_callbacks *callbacks,
                       void *opaque)
 {
        int fd;
        kvm_context_t kvm;
+    KVMState *s;
        int r, gsi_count;
 
        fd = open("/dev/kvm", O_RDWR);
@@ -319,10 +320,9 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
        }
        kvm_abi = r;
        kvm_page_size = getpagesize();
-       kvm = malloc(sizeof(*kvm));
-       if (kvm == NULL)
-               goto out_close;
-       memset(kvm, 0, sizeof(*kvm));
+       s = qemu_malloc(sizeof(*s));
+       memset(s, 0, sizeof(*s));
+    kvm = &s->kvm_context;
        kvm->fd = fd;
        kvm->vm_fd = -1;
        kvm->callbacks = callbacks;
@@ -348,10 +348,11 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
                        set_gsi(kvm, i);
        }
 
-       return kvm;
- out_close:
-       close(fd);
-       return NULL;
+       return s;
+
+out_close:
+    close(fd);
+    return NULL;
 }
 
 void kvm_finalize(kvm_context_t kvm)
diff --git a/libkvm-all.h b/libkvm-all.h
index d647ef1..251dede 100644
--- a/libkvm-all.h
+++ b/libkvm-all.h
@@ -36,51 +36,6 @@
 /* kvm abi verison variable */
 extern int kvm_abi;
 
-/**
- * \brief The KVM context
- *
- * The verbose KVM context
- */
-
-struct kvm_context {
-       /// Filedescriptor to /dev/kvm
-       int fd;
-       int vm_fd;
-       /// Callbacks that KVM uses to emulate various unvirtualizable 
functionality
-       struct kvm_callbacks *callbacks;
-       void *opaque;
-       /// is dirty pages logging enabled for all regions or not
-       int dirty_pages_log_all;
-       /// do not create in-kernel irqchip if set
-       int no_irqchip_creation;
-       /// in-kernel irqchip status
-       int irqchip_in_kernel;
-       /// ioctl to use to inject interrupts
-       int irqchip_inject_ioctl;
-       /// do not create in-kernel pit if set
-       int no_pit_creation;
-       /// in-kernel pit status
-       int pit_in_kernel;
-       /// in-kernel coalesced mmio
-       int coalesced_mmio;
-#ifdef KVM_CAP_IRQ_ROUTING
-       struct kvm_irq_routing *irq_routes;
-       int nr_allocated_irq_routes;
-#endif
-       void *used_gsi_bitmap;
-       int max_gsi;
-};
-
-struct kvm_vcpu_context
-{
-       int fd;
-       struct kvm_run *run;
-       struct kvm_context *kvm;
-       uint32_t id;
-};
-
-typedef struct kvm_context *kvm_context_t;
-typedef struct kvm_vcpu_context *kvm_vcpu_context_t;
 
 #include "kvm.h"
 int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory,
@@ -181,7 +136,7 @@ struct kvm_callbacks {
  * \param opaque Not used
  * \return NULL on failure
  */
-kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
+KVMState *kvm_init(struct kvm_callbacks *callbacks,
                       void *opaque);
 
 /*!
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 2aeb17c..b441970 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -33,6 +33,8 @@ int kvm_irqchip = 1;
 int kvm_pit = 1;
 int kvm_pit_reinject = 1;
 int kvm_nested = 0;
+KVMState *kvm_state;
+
 kvm_context_t kvm_context;
 
 pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -780,10 +782,9 @@ static struct kvm_callbacks qemu_kvm_ops = {
 int kvm_qemu_init()
 {
     /* Try to initialize kvm */
-    kvm_context = kvm_init(&qemu_kvm_ops, cpu_single_env);
-    if (!kvm_context) {
-       return -1;
-    }
+    kvm_state = kvm_init(&qemu_kvm_ops, cpu_single_env);
+    kvm_context = &kvm_state->kvm_context;
+
     pthread_mutex_lock(&qemu_mutex);
 
     return 0;
-- 
1.5.6.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to