Skip to contentSkip to conversation

revert part of 3db8b916e merge

PATCH Applied Gleb Natapov 2 participants 4 messages Jun 3, 2009 – Jun 4, 2009 KVM

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 revert part of 3db8b916e merge

kvm_*_mpstate() cannot be called from kvm_arch_*_registers() since kvm_arch_*_registers() sometimes called from io thread, but kvm_*_mpstate() can be called only by cpu thread.

qemu-kvm.c +0 -23
index 68d3b92..7ed1e06 100644
@@ -1431,26 +1431,3 @@ void qemu_kvm_cpu_stop(CPUState *env)
     if (kvm_enabled())
         env->kvm_cpu_state.stopped = 1;
 }
-
-void kvm_arch_get_registers(CPUState *env)
-{
-    kvm_save_registers(env);
-    kvm_save_mpstate(env);
-}
-
-void kvm_arch_put_registers(CPUState *env)
-{
-    kvm_load_registers(env);
-    kvm_load_mpstate(env);
-}
-
-
-void cpu_synchronize_state(CPUState *env, int modified)
-{
-    if (kvm_enabled()) {
-        if (modified)
-            kvm_arch_put_registers(env);
-        else
-            kvm_arch_get_registers(env);
-    }
-}
qemu-kvm.h +18 -3
index 725589b..5d47e88 100644
@@ -216,10 +216,25 @@ int kvm_log_stop(target_phys_addr_t phys_addr, target_phys_addr_t len);
 
 static inline int kvm_sync_vcpus(void) { return 0; }
 
-void kvm_arch_get_registers(CPUState *env);
-void kvm_arch_put_registers(CPUState *env);
+static inline void kvm_arch_get_registers(CPUState *env)
+{
+    kvm_save_registers(env);
+}
 
-void cpu_synchronize_state(CPUState *env, int modified);
+static inline void kvm_arch_put_registers(CPUState *env)
+{
+    kvm_load_registers(env);
+}
+
+static inline void cpu_synchronize_state(CPUState *env, int modified)
+{
+    if (kvm_enabled()) {
+        if (modified)
+            kvm_arch_put_registers(env);
+        else
+            kvm_arch_get_registers(env);
+    }
+}
 
 uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
                                       int reg);
target-i386/machine.c +4 -1
index f280d3d..07df1e1 100644
@@ -32,7 +32,10 @@ void cpu_save(QEMUFile *f, void *opaque)
     int32_t pending_irq;
     int i, bit;
 
-    cpu_synchronize_state(env, 0);
+    if (kvm_enabled()) {
+        kvm_save_registers(env);
+        kvm_save_mpstate(env);
+    }
 
     for(i = 0; i < CPU_NB_REGS; i++)
         qemu_put_betls(f, &env->regs[i]);

--
Gleb.

#1 lore raw
Quoted 5 lines · Gleb Natapov

kvm_*_mpstate() cannot be called from kvm_arch_*_registers() since kvm_arch_*_registers() sometimes called from io thread, but kvm_*_mpstate() can be called only by cpu thread.

I really dislike vcpu functions to be called from outside the vcpu thread. Who are the callers?

Quoted 84 lines
qemu-kvm.c +0 -23
index 68d3b92..7ed1e06 100644
@@ -1431,26 +1431,3 @@ void qemu_kvm_cpu_stop(CPUState *env)
     if (kvm_enabled())
         env->kvm_cpu_state.stopped = 1;
 }
-
-void kvm_arch_get_registers(CPUState *env)
-{
-    kvm_save_registers(env);
-    kvm_save_mpstate(env);
-}
-
-void kvm_arch_put_registers(CPUState *env)
-{
-    kvm_load_registers(env);
-    kvm_load_mpstate(env);
-}
-
-
-void cpu_synchronize_state(CPUState *env, int modified)
-{
-    if (kvm_enabled()) {
-        if (modified)
-            kvm_arch_put_registers(env);
-        else
-            kvm_arch_get_registers(env);
-    }
-}
qemu-kvm.h +18 -3
index 725589b..5d47e88 100644
@@ -216,10 +216,25 @@ int kvm_log_stop(target_phys_addr_t phys_addr, target_phys_addr_t len);
 
 static inline int kvm_sync_vcpus(void) { return 0; }
 
-void kvm_arch_get_registers(CPUState *env);
-void kvm_arch_put_registers(CPUState *env);
+static inline void kvm_arch_get_registers(CPUState *env)
+{
+    kvm_save_registers(env);
+}
 
-void cpu_synchronize_state(CPUState *env, int modified);
+static inline void kvm_arch_put_registers(CPUState *env)
+{
+    kvm_load_registers(env);
+}
+
+static inline void cpu_synchronize_state(CPUState *env, int modified)
+{
+    if (kvm_enabled()) {
+        if (modified)
+            kvm_arch_put_registers(env);
+        else
+            kvm_arch_get_registers(env);
+    }
+}
 
 uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
                                       int reg);
target-i386/machine.c +4 -2
index f280d3d..07df1e1 100644
@@ -32,7 +32,10 @@ void cpu_save(QEMUFile *f, void *opaque)
     int32_t pending_irq;
     int i, bit;
 
-    cpu_synchronize_state(env, 0);
+    if (kvm_enabled()) {
+        kvm_save_registers(env);
+        kvm_save_mpstate(env);
+    }
 
     for(i = 0; i < CPU_NB_REGS; i++)
         qemu_put_betls(f, &env->regs[i]);
--

Gleb.

Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
#2 lore raw
Quoted 10 lines · Avi Kivity
Quoted 5 lines · Gleb Natapov

kvm_*_mpstate() cannot be called from kvm_arch_*_registers() since kvm_arch_*_registers() sometimes called from io thread, but kvm_*_mpstate() can be called only by cpu thread.

I really dislike vcpu functions to be called from outside the vcpu thread. Who are the callers?

monitor.c. May be others (git grep cpu_synchronize_state). But kvm_save_registers() does the right thing and calls another function on vcpu thread.

Quoted 71 lines
Quoted 71 lines
qemu-kvm.c +0 -23
index 68d3b92..7ed1e06 100644
@@ -1431,26 +1431,3 @@ void qemu_kvm_cpu_stop(CPUState *env)
     if (kvm_enabled())
         env->kvm_cpu_state.stopped = 1;
 }
-
-void kvm_arch_get_registers(CPUState *env)
-{
-    kvm_save_registers(env);
-    kvm_save_mpstate(env);
-}
-
-void kvm_arch_put_registers(CPUState *env)
-{
-    kvm_load_registers(env);
-    kvm_load_mpstate(env);
-}
-
-
-void cpu_synchronize_state(CPUState *env, int modified)
-{
-    if (kvm_enabled()) {
-        if (modified)
-            kvm_arch_put_registers(env);
-        else
-            kvm_arch_get_registers(env);
-    }
-}
qemu-kvm.h +18 -1
index 725589b..5d47e88 100644
@@ -216,10 +216,25 @@ int kvm_log_stop(target_phys_addr_t phys_addr, target_phys_addr_t len);
  static inline int kvm_sync_vcpus(void) { return 0; }
 -void kvm_arch_get_registers(CPUState *env);
-void kvm_arch_put_registers(CPUState *env);
+static inline void kvm_arch_get_registers(CPUState *env)
+{
+    kvm_save_registers(env);
+}
 -void cpu_synchronize_state(CPUState *env, int modified);
+static inline void kvm_arch_put_registers(CPUState *env)
+{
+    kvm_load_registers(env);
+}
+
+static inline void cpu_synchronize_state(CPUState *env, int modified)
+{
+    if (kvm_enabled()) {
+        if (modified)
+            kvm_arch_put_registers(env);
+        else
+            kvm_arch_get_registers(env);
+    }
+}
  uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t 
 function,
                                       int reg);
target-i386/machine.c +1 -0
index f280d3d..07df1e1 100644
@@ -32,7 +32,10 @@ void cpu_save(QEMUFile *f, void *opaque)
     int32_t pending_irq;
     int i, bit;
 -    cpu_synchronize_state(env, 0);
+    if (kvm_enabled()) {
Quoted 12 lines
Quoted 8 lines
target-i386/machine.c +3 -1
+        kvm_save_registers(env);
+        kvm_save_mpstate(env);
+    }
      for(i = 0; i < CPU_NB_REGS; i++)
         qemu_put_betls(f, &env->regs[i]);
--
 			Gleb.
Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.

--
Gleb.

Applied
#3 lore raw
In reply to Gleb Natapov
Quoted 4 lines · Gleb Natapov

kvm_*_mpstate() cannot be called from kvm_arch_*_registers() since kvm_arch_*_registers() sometimes called from io thread, but kvm_*_mpstate() can be called only by cpu thread.

Applied, thanks.

Signature · 1 line
error compiling committee.c: too many arguments to function