public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II
@ 2011-05-13 12:13 Jan Kiszka
  2011-05-13 12:13 ` [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper Jan Kiszka
                   ` (17 more replies)
  0 siblings, 18 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

The second round of merging qemu-kvm with upstream. This part stops
after switching to upstreams kvm_init implementation.

To achieve this, various small cleanups and refactorings are applied,
the irq0 override management is simplified and the kvm_context fields
are migrated into KVMState.

Please review/merge.

Jan Kiszka (16):
  qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper
  qemu-kvm: Drop kvm_inject_interrupt
  Revert "qemu-kvm-x86: consider the irq0override flag in
    kvm_arch_init_irq_routing"
  qemu-kvm: Drop IRQ0 override test from ioapic_set_irq
  qemu-kvm: Clean up IRQ0 override configuration
  qemu-kvm: Refactor irqchip and routing initialization
  qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip
  qemu-kvm: Make some private functions static
  qemu-kvm: Implement kvm_has_pit_state2 in upstream style
  qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq
  qemu-kvm: Remove kvm_context from public interfaces
  qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id
  qemu-kvm: Remove handle_io_window
  qemu-kvm: Merge kvm_context into KVMState
  qemu-kvm: Use KVM-optimized interrupt handler
  qemu-kvm: Use upstream kvm_init

 exec.c                 |    2 -
 hw/device-assignment.c |   21 ++-
 hw/i8254-kvm.c         |   12 +-
 hw/i8254.c             |    4 +-
 hw/i8259.c             |    4 +-
 hw/ioapic.c            |    7 +-
 hw/pc.c                |    2 +-
 hw/pcspk.c             |    4 +-
 kvm-all.c              |   48 ++++--
 kvm-stub.c             |   10 +
 kvm.h                  |   17 +-
 monitor.c              |    5 +-
 qemu-kvm-x86.c         |   51 +++---
 qemu-kvm.c             |  461 ++++++++++++++----------------------------------
 qemu-kvm.h             |  166 ++----------------
 sysemu.h               |    1 -
 target-i386/kvm.c      |    8 +-
 vl.c                   |    1 -
 18 files changed, 257 insertions(+), 567 deletions(-)


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
  2011-05-13 12:13 ` [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt Jan Kiszka
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 kvm-all.c  |    5 -----
 kvm.h      |    2 --
 qemu-kvm.c |    2 +-
 3 files changed, 1 insertions(+), 8 deletions(-)

diff --git a/kvm-all.c b/kvm-all.c
index c1be056..d744cb2 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -675,11 +675,6 @@ static CPUPhysMemoryClient kvm_cpu_phys_memory_client = {
     .log_stop = kvm_log_stop,
 };
 
-void kvm_cpu_register_phys_memory_client(void)
-{
-    cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
-}
-
 #ifdef OBSOLETE_KVM_IMPL
 static void kvm_handle_interrupt(CPUState *env, int mask)
 {
diff --git a/kvm.h b/kvm.h
index 179eb7e..2445d40 100644
--- a/kvm.h
+++ b/kvm.h
@@ -63,8 +63,6 @@ int kvm_init_vcpu(CPUState *env);
 int kvm_cpu_exec(CPUState *env);
 
 #if !defined(CONFIG_USER_ONLY)
-void kvm_cpu_register_phys_memory_client(void);
-
 void kvm_setup_guest_memory(void *start, size_t size);
 
 int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
diff --git a/qemu-kvm.c b/qemu-kvm.c
index cf02ceb..628653b 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -192,7 +192,7 @@ int kvm_init(void)
         }
     }
 
-    kvm_cpu_register_phys_memory_client();
+    cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
 
     pthread_mutex_lock(&qemu_mutex);
     return kvm_create_context();
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
  2011-05-13 12:13 ` [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
  2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Not required, do_inject_nmi runs under the global mutex and can
therefore safely invoke cpu_interrupt (like in upstream).

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 monitor.c  |    5 +----
 qemu-kvm.c |   10 ----------
 qemu-kvm.h |    1 -
 3 files changed, 1 insertions(+), 15 deletions(-)

diff --git a/monitor.c b/monitor.c
index a9c2850..3abc7e1 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2572,10 +2572,7 @@ static void do_inject_nmi(Monitor *mon, const QDict *qdict)
 
     for (env = first_cpu; env != NULL; env = env->next_cpu)
         if (env->cpu_index == cpu_index) {
-            if (kvm_enabled())
-                kvm_inject_interrupt(env, CPU_INTERRUPT_NMI);
-            else
-                cpu_interrupt(env, CPU_INTERRUPT_NMI);
+            cpu_interrupt(env, CPU_INTERRUPT_NMI);
             break;
         }
 }
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 628653b..1f9ddea 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -931,16 +931,6 @@ void on_vcpu(CPUState *env, void (*func)(void *data), void *data)
     }
 }
 
-static void inject_interrupt(void *data)
-{
-    cpu_interrupt(current_env, (long) data);
-}
-
-void kvm_inject_interrupt(CPUState *env, int mask)
-{
-    on_vcpu(env, inject_interrupt, (void *) (long) mask);
-}
-
 void kvm_update_interrupt_request(CPUState *env)
 {
     int signal = 0;
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 8b3ce9c..bf03be8 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -407,7 +407,6 @@ void kvm_hpet_enable_kpit(void);
 void kvm_hpet_disable_kpit(void);
 
 void on_vcpu(CPUState *env, void (*func)(void *data), void *data);
-void kvm_inject_interrupt(CPUState *env, int mask);
 void kvm_update_interrupt_request(CPUState *env);
 
 int kvm_arch_has_work(CPUState *env);
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing"
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
  2011-05-13 12:13 ` [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper Jan Kiszka
  2011-05-13 12:13 ` [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
  2011-05-16 10:24   ` Avi Kivity
  2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

This reverts commit fd6bfef3d49a62b36092f131690de3e34f84662d.

It is a nop, and it always was a nop:

    irq0override = !kvm_irqchip || kvm_has_gsi_routing

But this code is only executed when gsi routing is available.

Conflicts:

	qemu-kvm-x86.c

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm-x86.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 6c3a0a9..c039e16 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -317,9 +317,9 @@ int kvm_arch_init_irq_routing(void)
             }
         }
         for (i = 0; i < 24; ++i) {
-            if (i == 0 && irq0override) {
+            if (i == 0) {
                 r = kvm_add_irq_route(i, KVM_IRQCHIP_IOAPIC, 2);
-            } else if (i != 2 || !irq0override) {
+            } else if (i != 2) {
                 r = kvm_add_irq_route(i, KVM_IRQCHIP_IOAPIC, i);
             }
             if (r < 0) {
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (2 preceding siblings ...)
  2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
  2011-05-16 10:29   ` Avi Kivity
  2011-05-13 12:13 ` [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration Jan Kiszka
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

The IRQ0 override is not configurable while using the user space IOAPIC.
When the in-kernel irqchip is active, ioapic_set_irq is never called. So
drop this useless test.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/ioapic.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/hw/ioapic.c b/hw/ioapic.c
index 2ac6127..084d37a 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -22,7 +22,6 @@
 
 #include "hw.h"
 #include "pc.h"
-#include "sysemu.h"
 #include "apic.h"
 #include "ioapic.h"
 #include "qemu-timer.h"
@@ -146,7 +145,7 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
      * the cleanest way of doing it but it should work. */
 
     DPRINTF("%s: %s vec %x\n", __func__, level ? "raise" : "lower", vector);
-    if (vector == 0 && irq0override) {
+    if (vector == 0) {
         vector = 2;
     }
     if (vector >= 0 && vector < IOAPIC_NUM_PINS) {
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (3 preceding siblings ...)
  2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization Jan Kiszka
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Introduce kvm_allows_irq0_override to overcome the global irq0override
variable and convert the BIOS initialization.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/pc.c    |    2 +-
 kvm-all.c  |    5 +++++
 kvm-stub.c |    5 +++++
 kvm.h      |    1 +
 qemu-kvm.c |    1 -
 sysemu.h   |    1 -
 vl.c       |    1 -
 7 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 944f766..73398eb 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -605,7 +605,7 @@ static void *bochs_bios_init(void)
     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
     fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, (uint8_t *)acpi_tables,
                      acpi_tables_len);
-    fw_cfg_add_bytes(fw_cfg, FW_CFG_IRQ0_OVERRIDE, &irq0override, 1);
+    fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override());
 
     smbios_table = smbios_get_table(&smbios_len);
     if (smbios_table)
diff --git a/kvm-all.c b/kvm-all.c
index d744cb2..d936d35 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1121,6 +1121,11 @@ int kvm_has_many_ioeventfds(void)
     return kvm_state->many_ioeventfds;
 }
 
+int kvm_allows_irq0_override(void)
+{
+    return !kvm_enabled() || !kvm_irqchip_in_kernel() || kvm_has_gsi_routing();
+}
+
 void kvm_setup_guest_memory(void *start, size_t size)
 {
     if (!kvm_has_sync_mmu()) {
diff --git a/kvm-stub.c b/kvm-stub.c
index 31bd77b..4f1f7d3 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -93,6 +93,11 @@ int kvm_has_many_ioeventfds(void)
     return 0;
 }
 
+int kvm_allows_irq0_override(void)
+{
+    return 1;
+}
+
 void kvm_setup_guest_memory(void *start, size_t size)
 {
 }
diff --git a/kvm.h b/kvm.h
index 2445d40..4ba5465 100644
--- a/kvm.h
+++ b/kvm.h
@@ -220,6 +220,7 @@ typedef struct KVMMsiMessage {
 } KVMMsiMessage;
 
 int kvm_has_gsi_routing(void);
+int kvm_allows_irq0_override(void);
 int kvm_get_irq_route_gsi(void);
 
 int kvm_msi_message_add(KVMMsiMessage *msg);
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 1f9ddea..fee6cdf 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1426,7 +1426,6 @@ static int kvm_create_context(void)
     kvm_init_ap();
     if (kvm_irqchip) {
         if (!qemu_kvm_has_gsi_routing()) {
-            irq0override = 0;
 #ifdef TARGET_I386
             /* if kernel can't do irq routing, interrupt source
              * override 0->2 can not be set up as required by hpet,
diff --git a/sysemu.h b/sysemu.h
index d58bec1..69e2e7e 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -102,7 +102,6 @@ extern int vga_interface_type;
 extern int graphic_width;
 extern int graphic_height;
 extern int graphic_depth;
-extern uint8_t irq0override;
 extern DisplayType display_type;
 extern const char *keyboard_layout;
 extern int win2k_install_hack;
diff --git a/vl.c b/vl.c
index a143250..501d52c 100644
--- a/vl.c
+++ b/vl.c
@@ -217,7 +217,6 @@ int no_reboot = 0;
 int no_shutdown = 0;
 int cursor_hide = 1;
 int graphic_rotate = 0;
-uint8_t irq0override = 1;
 const char *watchdog;
 QEMUOptionRom option_rom[MAX_OPTION_ROMS];
 int nb_option_roms;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (4 preceding siblings ...)
  2011-05-13 12:13 ` [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip Jan Kiszka
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Push all irq routing setup into kvm_init_irq_routing and move arch
dependent bits into kvm_arch_init_irq_routing. This will also help to
merge qemu-kvm's init into upstream kvm_init.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm-x86.c |   13 ++++++-
 qemu-kvm.c     |  115 ++++++++++++++++++++++++++++----------------------------
 qemu-kvm.h     |    4 +-
 3 files changed, 70 insertions(+), 62 deletions(-)

diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index c039e16..53083bd 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -299,7 +299,7 @@ int kvm_arch_init_irq_routing(void)
 {
     int i, r;
 
-    if (kvm_irqchip && kvm_has_gsi_routing()) {
+    if (kvm_has_gsi_routing()) {
         kvm_clear_gsi_routes();
         for (i = 0; i < 8; ++i) {
             if (i == 2) {
@@ -327,7 +327,18 @@ int kvm_arch_init_irq_routing(void)
             }
         }
         kvm_commit_irq_routes();
+
+        if (!qemu_kvm_has_pit_state2()) {
+            no_hpet = 1;
+        }
+    } else {
+        /* If kernel can't do irq routing, interrupt source
+         * override 0->2 can not be set up as required by HPET.
+         * so we have to disable it.
+         */
+        no_hpet = 1;
     }
+
     return 0;
 }
 
diff --git a/qemu-kvm.c b/qemu-kvm.c
index fee6cdf..196c516 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -127,7 +127,7 @@ static int kvm_create_context(void);
 int kvm_init(void)
 {
     int fd;
-    int r, gsi_count, i;
+    int r, i;
 
 
     fd = open("/dev/kvm", O_RDWR);
@@ -177,21 +177,6 @@ int kvm_init(void)
 #error Hypervisor too old: KVM_CAP_USER_MEMORY extension not supported
 #endif
 
-    gsi_count = kvm_get_gsi_count(kvm_context);
-    if (gsi_count > 0) {
-        int gsi_bits, i;
-
-        /* Round up so we can search ints using ffs */
-        gsi_bits = ALIGN(gsi_count, 32);
-        kvm_context->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
-        kvm_context->max_gsi = gsi_bits;
-
-        /* Mark any over-allocated bits as already in use */
-        for (i = gsi_count; i < gsi_bits; i++) {
-            set_gsi(kvm_context, i);
-        }
-    }
-
     cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
 
     pthread_mutex_lock(&qemu_mutex);
@@ -227,30 +212,68 @@ static int kvm_set_boot_vcpu_id(kvm_context_t kvm, uint32_t id)
 #endif
 }
 
-void kvm_create_irqchip(kvm_context_t kvm)
+static int kvm_init_irq_routing(kvm_context_t kvm)
 {
-    int r;
+#ifdef KVM_CAP_IRQ_ROUTING
+    int r, gsi_count;
+
+    gsi_count = kvm_get_gsi_count(kvm);
+    if (gsi_count > 0) {
+        int gsi_bits, i;
+
+        /* Round up so we can search ints using ffs */
+        gsi_bits = ALIGN(gsi_count, 32);
+        kvm->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
+        kvm->max_gsi = gsi_bits;
+
+        /* Mark any over-allocated bits as already in use */
+        for (i = gsi_count; i < gsi_bits; i++) {
+            set_gsi(kvm, i);
+        }
+    }
+
+    kvm->irq_routes = qemu_mallocz(sizeof(*kvm_context->irq_routes));
+    kvm->nr_allocated_irq_routes = 0;
+
+    r = kvm_arch_init_irq_routing();
+    if (r < 0) {
+        return r;
+    }
+#endif
+
+    return 0;
+}
 
+int kvm_create_irqchip(kvm_context_t kvm)
+{
 #ifdef KVM_CAP_IRQCHIP
-    if (kvm_irqchip) {
-        r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_IRQCHIP);
-        if (r > 0) {            /* kernel irqchip supported */
-            r = kvm_vm_ioctl(kvm_state, KVM_CREATE_IRQCHIP);
-            if (r >= 0) {
-                kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
+    int r;
+
+    if (!kvm_irqchip || !kvm_check_extension(kvm_state, KVM_CAP_IRQCHIP)) {
+        return 0;
+    }
+
+    r = kvm_vm_ioctl(kvm_state, KVM_CREATE_IRQCHIP);
+    if (r < 0) {
+        fprintf(stderr, "Create kernel PIC irqchip failed\n");
+        return r;
+    }
+
+    kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
 #if defined(KVM_CAP_IRQ_INJECT_STATUS) && defined(KVM_IRQ_LINE_STATUS)
-                r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION,
-                              KVM_CAP_IRQ_INJECT_STATUS);
-                if (r > 0) {
-                    kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
-                }
+    if (kvm_check_extension(kvm_state, KVM_CAP_IRQ_INJECT_STATUS)) {
+        kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
+    }
 #endif
-                kvm_state->irqchip_in_kernel = 1;
-            } else
-                fprintf(stderr, "Create kernel PIC irqchip failed\n");
-        }
+    kvm_state->irqchip_in_kernel = 1;
+
+    r = kvm_init_irq_routing(kvm);
+    if (r < 0) {
+        return r;
     }
 #endif
+
+    return 0;
 }
 
 #ifdef KVM_CAP_IRQCHIP
@@ -1348,8 +1371,6 @@ int kvm_arch_init_irq_routing(void)
 }
 #endif
 
-extern int no_hpet;
-
 static int kvm_create_context(void)
 {
     static const char upgrade_note[] =
@@ -1360,11 +1381,6 @@ static int kvm_create_context(void)
 
     kvm_state->pit_in_kernel = kvm_pit;
 
-#ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context->irq_routes = qemu_mallocz(sizeof(*kvm_context->irq_routes));
-    kvm_context->nr_allocated_irq_routes = 0;
-#endif
-
     kvm_state->vmfd = kvm_ioctl(kvm_state, KVM_CREATE_VM, 0);
     if (kvm_state->vmfd < 0) {
         fprintf(stderr, "kvm_create_vm: %m\n");
@@ -1378,8 +1394,6 @@ static int kvm_create_context(void)
         return r;
     }
 
-    kvm_create_irqchip(kvm_context);
-
     /* There was a nasty bug in < kvm-80 that prevents memory slots from being
      * destroyed properly.  Since we rely on this capability, refuse to work
      * with any kernel without this capability. */
@@ -1390,7 +1404,7 @@ static int kvm_create_context(void)
         return -EINVAL;
     }
 
-    r = kvm_arch_init_irq_routing();
+    r = kvm_create_irqchip(kvm_context);
     if (r < 0) {
         return r;
     }
@@ -1424,21 +1438,6 @@ static int kvm_create_context(void)
     kvm_state->many_ioeventfds = kvm_check_many_ioeventfds();
 
     kvm_init_ap();
-    if (kvm_irqchip) {
-        if (!qemu_kvm_has_gsi_routing()) {
-#ifdef TARGET_I386
-            /* if kernel can't do irq routing, interrupt source
-             * override 0->2 can not be set up as required by hpet,
-             * so disable hpet.
-             */
-            no_hpet = 1;
-        } else if (!qemu_kvm_has_pit_state2()) {
-            no_hpet = 1;
-        }
-#else
-        }
-#endif
-    }
 
     return 0;
 }
diff --git a/qemu-kvm.h b/qemu-kvm.h
index bf03be8..40d607b 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -74,7 +74,7 @@ int pre_kvm_run(kvm_context_t kvm, CPUState *env);
 int handle_io_window(kvm_context_t kvm);
 int try_push_interrupts(kvm_context_t kvm);
 
-void kvm_create_irqchip(kvm_context_t kvm);
+int kvm_create_irqchip(kvm_context_t kvm);
 
 /*!
  * \brief Start the VCPU
@@ -449,13 +449,11 @@ int kvm_arch_halt(CPUState *env);
 int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip,
                       int is_write);
 
-#define qemu_kvm_has_gsi_routing() kvm_has_gsi_routing()
 #ifdef TARGET_I386
 #define qemu_kvm_has_pit_state2() kvm_has_pit_state2(kvm_context)
 #endif
 #else
 #define kvm_nested 0
-#define qemu_kvm_has_gsi_routing() (0)
 #ifdef TARGET_I386
 #define qemu_kvm_has_pit_state2() (0)
 #endif
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (5 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 08/16] qemu-kvm: Make some private functions static Jan Kiszka
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm.c |   11 +----------
 qemu-kvm.h |   11 -----------
 2 files changed, 1 insertions(+), 21 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index 196c516..8b98ec8 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -217,7 +217,7 @@ static int kvm_init_irq_routing(kvm_context_t kvm)
 #ifdef KVM_CAP_IRQ_ROUTING
     int r, gsi_count;
 
-    gsi_count = kvm_get_gsi_count(kvm);
+    gsi_count = kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING);
     if (gsi_count > 0) {
         int gsi_bits, i;
 
@@ -590,15 +590,6 @@ int kvm_has_gsi_routing(void)
     return r;
 }
 
-int kvm_get_gsi_count(kvm_context_t kvm)
-{
-#ifdef KVM_CAP_IRQ_ROUTING
-    return kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING);
-#else
-    return -EINVAL;
-#endif
-}
-
 int kvm_clear_gsi_routes(void)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 40d607b..693d554 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -306,17 +306,6 @@ int kvm_deassign_pci_device(kvm_context_t kvm,
 #endif
 
 /*!
- * \brief Determines the number of gsis that can be routed
- *
- * Returns the number of distinct gsis that can be routed by kvm.  This is
- * also the number of distinct routes (if a gsi has two routes, than another
- * gsi cannot be used...)
- *
- * \param kvm Pointer to the current kvm_context
- */
-int kvm_get_gsi_count(kvm_context_t kvm);
-
-/*!
  * \brief Clears the temporary irq routing table
  *
  * Clears the temporary irq routing table.  Nothing is committed to the
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 08/16] qemu-kvm: Make some private functions static
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (6 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style Jan Kiszka
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm.c |   12 ++++++------
 qemu-kvm.h |   32 --------------------------------
 2 files changed, 6 insertions(+), 38 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index 8b98ec8..48c92e6 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -350,12 +350,12 @@ static int handle_mmio(CPUState *env)
     return 0;
 }
 
-int handle_io_window(kvm_context_t kvm)
+static int handle_io_window(kvm_context_t kvm)
 {
     return 1;
 }
 
-int handle_shutdown(kvm_context_t kvm, CPUState *env)
+static int handle_shutdown(kvm_context_t kvm, CPUState *env)
 {
     /* stop the current vcpu from going back to guest mode */
     env->stopped = 1;
@@ -371,14 +371,14 @@ static inline void push_nmi(kvm_context_t kvm)
 #endif                          /* KVM_CAP_USER_NMI */
 }
 
-void post_kvm_run(kvm_context_t kvm, CPUState *env)
+static void post_kvm_run(kvm_context_t kvm, CPUState *env)
 {
     pthread_mutex_lock(&qemu_mutex);
     kvm_arch_post_run(env, env->kvm_run);
     cpu_single_env = env;
 }
 
-int pre_kvm_run(kvm_context_t kvm, CPUState *env)
+static int pre_kvm_run(kvm_context_t kvm, CPUState *env)
 {
     kvm_arch_pre_run(env, env->kvm_run);
 
@@ -391,7 +391,7 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env)
     return env->kvm_run->ready_for_interrupt_injection;
 }
 
-int kvm_run(CPUState *env)
+static int kvm_run(CPUState *env)
 {
     int r;
     kvm_context_t kvm = &env->kvm_state->kvm_context;
@@ -984,7 +984,7 @@ int kvm_cpu_exec(CPUState *env)
     return 0;
 }
 
-int kvm_cpu_is_stopped(CPUState *env)
+static int kvm_cpu_is_stopped(CPUState *env)
 {
     return !vm_running || env->stopped;
 }
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 693d554..cd9bb37 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -66,40 +66,9 @@ typedef struct kvm_context *kvm_context_t;
 
 int kvm_arch_run(CPUState *env);
 
-int handle_halt(CPUState *env);
-
-int handle_shutdown(kvm_context_t kvm, CPUState *env);
-void post_kvm_run(kvm_context_t kvm, CPUState *env);
-int pre_kvm_run(kvm_context_t kvm, CPUState *env);
-int handle_io_window(kvm_context_t kvm);
-int try_push_interrupts(kvm_context_t kvm);
-
 int kvm_create_irqchip(kvm_context_t kvm);
 
 /*!
- * \brief Start the VCPU
- *
- * This starts the VCPU and virtualization is started.\n
- * \n
- * This function will not return until any of these conditions are met:
- * - An IO/MMIO handler does not return "0"
- * - An exception that neither the guest OS, nor KVM can handle occurs
- *
- * \note This function will call the callbacks registered in kvm_init()
- * to emulate those functions
- * \note If you at any point want to interrupt the VCPU, kvm_run() will
- * listen to the EINTR signal. This allows you to simulate external interrupts
- * and asyncronous IO.
- *
- * \param kvm Pointer to the current kvm_context
- * \param vcpu Which virtual CPU should be started
- * \return 0 on success, but you really shouldn't expect this function to
- * return except for when an error has occured, or when you have sent it
- * an EINTR signal.
- */
-int kvm_run(CPUState *env);
-
-/*!
  * \brief Check if a vcpu is ready for interrupt injection
  *
  * This checks if vcpu interrupts are not masked by mov ss or sti.
@@ -487,7 +456,6 @@ struct KVMState {
 int kvm_tpr_enable_vapic(CPUState *env);
 
 unsigned long kvm_get_thread_id(void);
-int kvm_cpu_is_stopped(CPUState *env);
 
 #endif
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (7 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 08/16] qemu-kvm: Make some private functions static Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq Jan Kiszka
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/i8254-kvm.c |    4 ++--
 hw/i8254.c     |    4 ++--
 kvm-all.c      |   11 +++++++++++
 kvm-stub.c     |    5 +++++
 kvm.h          |    1 +
 qemu-kvm-x86.c |   12 +-----------
 qemu-kvm.c     |    5 +++++
 qemu-kvm.h     |   15 +--------------
 8 files changed, 28 insertions(+), 29 deletions(-)

diff --git a/hw/i8254-kvm.c b/hw/i8254-kvm.c
index b495dc1..44ed86c 100644
--- a/hw/i8254-kvm.c
+++ b/hw/i8254-kvm.c
@@ -38,7 +38,7 @@ static void kvm_pit_pre_save(void *opaque)
     struct PITChannelState *sc;
     int i;
 
-    if(qemu_kvm_has_pit_state2()) {
+    if (kvm_has_pit_state2()) {
         kvm_get_pit2(kvm_context, &pit2);
         s->flags = pit2.flags;
     } else {
@@ -91,7 +91,7 @@ static int kvm_pit_post_load(void *opaque, int version_id)
 	c->count_load_time = sc->count_load_time;
     }
 
-    if(qemu_kvm_has_pit_state2()) {
+    if (kvm_has_pit_state2()) {
         kvm_set_pit2(kvm_context, &pit2);
     } else {
         kvm_set_pit(kvm_context, (struct kvm_pit_state *)&pit2);
diff --git a/hw/i8254.c b/hw/i8254.c
index 43ac106..33974db 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -497,7 +497,7 @@ void hpet_pit_disable(void)
     PITChannelState *s = &pit_state.channels[0];
 
     if (kvm_enabled() && kvm_pit_in_kernel()) {
-        if (qemu_kvm_has_pit_state2()) {
+        if (kvm_has_pit_state2()) {
             kvm_hpet_disable_kpit();
         } else {
              fprintf(stderr, "%s: kvm does not support pit_state2!\n", __FUNCTION__);
@@ -521,7 +521,7 @@ void hpet_pit_enable(void)
     PITChannelState *s = &pit->channels[0];
 
     if (kvm_enabled() && kvm_pit_in_kernel()) {
-        if (qemu_kvm_has_pit_state2()) {
+        if (kvm_has_pit_state2()) {
             kvm_hpet_enable_kpit();
         } else {
              fprintf(stderr, "%s: kvm does not support pit_state2!\n", __FUNCTION__);
diff --git a/kvm-all.c b/kvm-all.c
index d936d35..9463341 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -82,6 +82,7 @@ struct KVMState
     int pit_in_kernel;
     int xsave, xcrs;
     int many_ioeventfds;
+    int pit_state2;
 };
 
 KVMState *kvm_state;
@@ -783,6 +784,11 @@ int kvm_init(void)
     s->xcrs = kvm_check_extension(s, KVM_CAP_XCRS);
 #endif
 
+    s->pit_state2 = 0;
+#ifdef KVM_CAP_PIT_STATE2
+    s->pit_state2 = kvm_check_extension(s, KVM_CAP_PIT_STATE2);
+#endif
+
     ret = kvm_arch_init(s);
     if (ret < 0) {
         goto err;
@@ -1113,6 +1119,11 @@ int kvm_has_xcrs(void)
     return kvm_state->xcrs;
 }
 
+int kvm_has_pit_state2(void)
+{
+    return kvm_state->pit_state2;
+}
+
 int kvm_has_many_ioeventfds(void)
 {
     if (!kvm_enabled()) {
diff --git a/kvm-stub.c b/kvm-stub.c
index 4f1f7d3..90fed66 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -98,6 +98,11 @@ int kvm_allows_irq0_override(void)
     return 1;
 }
 
+int kvm_has_pit_state2(void)
+{
+    return 0;
+}
+
 void kvm_setup_guest_memory(void *start, size_t size)
 {
 }
diff --git a/kvm.h b/kvm.h
index 4ba5465..7d548ed 100644
--- a/kvm.h
+++ b/kvm.h
@@ -56,6 +56,7 @@ int kvm_has_debugregs(void);
 int kvm_has_xsave(void);
 int kvm_has_xcrs(void);
 int kvm_has_many_ioeventfds(void);
+int kvm_has_pit_state2(void);
 
 #ifdef NEED_CPU_H
 int kvm_init_vcpu(CPUState *env);
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 53083bd..bbdf218 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -178,16 +178,6 @@ int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2)
 #endif
 #endif
 
-int kvm_has_pit_state2(kvm_context_t kvm)
-{
-    int r = 0;
-
-#ifdef KVM_CAP_PIT_STATE2
-    r = kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2);
-#endif
-    return r;
-}
-
 static void kvm_set_cr8(CPUState *env, uint64_t cr8)
 {
     env->kvm_run->cr8 = cr8;
@@ -328,7 +318,7 @@ int kvm_arch_init_irq_routing(void)
         }
         kvm_commit_irq_routes();
 
-        if (!qemu_kvm_has_pit_state2()) {
+        if (!kvm_has_pit_state2()) {
             no_hpet = 1;
         }
     } else {
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 48c92e6..98bb765 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1428,6 +1428,11 @@ static int kvm_create_context(void)
 
     kvm_state->many_ioeventfds = kvm_check_many_ioeventfds();
 
+    kvm_state->pit_state2 = 0;
+#ifdef KVM_CAP_PIT_STATE2
+    kvm_state->pit_state2 = kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2);
+#endif
+
     kvm_init_ap();
 
     return 0;
diff --git a/qemu-kvm.h b/qemu-kvm.h
index cd9bb37..b101c03 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -185,14 +185,6 @@ int kvm_reinject_control(kvm_context_t kvm, int pit_reinject);
 
 #ifdef KVM_CAP_PIT_STATE2
 /*!
- * \brief Check for kvm support of kvm_pit_state2
- *
- * \param kvm Pointer to the current kvm_context
- * \return 0 on success
- */
-int kvm_has_pit_state2(kvm_context_t kvm);
-
-/*!
  * \brief Set in kernel PIT state2 of the virtual domain
  *
  *
@@ -407,14 +399,8 @@ int kvm_arch_halt(CPUState *env);
 int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip,
                       int is_write);
 
-#ifdef TARGET_I386
-#define qemu_kvm_has_pit_state2() kvm_has_pit_state2(kvm_context)
-#endif
 #else
 #define kvm_nested 0
-#ifdef TARGET_I386
-#define qemu_kvm_has_pit_state2() (0)
-#endif
 #endif
 
 #ifdef CONFIG_KVM
@@ -449,6 +435,7 @@ struct KVMState {
     int pit_in_kernel;
     int xsave, xcrs;
     int many_ioeventfds;
+    int pit_state2;
 
     struct kvm_context kvm_context;
 };
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (8 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces Jan Kiszka
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm.c |   19 ++++++-------------
 qemu-kvm.h |    2 --
 2 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index 98bb765..4aa6b0f 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -278,7 +278,7 @@ int kvm_create_irqchip(kvm_context_t kvm)
 
 #ifdef KVM_CAP_IRQCHIP
 
-int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status)
+int kvm_set_irq(int irq, int level, int *status)
 {
     struct kvm_irq_level event;
     int r;
@@ -288,15 +288,17 @@ int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status)
     }
     event.level = level;
     event.irq = irq;
-    r = kvm_vm_ioctl(kvm_state, kvm->irqchip_inject_ioctl, &event);
+    r = kvm_vm_ioctl(kvm_state, kvm_state->kvm_context.irqchip_inject_ioctl,
+                     &event);
     if (r < 0) {
-        perror("kvm_set_irq_level");
+        perror("kvm_set_irq");
     }
 
     if (status) {
 #ifdef KVM_CAP_IRQ_INJECT_STATUS
         *status =
-            (kvm->irqchip_inject_ioctl == KVM_IRQ_LINE) ? 1 : event.status;
+            (kvm_state->kvm_context.irqchip_inject_ioctl == KVM_IRQ_LINE) ?
+                1 : event.status;
 #else
         *status = 1;
 #endif
@@ -1438,15 +1440,6 @@ static int kvm_create_context(void)
     return 0;
 }
 
-#ifdef KVM_CAP_IRQCHIP
-
-int kvm_set_irq(int irq, int level, int *status)
-{
-    return kvm_set_irq_level(kvm_context, irq, level, status);
-}
-
-#endif
-
 static void kvm_mutex_unlock(void)
 {
     assert(!cpu_single_env);
diff --git a/qemu-kvm.h b/qemu-kvm.h
index b101c03..dd11e32 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -93,8 +93,6 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env);
 int kvm_inject_irq(CPUState *env, unsigned irq);
 #endif
 
-int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status);
-
 #ifdef KVM_CAP_IRQCHIP
 /*!
  * \brief Dump in kernel IRQCHIP contents
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (9 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id Jan Kiszka
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

The goal is to remove kvm_context (and also kvm_state one day). For the
few cases we currently still need kvm_context, we can perfectly derive
it from kvm_state.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/device-assignment.c |   21 +++++-----
 hw/i8254-kvm.c         |    8 ++--
 hw/i8259.c             |    4 +-
 hw/ioapic.c            |    4 +-
 hw/pcspk.c             |    4 +-
 kvm.h                  |    9 +++-
 qemu-kvm-x86.c         |   22 +++++-----
 qemu-kvm.c             |  101 ++++++++++++++++++++++++------------------------
 qemu-kvm.h             |   32 +++++++--------
 target-i386/kvm.c      |    4 +-
 10 files changed, 104 insertions(+), 105 deletions(-)

diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index 0f7f5aa..abc38f8 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -967,7 +967,7 @@ static int assign_device(AssignedDevice *dev)
                 "requests!\n");
     }
 
-    r = kvm_assign_pci_device(kvm_context, &assigned_dev_data);
+    r = kvm_assign_pci_device(kvm_state, &assigned_dev_data);
     if (r < 0) {
         fprintf(stderr, "Failed to assign device \"%s\" : %s\n",
                 dev->dev.qdev.id, strerror(-r));
@@ -1010,7 +1010,7 @@ static int assign_irq(AssignedDevice *dev)
 #ifdef KVM_CAP_ASSIGN_DEV_IRQ
     if (dev->irq_requested_type) {
         assigned_irq_data.flags = dev->irq_requested_type;
-        r = kvm_deassign_irq(kvm_context, &assigned_irq_data);
+        r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
         /* -ENXIO means no assigned irq */
         if (r && r != -ENXIO)
             perror("assign_irq: deassign");
@@ -1024,7 +1024,7 @@ static int assign_irq(AssignedDevice *dev)
         assigned_irq_data.flags |= KVM_DEV_IRQ_HOST_INTX;
 #endif
 
-    r = kvm_assign_irq(kvm_context, &assigned_irq_data);
+    r = kvm_assign_irq(kvm_state, &assigned_irq_data);
     if (r < 0) {
         fprintf(stderr, "Failed to assign irq for \"%s\": %s\n",
                 dev->dev.qdev.id, strerror(-r));
@@ -1048,7 +1048,7 @@ static void deassign_device(AssignedDevice *dev)
     assigned_dev_data.assigned_dev_id  =
 	calc_assigned_dev_id(dev->h_segnr, dev->h_busnr, dev->h_devfn);
 
-    r = kvm_deassign_pci_device(kvm_context, &assigned_dev_data);
+    r = kvm_deassign_pci_device(kvm_state, &assigned_dev_data);
     if (r < 0)
 	fprintf(stderr, "Failed to deassign device \"%s\" : %s\n",
                 dev->dev.qdev.id, strerror(-r));
@@ -1113,7 +1113,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev, unsigned int ctrl_pos)
 
         assigned_irq_data.flags = assigned_dev->irq_requested_type;
         free_dev_irq_entries(assigned_dev);
-        r = kvm_deassign_irq(kvm_context, &assigned_irq_data);
+        r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
         /* -ENXIO means no assigned irq */
         if (r && r != -ENXIO)
             perror("assigned_dev_update_msi: deassign irq");
@@ -1147,8 +1147,9 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev, unsigned int ctrl_pos)
 
         assigned_irq_data.guest_irq = assigned_dev->entry->gsi;
 	assigned_irq_data.flags = KVM_DEV_IRQ_HOST_MSI | KVM_DEV_IRQ_GUEST_MSI;
-        if (kvm_assign_irq(kvm_context, &assigned_irq_data) < 0)
+        if (kvm_assign_irq(kvm_state, &assigned_irq_data) < 0) {
             perror("assigned_dev_enable_msi: assign irq");
+        }
 
         assigned_dev->girq = -1;
         assigned_dev->irq_requested_type = assigned_irq_data.flags;
@@ -1192,7 +1193,7 @@ static int assigned_dev_update_msix_mmio(PCIDevice *pci_dev)
     msix_nr.assigned_dev_id = calc_assigned_dev_id(adev->h_segnr, adev->h_busnr,
                                           (uint8_t)adev->h_devfn);
     msix_nr.entry_nr = entries_nr;
-    r = kvm_assign_set_msix_nr(kvm_context, &msix_nr);
+    r = kvm_assign_set_msix_nr(kvm_state, &msix_nr);
     if (r != 0) {
         fprintf(stderr, "fail to set MSI-X entry number for MSIX! %s\n",
 			strerror(-r));
@@ -1231,7 +1232,7 @@ static int assigned_dev_update_msix_mmio(PCIDevice *pci_dev)
 
         msix_entry.gsi = adev->entry[entries_nr].gsi;
         msix_entry.entry = i;
-        r = kvm_assign_set_msix_entry(kvm_context, &msix_entry);
+        r = kvm_assign_set_msix_entry(kvm_state, &msix_entry);
         if (r) {
             fprintf(stderr, "fail to set MSI-X entry! %s\n", strerror(-r));
             break;
@@ -1269,7 +1270,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev, unsigned int ctrl_pos)
 
         assigned_irq_data.flags = assigned_dev->irq_requested_type;
         free_dev_irq_entries(assigned_dev);
-        r = kvm_deassign_irq(kvm_context, &assigned_irq_data);
+        r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
         /* -ENXIO means no assigned irq */
         if (r && r != -ENXIO)
             perror("assigned_dev_update_msix: deassign irq");
@@ -1285,7 +1286,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev, unsigned int ctrl_pos)
             perror("assigned_dev_update_msix_mmio");
             return;
         }
-        if (kvm_assign_irq(kvm_context, &assigned_irq_data) < 0) {
+        if (kvm_assign_irq(kvm_state, &assigned_irq_data) < 0) {
             perror("assigned_dev_enable_msix: assign irq");
             return;
         }
diff --git a/hw/i8254-kvm.c b/hw/i8254-kvm.c
index 44ed86c..8b494d0 100644
--- a/hw/i8254-kvm.c
+++ b/hw/i8254-kvm.c
@@ -39,11 +39,11 @@ static void kvm_pit_pre_save(void *opaque)
     int i;
 
     if (kvm_has_pit_state2()) {
-        kvm_get_pit2(kvm_context, &pit2);
+        kvm_get_pit2(kvm_state, &pit2);
         s->flags = pit2.flags;
     } else {
         /* pit2 is superset of pit struct so just cast it and use it */
-        kvm_get_pit(kvm_context, (struct kvm_pit_state *)&pit2);
+        kvm_get_pit(kvm_state, (struct kvm_pit_state *)&pit2);
     }
     for (i = 0; i < 3; i++) {
 	c = &pit2.channels[i];
@@ -92,9 +92,9 @@ static int kvm_pit_post_load(void *opaque, int version_id)
     }
 
     if (kvm_has_pit_state2()) {
-        kvm_set_pit2(kvm_context, &pit2);
+        kvm_set_pit2(kvm_state, &pit2);
     } else {
-        kvm_set_pit(kvm_context, (struct kvm_pit_state *)&pit2);
+        kvm_set_pit(kvm_state, (struct kvm_pit_state *)&pit2);
     }
     return 0;
 }
diff --git a/hw/i8259.c b/hw/i8259.c
index d710ada..b892cee 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -590,7 +590,7 @@ static void kvm_kernel_pic_save_to_user(PicState *s)
     chip.chip_id = (&s->pics_state->pics[0] == s) ?
                    KVM_IRQCHIP_PIC_MASTER :
                    KVM_IRQCHIP_PIC_SLAVE;
-    kvm_get_irqchip(kvm_context, &chip);
+    kvm_get_irqchip(kvm_state, &chip);
     kpic = &chip.chip.pic;
 
     s->last_irr = kpic->last_irr;
@@ -640,7 +640,7 @@ static int kvm_kernel_pic_load_from_user(PicState *s)
     kpic->elcr = s->elcr;
     kpic->elcr_mask = s->elcr_mask;
 
-    kvm_set_irqchip(kvm_context, &chip);
+    kvm_set_irqchip(kvm_state, &chip);
 #endif
     return 0;
 }
diff --git a/hw/ioapic.c b/hw/ioapic.c
index 084d37a..20dd8eb 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -278,7 +278,7 @@ static void kvm_kernel_ioapic_save_to_user(IOAPICState *s)
     int i;
 
     chip.chip_id = KVM_IRQCHIP_IOAPIC;
-    kvm_get_irqchip(kvm_context, &chip);
+    kvm_get_irqchip(kvm_state, &chip);
     kioapic = &chip.chip.ioapic;
 
     s->id = kioapic->id;
@@ -308,7 +308,7 @@ static void kvm_kernel_ioapic_load_from_user(IOAPICState *s)
         kioapic->redirtbl[i].bits = s->ioredtbl[i];
     }
 
-    kvm_set_irqchip(kvm_context, &chip);
+    kvm_set_irqchip(kvm_state, &chip);
 #endif
 }
 
diff --git a/hw/pcspk.c b/hw/pcspk.c
index e8b72c5..c70de53 100644
--- a/hw/pcspk.c
+++ b/hw/pcspk.c
@@ -58,7 +58,7 @@ static void kvm_get_pit_ch2(ISADevice *dev,
     struct kvm_pit_state pit_state;
 
     if (kvm_enabled() && kvm_pit_in_kernel()) {
-        kvm_get_pit(kvm_context, &pit_state);
+        kvm_get_pit(kvm_state, &pit_state);
         pit->channels[2].mode = pit_state.channels[2].mode;
         pit->channels[2].count = pit_state.channels[2].count;
         pit->channels[2].count_load_time = pit_state.channels[2].count_load_time;
@@ -80,7 +80,7 @@ static void kvm_set_pit_ch2(ISADevice *dev,
         inkernel_state->channels[2].count_load_time =
             pit->channels[2].count_load_time;
         inkernel_state->channels[2].gate = pit->channels[2].gate;
-        kvm_set_pit(kvm_context, inkernel_state);
+        kvm_set_pit(kvm_state, inkernel_state);
     }
 }
 #else
diff --git a/kvm.h b/kvm.h
index 7d548ed..75dc7cf 100644
--- a/kvm.h
+++ b/kvm.h
@@ -17,9 +17,6 @@
 #include <errno.h>
 #include "config-host.h"
 #include "qemu-queue.h"
-#ifdef NEED_CPU_H
-#include "qemu-kvm.h"
-#endif
 
 #ifdef CONFIG_KVM
 #include <linux/kvm.h>
@@ -85,6 +82,7 @@ int kvm_pit_in_kernel(void);
 
 int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr);
 int kvm_on_sigbus(int code, void *addr);
+#endif /* NEED_CPU_H */
 
 /* internal API */
 
@@ -96,6 +94,7 @@ int kvm_ioctl(KVMState *s, int type, ...);
 
 int kvm_vm_ioctl(KVMState *s, int type, ...);
 
+#ifdef NEED_CPU_H
 int kvm_vcpu_ioctl(CPUState *env, int type, ...);
 
 /* Arch specific hooks */
@@ -234,4 +233,8 @@ int kvm_irqchip_in_kernel(void);
 
 int kvm_set_irq(int irq, int level, int *status);
 
+#ifdef NEED_CPU_H
+#include "qemu-kvm.h"
+#endif
+
 #endif
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index bbdf218..2aa833f 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -23,19 +23,19 @@
 #include "kvm.h"
 #include "hw/apic.h"
 
-static int kvm_create_pit(kvm_context_t kvm)
+static int kvm_create_pit(KVMState *s)
 {
 #ifdef KVM_CAP_PIT
     int r;
 
     if (kvm_pit_in_kernel()) {
-        r = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT);
+        r = kvm_vm_ioctl(s, KVM_CREATE_PIT);
         if (r < 0) {
             fprintf(stderr, "Create kernel PIC irqchip failed\n");
             return r;
         }
         if (!kvm_pit_reinject) {
-            r = kvm_reinject_control(kvm_context, 0);
+            r = kvm_reinject_control(s, 0);
             if (r < 0) {
                 fprintf(stderr,
                         "failure to disable in-kernel PIT reinjection\n");
@@ -142,37 +142,37 @@ int kvm_set_lapic(CPUState *env, struct kvm_lapic_state *s)
 
 #ifdef KVM_CAP_PIT
 
-int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s)
+int kvm_get_pit(KVMState *s, struct kvm_pit_state *pit_state)
 {
     if (!kvm_pit_in_kernel()) {
         return 0;
     }
-    return kvm_vm_ioctl(kvm_state, KVM_GET_PIT, s);
+    return kvm_vm_ioctl(s, KVM_GET_PIT, pit_state);
 }
 
-int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s)
+int kvm_set_pit(KVMState *s, struct kvm_pit_state *pit_state)
 {
     if (!kvm_pit_in_kernel()) {
         return 0;
     }
-    return kvm_vm_ioctl(kvm_state, KVM_SET_PIT, s);
+    return kvm_vm_ioctl(s, KVM_SET_PIT, pit_state);
 }
 
 #ifdef KVM_CAP_PIT_STATE2
-int kvm_get_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2)
+int kvm_get_pit2(KVMState *s, struct kvm_pit_state2 *ps2)
 {
     if (!kvm_pit_in_kernel()) {
         return 0;
     }
-    return kvm_vm_ioctl(kvm_state, KVM_GET_PIT2, ps2);
+    return kvm_vm_ioctl(s, KVM_GET_PIT2, ps2);
 }
 
-int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2)
+int kvm_set_pit2(KVMState *s, struct kvm_pit_state2 *ps2)
 {
     if (!kvm_pit_in_kernel()) {
         return 0;
     }
-    return kvm_vm_ioctl(kvm_state, KVM_SET_PIT2, ps2);
+    return kvm_vm_ioctl(s, KVM_SET_PIT2, ps2);
 }
 
 #endif
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 4aa6b0f..9406fcf 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -55,7 +55,6 @@ int kvm_nested = 0;
 
 
 KVMState *kvm_state;
-kvm_context_t kvm_context;
 
 pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER;
 pthread_cond_t qemu_vcpu_cond = PTHREAD_COND_INITIALIZER;
@@ -153,7 +152,6 @@ int kvm_init(void)
         goto out_close;
     }
     kvm_state = qemu_mallocz(sizeof(*kvm_state));
-    kvm_context = &kvm_state->kvm_context;
 
     kvm_state->fd = fd;
     kvm_state->vmfd = -1;
@@ -212,12 +210,13 @@ static int kvm_set_boot_vcpu_id(kvm_context_t kvm, uint32_t id)
 #endif
 }
 
-static int kvm_init_irq_routing(kvm_context_t kvm)
+static int kvm_init_irq_routing(KVMState *s)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
+    kvm_context_t kvm = &s->kvm_context;
     int r, gsi_count;
 
-    gsi_count = kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING);
+    gsi_count = kvm_check_extension(s, KVM_CAP_IRQ_ROUTING);
     if (gsi_count > 0) {
         int gsi_bits, i;
 
@@ -232,7 +231,7 @@ static int kvm_init_irq_routing(kvm_context_t kvm)
         }
     }
 
-    kvm->irq_routes = qemu_mallocz(sizeof(*kvm_context->irq_routes));
+    kvm->irq_routes = qemu_mallocz(sizeof(*kvm->irq_routes));
     kvm->nr_allocated_irq_routes = 0;
 
     r = kvm_arch_init_irq_routing();
@@ -244,16 +243,17 @@ static int kvm_init_irq_routing(kvm_context_t kvm)
     return 0;
 }
 
-int kvm_create_irqchip(kvm_context_t kvm)
+int kvm_create_irqchip(KVMState *s)
 {
 #ifdef KVM_CAP_IRQCHIP
+    kvm_context_t kvm = &s->kvm_context;
     int r;
 
-    if (!kvm_irqchip || !kvm_check_extension(kvm_state, KVM_CAP_IRQCHIP)) {
+    if (!kvm_irqchip || !kvm_check_extension(s, KVM_CAP_IRQCHIP)) {
         return 0;
     }
 
-    r = kvm_vm_ioctl(kvm_state, KVM_CREATE_IRQCHIP);
+    r = kvm_vm_ioctl(s, KVM_CREATE_IRQCHIP);
     if (r < 0) {
         fprintf(stderr, "Create kernel PIC irqchip failed\n");
         return r;
@@ -261,13 +261,13 @@ int kvm_create_irqchip(kvm_context_t kvm)
 
     kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
 #if defined(KVM_CAP_IRQ_INJECT_STATUS) && defined(KVM_IRQ_LINE_STATUS)
-    if (kvm_check_extension(kvm_state, KVM_CAP_IRQ_INJECT_STATUS)) {
+    if (kvm_check_extension(s, KVM_CAP_IRQ_INJECT_STATUS)) {
         kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
     }
 #endif
-    kvm_state->irqchip_in_kernel = 1;
+    s->irqchip_in_kernel = 1;
 
-    r = kvm_init_irq_routing(kvm);
+    r = kvm_init_irq_routing(s);
     if (r < 0) {
         return r;
     }
@@ -307,28 +307,28 @@ int kvm_set_irq(int irq, int level, int *status)
     return 1;
 }
 
-int kvm_get_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip)
+int kvm_get_irqchip(KVMState *s, struct kvm_irqchip *chip)
 {
     int r;
 
-    if (!kvm_state->irqchip_in_kernel) {
+    if (!s->irqchip_in_kernel) {
         return 0;
     }
-    r = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, chip);
+    r = kvm_vm_ioctl(s, KVM_GET_IRQCHIP, chip);
     if (r < 0) {
         perror("kvm_get_irqchip\n");
     }
     return r;
 }
 
-int kvm_set_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip)
+int kvm_set_irqchip(KVMState *s, struct kvm_irqchip *chip)
 {
     int r;
 
-    if (!kvm_state->irqchip_in_kernel) {
+    if (!s->irqchip_in_kernel) {
         return 0;
     }
-    r = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip);
+    r = kvm_vm_ioctl(s, KVM_SET_IRQCHIP, chip);
     if (r < 0) {
         perror("kvm_set_irqchip\n");
     }
@@ -521,52 +521,52 @@ int kvm_inject_nmi(CPUState *env)
 }
 
 #ifdef KVM_CAP_DEVICE_ASSIGNMENT
-int kvm_assign_pci_device(kvm_context_t kvm,
+int kvm_assign_pci_device(KVMState *s,
                           struct kvm_assigned_pci_dev *assigned_dev)
 {
-    return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_PCI_DEVICE, assigned_dev);
+    return kvm_vm_ioctl(s, KVM_ASSIGN_PCI_DEVICE, assigned_dev);
 }
 
-static int kvm_old_assign_irq(kvm_context_t kvm,
+static int kvm_old_assign_irq(KVMState *s,
                               struct kvm_assigned_irq *assigned_irq)
 {
-    return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_IRQ, assigned_irq);
+    return kvm_vm_ioctl(s, KVM_ASSIGN_IRQ, assigned_irq);
 }
 
 #ifdef KVM_CAP_ASSIGN_DEV_IRQ
-int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq)
+int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
 {
     int ret;
 
-    ret = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_ASSIGN_DEV_IRQ);
+    ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_ASSIGN_DEV_IRQ);
     if (ret > 0) {
-        return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_DEV_IRQ, assigned_irq);
+        return kvm_vm_ioctl(s, KVM_ASSIGN_DEV_IRQ, assigned_irq);
     }
 
-    return kvm_old_assign_irq(kvm, assigned_irq);
+    return kvm_old_assign_irq(s, assigned_irq);
 }
 
-int kvm_deassign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq)
+int kvm_deassign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
 {
-    return kvm_vm_ioctl(kvm_state, KVM_DEASSIGN_DEV_IRQ, assigned_irq);
+    return kvm_vm_ioctl(s, KVM_DEASSIGN_DEV_IRQ, assigned_irq);
 }
 #else
-int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq)
+int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
 {
-    return kvm_old_assign_irq(kvm, assigned_irq);
+    return kvm_old_assign_irq(s, assigned_irq);
 }
 #endif
 #endif
 
 #ifdef KVM_CAP_DEVICE_DEASSIGNMENT
-int kvm_deassign_pci_device(kvm_context_t kvm,
+int kvm_deassign_pci_device(KVMState *s,
                             struct kvm_assigned_pci_dev *assigned_dev)
 {
-    return kvm_vm_ioctl(kvm_state, KVM_DEASSIGN_PCI_DEVICE, assigned_dev);
+    return kvm_vm_ioctl(s, KVM_DEASSIGN_PCI_DEVICE, assigned_dev);
 }
 #endif
 
-int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
+int kvm_reinject_control(KVMState *s, int pit_reinject)
 {
 #ifdef KVM_CAP_REINJECT_CONTROL
     int r;
@@ -574,9 +574,9 @@ int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
 
     control.pit_reinject = pit_reinject;
 
-    r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_REINJECT_CONTROL);
+    r = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_REINJECT_CONTROL);
     if (r > 0) {
-        return kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control);
+        return kvm_vm_ioctl(s, KVM_REINJECT_CONTROL, &control);
     }
 #endif
     return -ENOSYS;
@@ -595,7 +595,7 @@ int kvm_has_gsi_routing(void)
 int kvm_clear_gsi_routes(void)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = kvm_context;
+    kvm_context_t kvm = &kvm_state->kvm_context;
 
     kvm->irq_routes->nr = 0;
     return 0;
@@ -607,7 +607,7 @@ int kvm_clear_gsi_routes(void)
 int kvm_add_routing_entry(struct kvm_irq_routing_entry *entry)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = kvm_context;
+    kvm_context_t kvm = &kvm_state->kvm_context;
     struct kvm_irq_routing *z;
     struct kvm_irq_routing_entry *new;
     int n, size;
@@ -661,7 +661,7 @@ int kvm_add_irq_route(int gsi, int irqchip, int pin)
 int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = kvm_context;
+    kvm_context_t kvm = &kvm_state->kvm_context;
     struct kvm_irq_routing_entry *e, *p;
     int i, gsi, found = 0;
 
@@ -722,7 +722,7 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
                              struct kvm_irq_routing_entry *newentry)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = kvm_context;
+    kvm_context_t kvm = &kvm_state->kvm_context;
     struct kvm_irq_routing_entry *e;
     int i;
 
@@ -781,7 +781,7 @@ int kvm_del_irq_route(int gsi, int irqchip, int pin)
 int kvm_commit_irq_routes(void)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = kvm_context;
+    kvm_context_t kvm = &kvm_state->kvm_context;
 
     kvm->irq_routes->flags = 0;
     return kvm_vm_ioctl(kvm_state, KVM_SET_GSI_ROUTING, kvm->irq_routes);
@@ -792,7 +792,7 @@ int kvm_commit_irq_routes(void)
 
 int kvm_get_irq_route_gsi(void)
 {
-    kvm_context_t kvm = kvm_context;
+    kvm_context_t kvm = &kvm_state->kvm_context;
     int i, bit;
     uint32_t *buf = kvm->used_gsi_bitmap;
 
@@ -867,16 +867,15 @@ int kvm_msi_message_update(KVMMsiMessage *old, KVMMsiMessage *new)
 
 
 #ifdef KVM_CAP_DEVICE_MSIX
-int kvm_assign_set_msix_nr(kvm_context_t kvm,
-                           struct kvm_assigned_msix_nr *msix_nr)
+int kvm_assign_set_msix_nr(KVMState *s, struct kvm_assigned_msix_nr *msix_nr)
 {
-    return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_SET_MSIX_NR, msix_nr);
+    return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, msix_nr);
 }
 
-int kvm_assign_set_msix_entry(kvm_context_t kvm,
+int kvm_assign_set_msix_entry(KVMState *s,
                               struct kvm_assigned_msix_entry *entry)
 {
-    return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_SET_MSIX_ENTRY, entry);
+    return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_ENTRY, entry);
 }
 #endif
 
@@ -1234,18 +1233,18 @@ void kvm_hpet_disable_kpit(void)
 {
     struct kvm_pit_state2 ps2;
 
-    kvm_get_pit2(kvm_context, &ps2);
+    kvm_get_pit2(kvm_state, &ps2);
     ps2.flags |= KVM_PIT_FLAGS_HPET_LEGACY;
-    kvm_set_pit2(kvm_context, &ps2);
+    kvm_set_pit2(kvm_state, &ps2);
 }
 
 void kvm_hpet_enable_kpit(void)
 {
     struct kvm_pit_state2 ps2;
 
-    kvm_get_pit2(kvm_context, &ps2);
+    kvm_get_pit2(kvm_state, &ps2);
     ps2.flags &= ~KVM_PIT_FLAGS_HPET_LEGACY;
-    kvm_set_pit2(kvm_context, &ps2);
+    kvm_set_pit2(kvm_state, &ps2);
 }
 #endif
 
@@ -1397,7 +1396,7 @@ static int kvm_create_context(void)
         return -EINVAL;
     }
 
-    r = kvm_create_irqchip(kvm_context);
+    r = kvm_create_irqchip(kvm_state);
     if (r < 0) {
         return r;
     }
@@ -1500,6 +1499,6 @@ void kvm_ioperm(CPUState *env, void *data)
 
 int kvm_set_boot_cpu_id(uint32_t id)
 {
-    return kvm_set_boot_vcpu_id(kvm_context, id);
+    return kvm_set_boot_vcpu_id(&kvm_state->kvm_context, id);
 }
 
diff --git a/qemu-kvm.h b/qemu-kvm.h
index dd11e32..2c67a28 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -66,7 +66,7 @@ typedef struct kvm_context *kvm_context_t;
 
 int kvm_arch_run(CPUState *env);
 
-int kvm_create_irqchip(kvm_context_t kvm);
+int kvm_create_irqchip(KVMState *s);
 
 /*!
  * \brief Check if a vcpu is ready for interrupt injection
@@ -103,7 +103,7 @@ int kvm_inject_irq(CPUState *env, unsigned irq);
  * \param kvm Pointer to the current kvm_context
  * \param chip The irq chip device to be dumped
  */
-int kvm_get_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip);
+int kvm_get_irqchip(KVMState *s, struct kvm_irqchip *chip);
 
 /*!
  * \brief Set in kernel IRQCHIP contents
@@ -115,7 +115,7 @@ int kvm_get_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip);
  * \param kvm Pointer to the current kvm_context
  * \param chip THe irq chip device to be written
  */
-int kvm_set_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip);
+int kvm_set_irqchip(KVMState *s, struct kvm_irqchip *chip);
 
 #if defined(__i386__) || defined(__x86_64__)
 /*!
@@ -166,7 +166,7 @@ int kvm_inject_nmi(CPUState *env);
  * \param kvm Pointer to the current kvm_context
  * \param s PIT state of the virtual domain
  */
-int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s);
+int kvm_get_pit(KVMState *s, struct kvm_pit_state *pit_state);
 
 /*!
  * \brief Set in kernel PIT of the virtual domain
@@ -177,9 +177,9 @@ int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s);
  * \param kvm Pointer to the current kvm_context
  * \param s PIT state of the virtual domain
  */
-int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s);
+int kvm_set_pit(KVMState *s, struct kvm_pit_state *pit_state);
 
-int kvm_reinject_control(kvm_context_t kvm, int pit_reinject);
+int kvm_reinject_control(KVMState *s, int pit_reinject);
 
 #ifdef KVM_CAP_PIT_STATE2
 /*!
@@ -190,7 +190,7 @@ int kvm_reinject_control(kvm_context_t kvm, int pit_reinject);
  * \param ps2 PIT state2 of the virtual domain
  * \return 0 on success
  */
-int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2);
+int kvm_set_pit2(KVMState *s, struct kvm_pit_state2 *ps2);
 
 /*!
  * \brief Get in kernel PIT state2 of the virtual domain
@@ -200,7 +200,7 @@ int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2);
  * \param ps2 PIT state2 of the virtual domain
  * \return 0 on success
  */
-int kvm_get_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2);
+int kvm_get_pit2(KVMState *s, struct kvm_pit_state2 *ps2);
 
 #endif
 #endif
@@ -222,7 +222,7 @@ int kvm_enable_vapic(CPUState *env, uint64_t vapic);
  * \param kvm Pointer to the current kvm_context
  * \param assigned_dev Parameters, like bus, devfn number, etc
  */
-int kvm_assign_pci_device(kvm_context_t kvm,
+int kvm_assign_pci_device(KVMState *s,
                           struct kvm_assigned_pci_dev *assigned_dev);
 
 /*!
@@ -234,7 +234,7 @@ int kvm_assign_pci_device(kvm_context_t kvm,
  * \param kvm Pointer to the current kvm_context
  * \param assigned_irq Parameters, like dev id, host irq, guest irq, etc
  */
-int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
+int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq);
 
 #ifdef KVM_CAP_ASSIGN_DEV_IRQ
 /*!
@@ -246,7 +246,7 @@ int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
  * \param kvm Pointer to the current kvm_context
  * \param assigned_irq Parameters, like dev id, host irq, guest irq, etc
  */
-int kvm_deassign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
+int kvm_deassign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq);
 #endif
 #endif
 
@@ -260,7 +260,7 @@ int kvm_deassign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
  * \param kvm Pointer to the current kvm_context
  * \param assigned_dev Parameters, like bus, devfn number, etc
  */
-int kvm_deassign_pci_device(kvm_context_t kvm,
+int kvm_deassign_pci_device(KVMState *s,
                             struct kvm_assigned_pci_dev *assigned_dev);
 #endif
 
@@ -318,16 +318,13 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
 
 
 #ifdef KVM_CAP_DEVICE_MSIX
-int kvm_assign_set_msix_nr(kvm_context_t kvm,
-                           struct kvm_assigned_msix_nr *msix_nr);
-int kvm_assign_set_msix_entry(kvm_context_t kvm,
+int kvm_assign_set_msix_nr(KVMState *s, struct kvm_assigned_msix_nr *msix_nr);
+int kvm_assign_set_msix_entry(KVMState *s,
                               struct kvm_assigned_msix_entry *entry);
 #endif
 
 #else                           /* !CONFIG_KVM */
 
-typedef struct kvm_context *kvm_context_t;
-
 struct kvm_pit_state {
 };
 
@@ -383,7 +380,6 @@ extern int kvm_irqchip;
 extern int kvm_pit;
 extern int kvm_pit_reinject;
 extern int kvm_nested;
-extern kvm_context_t kvm_context;
 extern unsigned int kvm_shadow_memory;
 
 struct ioperm_data {
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index a8b5c6d..33239bf 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -601,7 +601,7 @@ static int kvm_get_supported_msrs(KVMState *s)
     return ret;
 }
 
-static int kvm_create_pit(kvm_context_t kvm);
+static int kvm_create_pit(KVMState *s);
 
 int kvm_arch_init(KVMState *s)
 {
@@ -653,7 +653,7 @@ int kvm_arch_init(KVMState *s)
     }
     qemu_register_reset(kvm_unpoison_all, NULL);
 
-    ret = kvm_create_pit(&s->kvm_context);
+    ret = kvm_create_pit(s);
     if (ret < 0) {
         return ret;
     }
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (10 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 13/16] qemu-kvm: Remove handle_io_window Jan Kiszka
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm.c        |   23 ++++++++---------------
 qemu-kvm.h        |    2 +-
 target-i386/kvm.c |    2 +-
 3 files changed, 10 insertions(+), 17 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index 9406fcf..b1405fd 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -197,19 +197,6 @@ static void kvm_finalize(KVMState *s)
     free(s);
 }
 
-static int kvm_set_boot_vcpu_id(kvm_context_t kvm, uint32_t id)
-{
-#ifdef KVM_CAP_SET_BOOT_CPU_ID
-    int r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_BOOT_CPU_ID);
-    if (r > 0) {
-        return kvm_vm_ioctl(kvm_state, KVM_SET_BOOT_CPU_ID, id);
-    }
-    return -ENOSYS;
-#else
-    return -ENOSYS;
-#endif
-}
-
 static int kvm_init_irq_routing(KVMState *s)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
@@ -1497,8 +1484,14 @@ void kvm_ioperm(CPUState *env, void *data)
 
 #endif
 
-int kvm_set_boot_cpu_id(uint32_t id)
+int kvm_set_boot_cpu_id(KVMState *s, uint32_t id)
 {
-    return kvm_set_boot_vcpu_id(&kvm_state->kvm_context, id);
+#ifdef KVM_CAP_SET_BOOT_CPU_ID
+    int r = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SET_BOOT_CPU_ID);
+    if (r > 0) {
+        return kvm_vm_ioctl(s, KVM_SET_BOOT_CPU_ID, id);
+    }
+#endif
+    return -ENOSYS;
 }
 
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 2c67a28..a55ef46 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -358,7 +358,7 @@ int kvm_arch_has_work(CPUState *env);
 void kvm_arch_process_irqchip_events(CPUState *env);
 int kvm_arch_try_push_interrupts(void *opaque);
 void kvm_arch_push_nmi(void);
-int kvm_set_boot_cpu_id(uint32_t id);
+int kvm_set_boot_cpu_id(KVMState *s, uint32_t id);
 
 void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
 
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 33239bf..9b8c460 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -665,7 +665,7 @@ int kvm_arch_init(KVMState *s)
         }
     }
 
-    ret = kvm_set_boot_cpu_id(0);
+    ret = kvm_set_boot_cpu_id(s, 0);
     if (ret < 0 && ret != -ENOSYS) {
         return ret;
     }
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 13/16] qemu-kvm: Remove handle_io_window
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (11 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState Jan Kiszka
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Disentangle the logic around handle_io_window in kvm_run.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm.c |    9 +--------
 1 files changed, 1 insertions(+), 8 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index b1405fd..2af70c5 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -339,11 +339,6 @@ static int handle_mmio(CPUState *env)
     return 0;
 }
 
-static int handle_io_window(kvm_context_t kvm)
-{
-    return 1;
-}
-
 static int handle_shutdown(kvm_context_t kvm, CPUState *env)
 {
     /* stop the current vcpu from going back to guest mode */
@@ -422,8 +417,7 @@ static int kvm_run(CPUState *env)
 
 #if !defined(__s390__)
     if (r == -1) {
-        r = handle_io_window(kvm);
-        goto more;
+        return 1;
     }
 #endif
     if (1) {
@@ -483,7 +477,6 @@ static int kvm_run(CPUState *env)
             break;
         }
     }
-more:
     if (!r) {
         goto again;
     }
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (12 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 13/16] qemu-kvm: Remove handle_io_window Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler Jan Kiszka
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Append the few additional fields needed for qemu-kvm to upstream's
KVMState and drop all related duplications.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 kvm-all.c  |   11 ++++-
 qemu-kvm.c |  121 ++++++++++++++++++++++++++++-------------------------------
 qemu-kvm.h |   58 -----------------------------
 3 files changed, 66 insertions(+), 124 deletions(-)

diff --git a/kvm-all.c b/kvm-all.c
index 9463341..a2c517e 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -50,8 +50,6 @@
     do { } while (0)
 #endif
 
-#ifdef OBSOLETE_KVM_IMPL
-
 typedef struct KVMSlot
 {
     target_phys_addr_t start_addr;
@@ -83,10 +81,19 @@ struct KVMState
     int xsave, xcrs;
     int many_ioeventfds;
     int pit_state2;
+
+    int irqchip_inject_ioctl;
+#ifdef KVM_CAP_IRQ_ROUTING
+    struct kvm_irq_routing *irq_routes;
+    int nr_allocated_irq_routes;
+#endif
+    void *used_gsi_bitmap;
+    int max_gsi;
 };
 
 KVMState *kvm_state;
 
+#ifdef OBSOLETE_KVM_IMPL
 
 static const KVMCapabilityInfo kvm_required_capabilites[] = {
     KVM_CAP_INFO(USER_MEMORY),
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 2af70c5..df8e817 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -53,9 +53,6 @@ int kvm_pit = 1;
 int kvm_pit_reinject = 1;
 int kvm_nested = 0;
 
-
-KVMState *kvm_state;
-
 pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER;
 pthread_cond_t qemu_vcpu_cond = PTHREAD_COND_INITIALIZER;
 pthread_cond_t qemu_system_cond = PTHREAD_COND_INITIALIZER;
@@ -101,24 +98,26 @@ static int handle_failed_vmentry(uint64_t reason)
     return -EINVAL;
 }
 
-static inline void set_gsi(kvm_context_t kvm, unsigned int gsi)
+static inline void set_gsi(KVMState *s, unsigned int gsi)
 {
-    uint32_t *bitmap = kvm->used_gsi_bitmap;
+    uint32_t *bitmap = s->used_gsi_bitmap;
 
-    if (gsi < kvm->max_gsi)
+    if (gsi < s->max_gsi) {
         bitmap[gsi / 32] |= 1U << (gsi % 32);
-    else
+    } else {
         DPRINTF("Invalid GSI %u\n", gsi);
+    }
 }
 
-static inline void clear_gsi(kvm_context_t kvm, unsigned int gsi)
+static inline void clear_gsi(KVMState *s, unsigned int gsi)
 {
-    uint32_t *bitmap = kvm->used_gsi_bitmap;
+    uint32_t *bitmap = s->used_gsi_bitmap;
 
-    if (gsi < kvm->max_gsi)
+    if (gsi < s->max_gsi) {
         bitmap[gsi / 32] &= ~(1U << (gsi % 32));
-    else
+    } else {
         DPRINTF("Invalid GSI %u\n", gsi);
+    }
 }
 
 static int kvm_create_context(void);
@@ -200,7 +199,6 @@ static void kvm_finalize(KVMState *s)
 static int kvm_init_irq_routing(KVMState *s)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = &s->kvm_context;
     int r, gsi_count;
 
     gsi_count = kvm_check_extension(s, KVM_CAP_IRQ_ROUTING);
@@ -209,17 +207,17 @@ static int kvm_init_irq_routing(KVMState *s)
 
         /* Round up so we can search ints using ffs */
         gsi_bits = ALIGN(gsi_count, 32);
-        kvm->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
-        kvm->max_gsi = gsi_bits;
+        s->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
+        s->max_gsi = gsi_bits;
 
         /* Mark any over-allocated bits as already in use */
         for (i = gsi_count; i < gsi_bits; i++) {
-            set_gsi(kvm, i);
+            set_gsi(s, i);
         }
     }
 
-    kvm->irq_routes = qemu_mallocz(sizeof(*kvm->irq_routes));
-    kvm->nr_allocated_irq_routes = 0;
+    s->irq_routes = qemu_mallocz(sizeof(*s->irq_routes));
+    s->nr_allocated_irq_routes = 0;
 
     r = kvm_arch_init_irq_routing();
     if (r < 0) {
@@ -233,7 +231,6 @@ static int kvm_init_irq_routing(KVMState *s)
 int kvm_create_irqchip(KVMState *s)
 {
 #ifdef KVM_CAP_IRQCHIP
-    kvm_context_t kvm = &s->kvm_context;
     int r;
 
     if (!kvm_irqchip || !kvm_check_extension(s, KVM_CAP_IRQCHIP)) {
@@ -246,10 +243,10 @@ int kvm_create_irqchip(KVMState *s)
         return r;
     }
 
-    kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
+    s->irqchip_inject_ioctl = KVM_IRQ_LINE;
 #if defined(KVM_CAP_IRQ_INJECT_STATUS) && defined(KVM_IRQ_LINE_STATUS)
     if (kvm_check_extension(s, KVM_CAP_IRQ_INJECT_STATUS)) {
-        kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
+        s->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
     }
 #endif
     s->irqchip_in_kernel = 1;
@@ -275,7 +272,7 @@ int kvm_set_irq(int irq, int level, int *status)
     }
     event.level = level;
     event.irq = irq;
-    r = kvm_vm_ioctl(kvm_state, kvm_state->kvm_context.irqchip_inject_ioctl,
+    r = kvm_vm_ioctl(kvm_state, kvm_state->irqchip_inject_ioctl,
                      &event);
     if (r < 0) {
         perror("kvm_set_irq");
@@ -283,9 +280,8 @@ int kvm_set_irq(int irq, int level, int *status)
 
     if (status) {
 #ifdef KVM_CAP_IRQ_INJECT_STATUS
-        *status =
-            (kvm_state->kvm_context.irqchip_inject_ioctl == KVM_IRQ_LINE) ?
-                1 : event.status;
+        *status = (kvm_state->irqchip_inject_ioctl == KVM_IRQ_LINE) ?
+            1 : event.status;
 #else
         *status = 1;
 #endif
@@ -339,7 +335,7 @@ static int handle_mmio(CPUState *env)
     return 0;
 }
 
-static int handle_shutdown(kvm_context_t kvm, CPUState *env)
+static int handle_shutdown(CPUState *env)
 {
     /* stop the current vcpu from going back to guest mode */
     env->stopped = 1;
@@ -348,21 +344,21 @@ static int handle_shutdown(kvm_context_t kvm, CPUState *env)
     return 1;
 }
 
-static inline void push_nmi(kvm_context_t kvm)
+static inline void push_nmi(void)
 {
 #ifdef KVM_CAP_USER_NMI
     kvm_arch_push_nmi();
 #endif                          /* KVM_CAP_USER_NMI */
 }
 
-static void post_kvm_run(kvm_context_t kvm, CPUState *env)
+static void post_kvm_run(CPUState *env)
 {
     pthread_mutex_lock(&qemu_mutex);
     kvm_arch_post_run(env, env->kvm_run);
     cpu_single_env = env;
 }
 
-static int pre_kvm_run(kvm_context_t kvm, CPUState *env)
+static int pre_kvm_run(CPUState *env)
 {
     kvm_arch_pre_run(env, env->kvm_run);
 
@@ -378,7 +374,6 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env)
 static int kvm_run(CPUState *env)
 {
     int r;
-    kvm_context_t kvm = &env->kvm_state->kvm_context;
     struct kvm_run *run = env->kvm_run;
     int fd = env->kvm_fd;
 
@@ -387,14 +382,14 @@ static int kvm_run(CPUState *env)
         kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
         env->kvm_vcpu_dirty = 0;
     }
-    push_nmi(kvm);
+    push_nmi();
 #if !defined(__s390__)
     if (!kvm_state->irqchip_in_kernel) {
         run->request_interrupt_window = kvm_arch_try_push_interrupts(env);
     }
 #endif
 
-    r = pre_kvm_run(kvm, env);
+    r = pre_kvm_run(env);
     if (r) {
         return r;
     }
@@ -406,12 +401,12 @@ static int kvm_run(CPUState *env)
 
     if (r == -1 && errno != EINTR && errno != EAGAIN) {
         r = -errno;
-        post_kvm_run(kvm, env);
+        post_kvm_run(env);
         fprintf(stderr, "kvm_run: %s\n", strerror(-r));
         return r;
     }
 
-    post_kvm_run(kvm, env);
+    post_kvm_run(env);
 
     kvm_flush_coalesced_mmio_buffer();
 
@@ -451,7 +446,7 @@ static int kvm_run(CPUState *env)
         case KVM_EXIT_IRQ_WINDOW_OPEN:
             break;
         case KVM_EXIT_SHUTDOWN:
-            r = handle_shutdown(kvm, env);
+            r = handle_shutdown(env);
             break;
 #if defined(__s390__)
         case KVM_EXIT_S390_SIEIC:
@@ -575,9 +570,7 @@ int kvm_has_gsi_routing(void)
 int kvm_clear_gsi_routes(void)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = &kvm_state->kvm_context;
-
-    kvm->irq_routes->nr = 0;
+    kvm_state->irq_routes->nr = 0;
     return 0;
 #else
     return -EINVAL;
@@ -587,34 +580,34 @@ int kvm_clear_gsi_routes(void)
 int kvm_add_routing_entry(struct kvm_irq_routing_entry *entry)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = &kvm_state->kvm_context;
+    KVMState *s = kvm_state;
     struct kvm_irq_routing *z;
     struct kvm_irq_routing_entry *new;
     int n, size;
 
-    if (kvm->irq_routes->nr == kvm->nr_allocated_irq_routes) {
-        n = kvm->nr_allocated_irq_routes * 2;
+    if (s->irq_routes->nr == s->nr_allocated_irq_routes) {
+        n = s->nr_allocated_irq_routes * 2;
         if (n < 64) {
             n = 64;
         }
         size = sizeof(struct kvm_irq_routing);
         size += n * sizeof(*new);
-        z = realloc(kvm->irq_routes, size);
+        z = realloc(s->irq_routes, size);
         if (!z) {
             return -ENOMEM;
         }
-        kvm->nr_allocated_irq_routes = n;
-        kvm->irq_routes = z;
+        s->nr_allocated_irq_routes = n;
+        s->irq_routes = z;
     }
-    n = kvm->irq_routes->nr++;
-    new = &kvm->irq_routes->entries[n];
+    n = s->irq_routes->nr++;
+    new = &s->irq_routes->entries[n];
     memset(new, 0, sizeof(*new));
     new->gsi = entry->gsi;
     new->type = entry->type;
     new->flags = entry->flags;
     new->u = entry->u;
 
-    set_gsi(kvm, entry->gsi);
+    set_gsi(s, entry->gsi);
 
     return 0;
 #else
@@ -641,21 +634,21 @@ int kvm_add_irq_route(int gsi, int irqchip, int pin)
 int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = &kvm_state->kvm_context;
+    KVMState *s = kvm_state;
     struct kvm_irq_routing_entry *e, *p;
     int i, gsi, found = 0;
 
     gsi = entry->gsi;
 
-    for (i = 0; i < kvm->irq_routes->nr; ++i) {
-        e = &kvm->irq_routes->entries[i];
+    for (i = 0; i < s->irq_routes->nr; ++i) {
+        e = &s->irq_routes->entries[i];
         if (e->type == entry->type && e->gsi == gsi) {
             switch (e->type) {
             case KVM_IRQ_ROUTING_IRQCHIP:{
                     if (e->u.irqchip.irqchip ==
                         entry->u.irqchip.irqchip
                         && e->u.irqchip.pin == entry->u.irqchip.pin) {
-                        p = &kvm->irq_routes->entries[--kvm->irq_routes->nr];
+                        p = &s->irq_routes->entries[--s->irq_routes->nr];
                         *e = *p;
                         found = 1;
                     }
@@ -667,7 +660,7 @@ int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
                         && e->u.msi.address_hi ==
                         entry->u.msi.address_hi
                         && e->u.msi.data == entry->u.msi.data) {
-                        p = &kvm->irq_routes->entries[--kvm->irq_routes->nr];
+                        p = &s->irq_routes->entries[--s->irq_routes->nr];
                         *e = *p;
                         found = 1;
                     }
@@ -679,13 +672,13 @@ int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
             if (found) {
                 /* If there are no other users of this GSI
                  * mark it available in the bitmap */
-                for (i = 0; i < kvm->irq_routes->nr; i++) {
-                    e = &kvm->irq_routes->entries[i];
+                for (i = 0; i < s->irq_routes->nr; i++) {
+                    e = &s->irq_routes->entries[i];
                     if (e->gsi == gsi)
                         break;
                 }
-                if (i == kvm->irq_routes->nr) {
-                    clear_gsi(kvm, gsi);
+                if (i == s->irq_routes->nr) {
+                    clear_gsi(s, gsi);
                 }
 
                 return 0;
@@ -702,7 +695,7 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
                              struct kvm_irq_routing_entry *newentry)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = &kvm_state->kvm_context;
+    KVMState *s = kvm_state;
     struct kvm_irq_routing_entry *e;
     int i;
 
@@ -710,8 +703,8 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
         return -EINVAL;
     }
 
-    for (i = 0; i < kvm->irq_routes->nr; ++i) {
-        e = &kvm->irq_routes->entries[i];
+    for (i = 0; i < s->irq_routes->nr; ++i) {
+        e = &s->irq_routes->entries[i];
         if (e->type != entry->type || e->gsi != entry->gsi) {
             continue;
         }
@@ -761,10 +754,10 @@ int kvm_del_irq_route(int gsi, int irqchip, int pin)
 int kvm_commit_irq_routes(void)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
-    kvm_context_t kvm = &kvm_state->kvm_context;
+    KVMState *s = kvm_state;
 
-    kvm->irq_routes->flags = 0;
-    return kvm_vm_ioctl(kvm_state, KVM_SET_GSI_ROUTING, kvm->irq_routes);
+    s->irq_routes->flags = 0;
+    return kvm_vm_ioctl(s, KVM_SET_GSI_ROUTING, s->irq_routes);
 #else
     return -ENOSYS;
 #endif
@@ -772,12 +765,12 @@ int kvm_commit_irq_routes(void)
 
 int kvm_get_irq_route_gsi(void)
 {
-    kvm_context_t kvm = &kvm_state->kvm_context;
+    KVMState *s = kvm_state;
     int i, bit;
-    uint32_t *buf = kvm->used_gsi_bitmap;
+    uint32_t *buf = s->used_gsi_bitmap;
 
     /* Return the lowest unused GSI in the bitmap */
-    for (i = 0; i < kvm->max_gsi / 32; i++) {
+    for (i = 0; i < s->max_gsi / 32; i++) {
         bit = ffs(~buf[i]);
         if (!bit) {
             continue;
diff --git a/qemu-kvm.h b/qemu-kvm.h
index a55ef46..7386b46 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -43,25 +43,6 @@
 #define MAX_VCPUS 16
 #endif
 
-/**
- * \brief The KVM context
- *
- * The verbose KVM context
- */
-
-struct kvm_context {
-    /// ioctl to use to inject interrupts
-    int irqchip_inject_ioctl;
-#ifdef KVM_CAP_IRQ_ROUTING
-    struct kvm_irq_routing *irq_routes;
-    int nr_allocated_irq_routes;
-#endif
-    void *used_gsi_bitmap;
-    int max_gsi;
-};
-
-typedef struct kvm_context *kvm_context_t;
-
 #include "kvm.h"
 
 int kvm_arch_run(CPUState *env);
@@ -397,47 +378,8 @@ int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip,
 #define kvm_nested 0
 #endif
 
-#ifdef CONFIG_KVM
-
-typedef struct KVMSlot {
-    target_phys_addr_t start_addr;
-    ram_addr_t memory_size;
-    ram_addr_t phys_offset;
-    int slot;
-    int flags;
-} KVMSlot;
-
-typedef struct kvm_dirty_log KVMDirtyLog;
-
-struct KVMState {
-    KVMSlot slots[32];
-    int fd;
-    int vmfd;
-    int coalesced_mmio;
-#ifdef KVM_CAP_COALESCED_MMIO
-    struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
-#endif
-    int broken_set_mem_region;
-    int migration_log;
-    int vcpu_events;
-    int robust_singlestep;
-    int debugregs;
-#ifdef KVM_CAP_SET_GUEST_DEBUG
-    QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints;
-#endif
-    int irqchip_in_kernel;
-    int pit_in_kernel;
-    int xsave, xcrs;
-    int many_ioeventfds;
-    int pit_state2;
-
-    struct kvm_context kvm_context;
-};
-
 int kvm_tpr_enable_vapic(CPUState *env);
 
 unsigned long kvm_get_thread_id(void);
 
 #endif
-
-#endif
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (13 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-13 12:14 ` [PATCH 16/16] qemu-kvm: Use upstream kvm_init Jan Kiszka
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Instead of hooking into tcg_handler_interrupt, set cpu_interrupt_handler
just like upstream and move kvm_update_interrupt_request to
kvm_handle_interrupt. It's not worth keeping the check for !irqchip, we
will only rarely get here in the in-kernel irqchip case.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 exec.c     |    2 --
 kvm-all.c  |    3 ++-
 qemu-kvm.c |    2 ++
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/exec.c b/exec.c
index 169f9f4..6c4b32b 100644
--- a/exec.c
+++ b/exec.c
@@ -1646,8 +1646,6 @@ static void tcg_handle_interrupt(CPUState *env, int mask)
 
     old_mask = env->interrupt_request;
     env->interrupt_request |= mask;
-    if (kvm_enabled() && !kvm_irqchip_in_kernel())
-	kvm_update_interrupt_request(env);
 
     /*
      * If called from iothread context, wake the target cpu in
diff --git a/kvm-all.c b/kvm-all.c
index a2c517e..8ded95c 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -683,7 +683,6 @@ static CPUPhysMemoryClient kvm_cpu_phys_memory_client = {
     .log_stop = kvm_log_stop,
 };
 
-#ifdef OBSOLETE_KVM_IMPL
 static void kvm_handle_interrupt(CPUState *env, int mask)
 {
     env->interrupt_request |= mask;
@@ -691,8 +690,10 @@ static void kvm_handle_interrupt(CPUState *env, int mask)
     if (!qemu_cpu_is_self(env)) {
         qemu_cpu_kick(env);
     }
+    kvm_update_interrupt_request(env);
 }
 
+#ifdef OBSOLETE_KVM_IMPL
 int kvm_init(void)
 {
     static const char upgrade_note[] =
diff --git a/qemu-kvm.c b/qemu-kvm.c
index df8e817..5ba5b0a 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1409,6 +1409,8 @@ static int kvm_create_context(void)
 
     kvm_init_ap();
 
+    cpu_interrupt_handler = kvm_handle_interrupt;
+
     return 0;
 }
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 16/16] qemu-kvm: Use upstream kvm_init
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (14 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
  2011-05-16 10:37 ` [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Avi Kivity
  2011-05-17 18:47 ` Marcelo Tosatti
  17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Fold remaining qemu-kvm specific initialization bits into upsteam
kvm_init and use that service.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 kvm-all.c         |   17 +++---
 kvm.h             |    4 --
 qemu-kvm-x86.c    |    2 +-
 qemu-kvm.c        |  156 +----------------------------------------------------
 qemu-kvm.h        |   13 -----
 target-i386/kvm.c |    2 -
 6 files changed, 12 insertions(+), 182 deletions(-)

diff --git a/kvm-all.c b/kvm-all.c
index 8ded95c..6b35ea5 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -93,16 +93,12 @@ struct KVMState
 
 KVMState *kvm_state;
 
-#ifdef OBSOLETE_KVM_IMPL
-
 static const KVMCapabilityInfo kvm_required_capabilites[] = {
     KVM_CAP_INFO(USER_MEMORY),
     KVM_CAP_INFO(DESTROY_MEMORY_REGION_WORKS),
     KVM_CAP_LAST_INFO
 };
 
-#endif
-
 static KVMSlot *kvm_alloc_slot(KVMState *s)
 {
     int i;
@@ -512,7 +508,6 @@ static int kvm_check_many_ioeventfds(void)
 #endif
 }
 
-#ifdef OBSOLETE_KVM_IMPL
 static const KVMCapabilityInfo *
 kvm_check_extension_list(KVMState *s, const KVMCapabilityInfo *list)
 {
@@ -524,7 +519,6 @@ kvm_check_extension_list(KVMState *s, const KVMCapabilityInfo *list)
     }
     return NULL;
 }
-#endif
 
 static void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
                              ram_addr_t phys_offset)
@@ -693,7 +687,6 @@ static void kvm_handle_interrupt(CPUState *env, int mask)
     kvm_update_interrupt_request(env);
 }
 
-#ifdef OBSOLETE_KVM_IMPL
 int kvm_init(void)
 {
     static const char upgrade_note[] =
@@ -797,6 +790,8 @@ int kvm_init(void)
     s->pit_state2 = kvm_check_extension(s, KVM_CAP_PIT_STATE2);
 #endif
 
+    s->pit_in_kernel = kvm_pit;
+
     ret = kvm_arch_init(s);
     if (ret < 0) {
         goto err;
@@ -807,6 +802,13 @@ int kvm_init(void)
 
     s->many_ioeventfds = kvm_check_many_ioeventfds();
 
+    ret = kvm_create_irqchip(s);
+    if (ret < 0) {
+        return ret;
+    }
+
+    kvm_init_ap();
+
     cpu_interrupt_handler = kvm_handle_interrupt;
 
     return 0;
@@ -824,7 +826,6 @@ err:
 
     return ret;
 }
-#endif
 
 static void kvm_handle_io(uint16_t port, void *data, int direction, int size,
                           uint32_t count)
diff --git a/kvm.h b/kvm.h
index 75dc7cf..288a452 100644
--- a/kvm.h
+++ b/kvm.h
@@ -30,7 +30,6 @@ extern int kvm_allowed;
 #define kvm_enabled() (0)
 #endif
 
-#ifdef OBSOLETE_KVM_IMPL
 struct kvm_run;
 
 typedef struct KVMCapabilityInfo {
@@ -44,7 +43,6 @@ typedef struct KVMCapabilityInfo {
 /* external API */
 
 int kvm_init(void);
-#endif /* OBSOLETE_KVM_IMPL */
 
 int kvm_has_sync_mmu(void);
 int kvm_has_vcpu_events(void);
@@ -99,9 +97,7 @@ int kvm_vcpu_ioctl(CPUState *env, int type, ...);
 
 /* Arch specific hooks */
 
-#ifdef OBSOLETE_KVM_IMPL
 extern const KVMCapabilityInfo kvm_arch_required_capabilities[];
-#endif
 
 void kvm_arch_pre_run(CPUState *env, struct kvm_run *run);
 void kvm_arch_post_run(CPUState *env, struct kvm_run *run);
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 2aa833f..b009251 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -28,7 +28,7 @@ static int kvm_create_pit(KVMState *s)
 #ifdef KVM_CAP_PIT
     int r;
 
-    if (kvm_pit_in_kernel()) {
+    if (kvm_pit) {
         r = kvm_vm_ioctl(s, KVM_CREATE_PIT);
         if (r < 0) {
             fprintf(stderr, "Create kernel PIC irqchip failed\n");
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 5ba5b0a..c9ff5fe 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -120,82 +120,6 @@ static inline void clear_gsi(KVMState *s, unsigned int gsi)
     }
 }
 
-static int kvm_create_context(void);
-
-int kvm_init(void)
-{
-    int fd;
-    int r, i;
-
-
-    fd = open("/dev/kvm", O_RDWR);
-    if (fd == -1) {
-        perror("open /dev/kvm");
-        return -1;
-    }
-    r = ioctl(fd, KVM_GET_API_VERSION, 0);
-    if (r == -1) {
-        fprintf(stderr,
-                "kvm kernel version too old: "
-                "KVM_GET_API_VERSION ioctl not supported\n");
-        goto out_close;
-    }
-    if (r < EXPECTED_KVM_API_VERSION) {
-        fprintf(stderr, "kvm kernel version too old: "
-                "We expect API version %d or newer, but got "
-                "version %d\n", EXPECTED_KVM_API_VERSION, r);
-        goto out_close;
-    }
-    if (r > EXPECTED_KVM_API_VERSION) {
-        fprintf(stderr, "kvm userspace version too old\n");
-        goto out_close;
-    }
-    kvm_state = qemu_mallocz(sizeof(*kvm_state));
-
-    kvm_state->fd = fd;
-    kvm_state->vmfd = -1;
-
-#ifdef KVM_CAP_SET_GUEST_DEBUG
-    QTAILQ_INIT(&kvm_state->kvm_sw_breakpoints);
-#endif
-
-    for (i = 0; i < ARRAY_SIZE(kvm_state->slots); i++) {
-        kvm_state->slots[i].slot = i;
-    }
-
-#ifdef KVM_CAP_USER_MEMORY
-    r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY);
-    if (r <= 0) {
-        fprintf(stderr,
-                "Hypervisor too old: KVM_CAP_USER_MEMORY extension not supported\n");
-        goto out_close;
-    }
-#else
-#error Hypervisor too old: KVM_CAP_USER_MEMORY extension not supported
-#endif
-
-    cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
-
-    pthread_mutex_lock(&qemu_mutex);
-    return kvm_create_context();
-
-  out_close:
-    close(fd);
-    return -1;
-}
-
-static void kvm_finalize(KVMState *s)
-{
-    /* FIXME
-       if (kvm->vcpu_fd[0] != -1)
-           close(kvm->vcpu_fd[0]);
-       if (kvm->vm_fd != -1)
-           close(kvm->vm_fd);
-     */
-    close(s->fd);
-    free(s);
-}
-
 static int kvm_init_irq_routing(KVMState *s)
 {
 #ifdef KVM_CAP_IRQ_ROUTING
@@ -1225,6 +1149,8 @@ int kvm_init_ap(void)
 {
     struct sigaction action;
 
+    pthread_mutex_lock(&qemu_mutex);
+
     qemu_add_vm_change_state_handler(kvm_vm_state_change_handler, NULL);
 
     signal(SIG_IPI, sig_ipi_handler);
@@ -1336,84 +1262,6 @@ int kvm_arch_init_irq_routing(void)
 }
 #endif
 
-static int kvm_create_context(void)
-{
-    static const char upgrade_note[] =
-    "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
-    "(see http://sourceforge.net/projects/kvm).\n";
-
-    int r;
-
-    kvm_state->pit_in_kernel = kvm_pit;
-
-    kvm_state->vmfd = kvm_ioctl(kvm_state, KVM_CREATE_VM, 0);
-    if (kvm_state->vmfd < 0) {
-        fprintf(stderr, "kvm_create_vm: %m\n");
-        kvm_finalize(kvm_state);
-        return -1;
-    }
-
-    r = kvm_arch_init(kvm_state);
-    if (r < 0) {
-        kvm_finalize(kvm_state);
-        return r;
-    }
-
-    /* There was a nasty bug in < kvm-80 that prevents memory slots from being
-     * destroyed properly.  Since we rely on this capability, refuse to work
-     * with any kernel without this capability. */
-    if (!kvm_check_extension(kvm_state, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) {
-        fprintf(stderr,
-                "KVM kernel module broken (DESTROY_MEMORY_REGION).\n%s",
-                upgrade_note);
-        return -EINVAL;
-    }
-
-    r = kvm_create_irqchip(kvm_state);
-    if (r < 0) {
-        return r;
-    }
-
-    kvm_state->coalesced_mmio = 0;
-#ifdef KVM_CAP_COALESCED_MMIO
-    kvm_state->coalesced_mmio =
-        kvm_check_extension(kvm_state, KVM_CAP_COALESCED_MMIO);
-#endif
-
-    kvm_state->vcpu_events = 0;
-#ifdef KVM_CAP_VCPU_EVENTS
-    kvm_state->vcpu_events = kvm_check_extension(kvm_state, KVM_CAP_VCPU_EVENTS);
-#endif
-
-    kvm_state->debugregs = 0;
-#ifdef KVM_CAP_DEBUGREGS
-    kvm_state->debugregs = kvm_check_extension(kvm_state, KVM_CAP_DEBUGREGS);
-#endif
-
-    kvm_state->xsave = 0;
-#ifdef KVM_CAP_XSAVE
-    kvm_state->xsave = kvm_check_extension(kvm_state, KVM_CAP_XSAVE);
-#endif
-
-    kvm_state->xcrs = 0;
-#ifdef KVM_CAP_XCRS
-    kvm_state->xcrs = kvm_check_extension(kvm_state, KVM_CAP_XCRS);
-#endif
-
-    kvm_state->many_ioeventfds = kvm_check_many_ioeventfds();
-
-    kvm_state->pit_state2 = 0;
-#ifdef KVM_CAP_PIT_STATE2
-    kvm_state->pit_state2 = kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2);
-#endif
-
-    kvm_init_ap();
-
-    cpu_interrupt_handler = kvm_handle_interrupt;
-
-    return 0;
-}
-
 static void kvm_mutex_unlock(void)
 {
     assert(!cpu_single_env);
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 7386b46..b552e1e 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -311,19 +311,6 @@ struct kvm_pit_state {
 
 #endif                          /* !CONFIG_KVM */
 
-
-/*!
- * \brief Create new KVM context
- *
- * This creates a new kvm_context. A KVM context is a small area of data that
- * holds information about the KVM instance that gets created by this call.\n
- * This should always be your first call to KVM.
- *
- * \param opaque Not used
- * \return NULL on failure
- */
-int kvm_init(void);
-
 int kvm_main_loop(void);
 int kvm_init_ap(void);
 void kvm_save_lapic(CPUState *env);
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 9b8c460..a4365bf 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -53,14 +53,12 @@
 #define BUS_MCEERR_AO 5
 #endif
 
-#ifdef OBSOLETE_KVM_IMPL
 const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
     KVM_CAP_INFO(SET_TSS_ADDR),
     KVM_CAP_INFO(EXT_CPUID),
     KVM_CAP_INFO(MP_STATE),
     KVM_CAP_LAST_INFO
 };
-#endif
 
 static bool has_msr_star;
 static bool has_msr_hsave_pa;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing"
  2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
@ 2011-05-16 10:24   ` Avi Kivity
  2011-05-16 10:33     ` Avi Kivity
  0 siblings, 1 reply; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:24 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm

On 05/13/2011 03:13 PM, Jan Kiszka wrote:
> This reverts commit fd6bfef3d49a62b36092f131690de3e34f84662d.
>
> It is a nop, and it always was a nop:
>
>      irq0override = !kvm_irqchip || kvm_has_gsi_routing
>
> But this code is only executed when gsi routing is available.

That means that if kvm_has_gsi_routing, then irq0override = true, and 
this code is executed?

-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq
  2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
@ 2011-05-16 10:29   ` Avi Kivity
  0 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:29 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm

On 05/13/2011 03:13 PM, Jan Kiszka wrote:
> The IRQ0 override is not configurable while using the user space IOAPIC.
> When the in-kernel irqchip is active, ioapic_set_irq is never called. So
> drop this useless test.
>

> @@ -146,7 +145,7 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
>        * the cleanest way of doing it but it should work. */
>
>       DPRINTF("%s: %s vec %x\n", __func__, level ? "raise" : "lower", vector);
> -    if (vector == 0&&  irq0override) {
> +    if (vector == 0) {
>           vector = 2;
>       }
>       if (vector>= 0&&  vector<  IOAPIC_NUM_PINS) {

Incidentally, the variable should be called pin, not vector, and 
gsi->ioapic/pic wiring should be done outside the ioapic code.

-- 

error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing"
  2011-05-16 10:24   ` Avi Kivity
@ 2011-05-16 10:33     ` Avi Kivity
  0 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:33 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm

On 05/16/2011 01:24 PM, Avi Kivity wrote:
> On 05/13/2011 03:13 PM, Jan Kiszka wrote:
>> This reverts commit fd6bfef3d49a62b36092f131690de3e34f84662d.
>>
>> It is a nop, and it always was a nop:
>>
>>      irq0override = !kvm_irqchip || kvm_has_gsi_routing
>>
>> But this code is only executed when gsi routing is available.
>
> That means that if kvm_has_gsi_routing, then irq0override = true, and 
> this code is executed?
>

Ah, sorry, you did constant propagation here.  Patch is fine.

-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (15 preceding siblings ...)
  2011-05-13 12:14 ` [PATCH 16/16] qemu-kvm: Use upstream kvm_init Jan Kiszka
@ 2011-05-16 10:37 ` Avi Kivity
  2011-05-17 18:47 ` Marcelo Tosatti
  17 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:37 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm

On 05/13/2011 03:13 PM, Jan Kiszka wrote:
> The second round of merging qemu-kvm with upstream. This part stops
> after switching to upstreams kvm_init implementation.
>
> To achieve this, various small cleanups and refactorings are applied,
> the irq0 override management is simplified and the kvm_context fields
> are migrated into KVMState.
>

Looks good.

-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II
  2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
                   ` (16 preceding siblings ...)
  2011-05-16 10:37 ` [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Avi Kivity
@ 2011-05-17 18:47 ` Marcelo Tosatti
  17 siblings, 0 replies; 22+ messages in thread
From: Marcelo Tosatti @ 2011-05-17 18:47 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Avi Kivity, kvm

On Fri, May 13, 2011 at 02:13:54PM +0200, Jan Kiszka wrote:
> The second round of merging qemu-kvm with upstream. This part stops
> after switching to upstreams kvm_init implementation.
> 
> To achieve this, various small cleanups and refactorings are applied,
> the irq0 override management is simplified and the kvm_context fields
> are migrated into KVMState.
> 
> Please review/merge.

Applied, thanks.


^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2011-05-17 18:47 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
2011-05-13 12:13 ` [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper Jan Kiszka
2011-05-13 12:13 ` [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt Jan Kiszka
2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
2011-05-16 10:24   ` Avi Kivity
2011-05-16 10:33     ` Avi Kivity
2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
2011-05-16 10:29   ` Avi Kivity
2011-05-13 12:13 ` [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration Jan Kiszka
2011-05-13 12:14 ` [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization Jan Kiszka
2011-05-13 12:14 ` [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip Jan Kiszka
2011-05-13 12:14 ` [PATCH 08/16] qemu-kvm: Make some private functions static Jan Kiszka
2011-05-13 12:14 ` [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style Jan Kiszka
2011-05-13 12:14 ` [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq Jan Kiszka
2011-05-13 12:14 ` [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces Jan Kiszka
2011-05-13 12:14 ` [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id Jan Kiszka
2011-05-13 12:14 ` [PATCH 13/16] qemu-kvm: Remove handle_io_window Jan Kiszka
2011-05-13 12:14 ` [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState Jan Kiszka
2011-05-13 12:14 ` [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler Jan Kiszka
2011-05-13 12:14 ` [PATCH 16/16] qemu-kvm: Use upstream kvm_init Jan Kiszka
2011-05-16 10:37 ` [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Avi Kivity
2011-05-17 18:47 ` Marcelo Tosatti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox