qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] accel/kvm: Cleanups around kvm_arch_put_registers()
@ 2025-10-07  8:16 Philippe Mathieu-Daudé
  2025-10-07  8:16 ` [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE Philippe Mathieu-Daudé
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-07  8:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Weiwei Li, David Hildenbrand, Philippe Mathieu-Daudé,
	Christian Borntraeger, Daniel Henrique Barboza, qemu-s390x,
	Song Gao, Liu Zhiwei, Matthew Rosato, Eric Farman,
	Richard Henderson, Halil Pasic, kvm, Aurelien Jarno,
	Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen, qemu-riscv,
	Nicholas Piggin, Harsh Prateek Bora, Chinmay Rath,
	Ilya Leoshkevich, Thomas Huth, qemu-ppc, Alistair Francis,
	Paolo Bonzini, Palmer Dabbelt, Jiaxun Yang

Extracted from a bigger series aiming to make accelerator
synchronization of vcpu state slightly clearer. Here KVM
patches around kvm_arch_put_registers():
- Move KVM_PUT_[RESET|RUNTIME|FULL]_STATE to an enum
- Factor common code out of kvm_cpu_synchronize_post_*()

Philippe Mathieu-Daudé (3):
  accel/kvm: Do not expect more then KVM_PUT_FULL_STATE
  accel/kvm: Introduce KvmPutState enum
  accel/kvm: Factor kvm_cpu_synchronize_put() out

 include/system/kvm.h       | 16 +++++++------
 accel/kvm/kvm-all.c        | 47 +++++++++++++++-----------------------
 target/i386/kvm/kvm.c      |  6 ++---
 target/loongarch/kvm/kvm.c |  8 +++----
 target/mips/kvm.c          |  6 ++---
 target/ppc/kvm.c           |  2 +-
 target/riscv/kvm/kvm-cpu.c |  2 +-
 target/s390x/kvm/kvm.c     |  2 +-
 8 files changed, 41 insertions(+), 48 deletions(-)

-- 
2.51.0



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

* [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE
  2025-10-07  8:16 [PATCH 0/3] accel/kvm: Cleanups around kvm_arch_put_registers() Philippe Mathieu-Daudé
@ 2025-10-07  8:16 ` Philippe Mathieu-Daudé
  2025-10-07  8:20   ` Harsh Prateek Bora
  2025-10-07  8:16 ` [PATCH 2/3] accel/kvm: Introduce KvmPutState enum Philippe Mathieu-Daudé
  2025-10-07  8:16 ` [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out Philippe Mathieu-Daudé
  2 siblings, 1 reply; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-07  8:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Weiwei Li, David Hildenbrand, Philippe Mathieu-Daudé,
	Christian Borntraeger, Daniel Henrique Barboza, qemu-s390x,
	Song Gao, Liu Zhiwei, Matthew Rosato, Eric Farman,
	Richard Henderson, Halil Pasic, kvm, Aurelien Jarno,
	Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen, qemu-riscv,
	Nicholas Piggin, Harsh Prateek Bora, Chinmay Rath,
	Ilya Leoshkevich, Thomas Huth, qemu-ppc, Alistair Francis,
	Paolo Bonzini, Palmer Dabbelt, Jiaxun Yang

KVM_PUT_FULL_STATE is the higher level defined so far in
"system/kvm.h"; do not check for more.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/loongarch/kvm/kvm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
index e5ea2dba9da..45292edcb1c 100644
--- a/target/loongarch/kvm/kvm.c
+++ b/target/loongarch/kvm/kvm.c
@@ -397,7 +397,7 @@ static int kvm_loongarch_put_csr(CPUState *cs, int level)
                            &env->CSR_RVACFG);
 
     /* CPUID is constant after poweron, it should be set only once */
-    if (level >= KVM_PUT_FULL_STATE) {
+    if (level == KVM_PUT_FULL_STATE) {
         ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CPUID),
                            &env->CSR_CPUID);
     }
@@ -801,7 +801,7 @@ int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
         once = 1;
     }
 
-    if (level >= KVM_PUT_FULL_STATE) {
+    if (level == KVM_PUT_FULL_STATE) {
         /*
          * only KVM_PUT_FULL_STATE is required, kvm kernel will clear
          * guest_addr for KVM_PUT_RESET_STATE
-- 
2.51.0



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

* [PATCH 2/3] accel/kvm: Introduce KvmPutState enum
  2025-10-07  8:16 [PATCH 0/3] accel/kvm: Cleanups around kvm_arch_put_registers() Philippe Mathieu-Daudé
  2025-10-07  8:16 ` [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE Philippe Mathieu-Daudé
@ 2025-10-07  8:16 ` Philippe Mathieu-Daudé
  2025-10-07  8:30   ` Harsh Prateek Bora
  2025-10-07  8:16 ` [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out Philippe Mathieu-Daudé
  2 siblings, 1 reply; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-07  8:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Weiwei Li, David Hildenbrand, Philippe Mathieu-Daudé,
	Christian Borntraeger, Daniel Henrique Barboza, qemu-s390x,
	Song Gao, Liu Zhiwei, Matthew Rosato, Eric Farman,
	Richard Henderson, Halil Pasic, kvm, Aurelien Jarno,
	Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen, qemu-riscv,
	Nicholas Piggin, Harsh Prateek Bora, Chinmay Rath,
	Ilya Leoshkevich, Thomas Huth, qemu-ppc, Alistair Francis,
	Paolo Bonzini, Palmer Dabbelt, Jiaxun Yang

Join the 3 KVM_PUT_*_STATE definitions in a single enum.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 include/system/kvm.h       | 16 +++++++++-------
 target/i386/kvm/kvm.c      |  6 +++---
 target/loongarch/kvm/kvm.c |  4 ++--
 target/mips/kvm.c          |  6 +++---
 target/ppc/kvm.c           |  2 +-
 target/riscv/kvm/kvm-cpu.c |  2 +-
 target/s390x/kvm/kvm.c     |  2 +-
 7 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/include/system/kvm.h b/include/system/kvm.h
index 4fc09e38910..8f9eecf044c 100644
--- a/include/system/kvm.h
+++ b/include/system/kvm.h
@@ -340,14 +340,16 @@ int kvm_arch_process_async_events(CPUState *cpu);
 
 int kvm_arch_get_registers(CPUState *cpu, Error **errp);
 
-/* state subset only touched by the VCPU itself during runtime */
-#define KVM_PUT_RUNTIME_STATE   1
-/* state subset modified during VCPU reset */
-#define KVM_PUT_RESET_STATE     2
-/* full state set, modified during initialization or on vmload */
-#define KVM_PUT_FULL_STATE      3
+typedef enum kvm_put_state {
+    /* state subset only touched by the VCPU itself during runtime */
+    KVM_PUT_RUNTIME_STATE = 1,
+    /* state subset modified during VCPU reset */
+    KVM_PUT_RESET_STATE = 2,
+    /* full state set, modified during initialization or on vmload */
+    KVM_PUT_FULL_STATE = 3,
+} KvmPutState;
 
-int kvm_arch_put_registers(CPUState *cpu, int level, Error **errp);
+int kvm_arch_put_registers(CPUState *cpu, KvmPutState level, Error **errp);
 
 int kvm_arch_get_default_type(MachineState *ms);
 
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 6a3a1c1ed8e..d06f55938cd 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -3911,7 +3911,7 @@ static void kvm_init_msrs(X86CPU *cpu)
     assert(kvm_buf_set_msrs(cpu) == 0);
 }
 
-static int kvm_put_msrs(X86CPU *cpu, int level)
+static int kvm_put_msrs(X86CPU *cpu, KvmPutState level)
 {
     CPUX86State *env = &cpu->env;
     int i;
@@ -5031,7 +5031,7 @@ static int kvm_get_apic(X86CPU *cpu)
     return 0;
 }
 
-static int kvm_put_vcpu_events(X86CPU *cpu, int level)
+static int kvm_put_vcpu_events(X86CPU *cpu, KvmPutState level)
 {
     CPUState *cs = CPU(cpu);
     CPUX86State *env = &cpu->env;
@@ -5274,7 +5274,7 @@ static int kvm_get_nested_state(X86CPU *cpu)
     return ret;
 }
 
-int kvm_arch_put_registers(CPUState *cpu, int level, Error **errp)
+int kvm_arch_put_registers(CPUState *cpu, KvmPutState level, Error **errp)
 {
     X86CPU *x86_cpu = X86_CPU(cpu);
     int ret;
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
index 45292edcb1c..32cd7c5d003 100644
--- a/target/loongarch/kvm/kvm.c
+++ b/target/loongarch/kvm/kvm.c
@@ -325,7 +325,7 @@ static int kvm_loongarch_get_csr(CPUState *cs)
     return ret;
 }
 
-static int kvm_loongarch_put_csr(CPUState *cs, int level)
+static int kvm_loongarch_put_csr(CPUState *cs, KvmPutState level)
 {
     int ret = 0;
     CPULoongArchState *env = cpu_env(cs);
@@ -763,7 +763,7 @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
     return ret;
 }
 
-int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
+int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
 {
     int ret;
     static int once;
diff --git a/target/mips/kvm.c b/target/mips/kvm.c
index 450947c3fa5..912cd5dfa0e 100644
--- a/target/mips/kvm.c
+++ b/target/mips/kvm.c
@@ -590,7 +590,7 @@ static void kvm_mips_update_state(void *opaque, bool running, RunState state)
     }
 }
 
-static int kvm_mips_put_fpu_registers(CPUState *cs, int level)
+static int kvm_mips_put_fpu_registers(CPUState *cs, KvmPutState level)
 {
     CPUMIPSState *env = cpu_env(cs);
     int err, ret = 0;
@@ -749,7 +749,7 @@ static int kvm_mips_get_fpu_registers(CPUState *cs)
 }
 
 
-static int kvm_mips_put_cp0_registers(CPUState *cs, int level)
+static int kvm_mips_put_cp0_registers(CPUState *cs, KvmPutState level)
 {
     CPUMIPSState *env = cpu_env(cs);
     int err, ret = 0;
@@ -1177,7 +1177,7 @@ static int kvm_mips_get_cp0_registers(CPUState *cs)
     return ret;
 }
 
-int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
+int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
 {
     CPUMIPSState *env = cpu_env(cs);
     struct kvm_regs regs;
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 2521ff65c6c..cd60893a17d 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -907,7 +907,7 @@ int kvmppc_put_books_sregs(PowerPCCPU *cpu)
     return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS, &sregs);
 }
 
-int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
+int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     CPUPPCState *env = &cpu->env;
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 187c2c9501e..75ca3fb9fd9 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -1369,7 +1369,7 @@ int kvm_riscv_sync_mpstate_to_kvm(RISCVCPU *cpu, int state)
     return 0;
 }
 
-int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
+int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
 {
     int ret = 0;
 
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index 491cc5f9756..916dac1f14e 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -468,7 +468,7 @@ static int can_sync_regs(CPUState *cs, int regs)
 #define KVM_SYNC_REQUIRED_REGS (KVM_SYNC_GPRS | KVM_SYNC_ACRS | \
                                 KVM_SYNC_CRS | KVM_SYNC_PREFIX)
 
-int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
+int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
 {
     CPUS390XState *env = cpu_env(cs);
     struct kvm_fpu fpu = {};
-- 
2.51.0



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

* [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out
  2025-10-07  8:16 [PATCH 0/3] accel/kvm: Cleanups around kvm_arch_put_registers() Philippe Mathieu-Daudé
  2025-10-07  8:16 ` [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE Philippe Mathieu-Daudé
  2025-10-07  8:16 ` [PATCH 2/3] accel/kvm: Introduce KvmPutState enum Philippe Mathieu-Daudé
@ 2025-10-07  8:16 ` Philippe Mathieu-Daudé
  2025-10-07 13:30   ` Andrew Jones
  2025-10-07 19:34   ` Richard Henderson
  2 siblings, 2 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-07  8:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Weiwei Li, David Hildenbrand, Philippe Mathieu-Daudé,
	Christian Borntraeger, Daniel Henrique Barboza, qemu-s390x,
	Song Gao, Liu Zhiwei, Matthew Rosato, Eric Farman,
	Richard Henderson, Halil Pasic, kvm, Aurelien Jarno,
	Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen, qemu-riscv,
	Nicholas Piggin, Harsh Prateek Bora, Chinmay Rath,
	Ilya Leoshkevich, Thomas Huth, qemu-ppc, Alistair Francis,
	Paolo Bonzini, Palmer Dabbelt, Jiaxun Yang

The same code is duplicated 3 times: factor a common method.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 accel/kvm/kvm-all.c | 47 ++++++++++++++++++---------------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 9060599cd73..de79f4ca099 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -2935,22 +2935,32 @@ void kvm_cpu_synchronize_state(CPUState *cpu)
     }
 }
 
-static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
+static bool kvm_cpu_synchronize_put(CPUState *cpu, KvmPutState state,
+                                    const char *desc)
 {
     Error *err = NULL;
-    int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE, &err);
+    int ret = kvm_arch_put_registers(cpu, state, &err);
     if (ret) {
         if (err) {
-            error_reportf_err(err, "Restoring resisters after reset: ");
+            error_reportf_err(err, "Restoring resisters %s: ", desc);
         } else {
-            error_report("Failed to put registers after reset: %s",
+            error_report("Failed to put registers %s: %s", desc,
                          strerror(-ret));
         }
-        cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
-        vm_stop(RUN_STATE_INTERNAL_ERROR);
+        return false;
     }
 
     cpu->vcpu_dirty = false;
+
+    return true;
+}
+
+static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
+{
+    if (kvm_cpu_synchronize_put(cpu, KVM_PUT_RESET_STATE, "after reset")) {
+        cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
+        vm_stop(RUN_STATE_INTERNAL_ERROR);
+    }
 }
 
 void kvm_cpu_synchronize_post_reset(CPUState *cpu)
@@ -2964,19 +2974,9 @@ void kvm_cpu_synchronize_post_reset(CPUState *cpu)
 
 static void do_kvm_cpu_synchronize_post_init(CPUState *cpu, run_on_cpu_data arg)
 {
-    Error *err = NULL;
-    int ret = kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE, &err);
-    if (ret) {
-        if (err) {
-            error_reportf_err(err, "Putting registers after init: ");
-        } else {
-            error_report("Failed to put registers after init: %s",
-                         strerror(-ret));
-        }
+    if (kvm_cpu_synchronize_put(cpu, KVM_PUT_FULL_STATE, "after init")) {
         exit(1);
     }
-
-    cpu->vcpu_dirty = false;
 }
 
 void kvm_cpu_synchronize_post_init(CPUState *cpu)
@@ -3166,20 +3166,11 @@ int kvm_cpu_exec(CPUState *cpu)
         MemTxAttrs attrs;
 
         if (cpu->vcpu_dirty) {
-            Error *err = NULL;
-            ret = kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE, &err);
-            if (ret) {
-                if (err) {
-                    error_reportf_err(err, "Putting registers after init: ");
-                } else {
-                    error_report("Failed to put registers after init: %s",
-                                 strerror(-ret));
-                }
+            if (kvm_cpu_synchronize_put(cpu, KVM_PUT_RUNTIME_STATE,
+                                        "at runtime")) {
                 ret = -1;
                 break;
             }
-
-            cpu->vcpu_dirty = false;
         }
 
         kvm_arch_pre_run(cpu, run);
-- 
2.51.0



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

* Re: [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE
  2025-10-07  8:16 ` [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE Philippe Mathieu-Daudé
@ 2025-10-07  8:20   ` Harsh Prateek Bora
  0 siblings, 0 replies; 9+ messages in thread
From: Harsh Prateek Bora @ 2025-10-07  8:20 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Weiwei Li, David Hildenbrand, Christian Borntraeger,
	Daniel Henrique Barboza, qemu-s390x, Song Gao, Liu Zhiwei,
	Matthew Rosato, Eric Farman, Richard Henderson, Halil Pasic, kvm,
	Aurelien Jarno, Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen,
	qemu-riscv, Nicholas Piggin, Chinmay Rath, Ilya Leoshkevich,
	Thomas Huth, qemu-ppc, Alistair Francis, Paolo Bonzini,
	Palmer Dabbelt, Jiaxun Yang



On 10/7/25 13:46, Philippe Mathieu-Daudé wrote:
> KVM_PUT_FULL_STATE is the higher level defined so far in

s/higher/highest ?

With that,
Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

> "system/kvm.h"; do not check for more.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/loongarch/kvm/kvm.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
> index e5ea2dba9da..45292edcb1c 100644
> --- a/target/loongarch/kvm/kvm.c
> +++ b/target/loongarch/kvm/kvm.c
> @@ -397,7 +397,7 @@ static int kvm_loongarch_put_csr(CPUState *cs, int level)
>                              &env->CSR_RVACFG);
>   
>       /* CPUID is constant after poweron, it should be set only once */
> -    if (level >= KVM_PUT_FULL_STATE) {
> +    if (level == KVM_PUT_FULL_STATE) {
>           ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CPUID),
>                              &env->CSR_CPUID);
>       }
> @@ -801,7 +801,7 @@ int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
>           once = 1;
>       }
>   
> -    if (level >= KVM_PUT_FULL_STATE) {
> +    if (level == KVM_PUT_FULL_STATE) {
>           /*
>            * only KVM_PUT_FULL_STATE is required, kvm kernel will clear
>            * guest_addr for KVM_PUT_RESET_STATE


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

* Re: [PATCH 2/3] accel/kvm: Introduce KvmPutState enum
  2025-10-07  8:16 ` [PATCH 2/3] accel/kvm: Introduce KvmPutState enum Philippe Mathieu-Daudé
@ 2025-10-07  8:30   ` Harsh Prateek Bora
  0 siblings, 0 replies; 9+ messages in thread
From: Harsh Prateek Bora @ 2025-10-07  8:30 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Weiwei Li, David Hildenbrand, Christian Borntraeger,
	Daniel Henrique Barboza, qemu-s390x, Song Gao, Liu Zhiwei,
	Matthew Rosato, Eric Farman, Richard Henderson, Halil Pasic, kvm,
	Aurelien Jarno, Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen,
	qemu-riscv, Nicholas Piggin, Chinmay Rath, Ilya Leoshkevich,
	Thomas Huth, qemu-ppc, Alistair Francis, Paolo Bonzini,
	Palmer Dabbelt, Jiaxun Yang



On 10/7/25 13:46, Philippe Mathieu-Daudé wrote:
> Join the 3 KVM_PUT_*_STATE definitions in a single enum.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>

Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

> ---
>   include/system/kvm.h       | 16 +++++++++-------
>   target/i386/kvm/kvm.c      |  6 +++---
>   target/loongarch/kvm/kvm.c |  4 ++--
>   target/mips/kvm.c          |  6 +++---
>   target/ppc/kvm.c           |  2 +-
>   target/riscv/kvm/kvm-cpu.c |  2 +-
>   target/s390x/kvm/kvm.c     |  2 +-
>   7 files changed, 20 insertions(+), 18 deletions(-)
> 
> diff --git a/include/system/kvm.h b/include/system/kvm.h
> index 4fc09e38910..8f9eecf044c 100644
> --- a/include/system/kvm.h
> +++ b/include/system/kvm.h
> @@ -340,14 +340,16 @@ int kvm_arch_process_async_events(CPUState *cpu);
>   
>   int kvm_arch_get_registers(CPUState *cpu, Error **errp);
>   
> -/* state subset only touched by the VCPU itself during runtime */
> -#define KVM_PUT_RUNTIME_STATE   1
> -/* state subset modified during VCPU reset */
> -#define KVM_PUT_RESET_STATE     2
> -/* full state set, modified during initialization or on vmload */
> -#define KVM_PUT_FULL_STATE      3
> +typedef enum kvm_put_state {
> +    /* state subset only touched by the VCPU itself during runtime */
> +    KVM_PUT_RUNTIME_STATE = 1,
> +    /* state subset modified during VCPU reset */
> +    KVM_PUT_RESET_STATE = 2,
> +    /* full state set, modified during initialization or on vmload */
> +    KVM_PUT_FULL_STATE = 3,
> +} KvmPutState;
>   
> -int kvm_arch_put_registers(CPUState *cpu, int level, Error **errp);
> +int kvm_arch_put_registers(CPUState *cpu, KvmPutState level, Error **errp);
>   
>   int kvm_arch_get_default_type(MachineState *ms);
>   
> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
> index 6a3a1c1ed8e..d06f55938cd 100644
> --- a/target/i386/kvm/kvm.c
> +++ b/target/i386/kvm/kvm.c
> @@ -3911,7 +3911,7 @@ static void kvm_init_msrs(X86CPU *cpu)
>       assert(kvm_buf_set_msrs(cpu) == 0);
>   }
>   
> -static int kvm_put_msrs(X86CPU *cpu, int level)
> +static int kvm_put_msrs(X86CPU *cpu, KvmPutState level)
>   {
>       CPUX86State *env = &cpu->env;
>       int i;
> @@ -5031,7 +5031,7 @@ static int kvm_get_apic(X86CPU *cpu)
>       return 0;
>   }
>   
> -static int kvm_put_vcpu_events(X86CPU *cpu, int level)
> +static int kvm_put_vcpu_events(X86CPU *cpu, KvmPutState level)
>   {
>       CPUState *cs = CPU(cpu);
>       CPUX86State *env = &cpu->env;
> @@ -5274,7 +5274,7 @@ static int kvm_get_nested_state(X86CPU *cpu)
>       return ret;
>   }
>   
> -int kvm_arch_put_registers(CPUState *cpu, int level, Error **errp)
> +int kvm_arch_put_registers(CPUState *cpu, KvmPutState level, Error **errp)
>   {
>       X86CPU *x86_cpu = X86_CPU(cpu);
>       int ret;
> diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
> index 45292edcb1c..32cd7c5d003 100644
> --- a/target/loongarch/kvm/kvm.c
> +++ b/target/loongarch/kvm/kvm.c
> @@ -325,7 +325,7 @@ static int kvm_loongarch_get_csr(CPUState *cs)
>       return ret;
>   }
>   
> -static int kvm_loongarch_put_csr(CPUState *cs, int level)
> +static int kvm_loongarch_put_csr(CPUState *cs, KvmPutState level)
>   {
>       int ret = 0;
>       CPULoongArchState *env = cpu_env(cs);
> @@ -763,7 +763,7 @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
>       return ret;
>   }
>   
> -int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
> +int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
>   {
>       int ret;
>       static int once;
> diff --git a/target/mips/kvm.c b/target/mips/kvm.c
> index 450947c3fa5..912cd5dfa0e 100644
> --- a/target/mips/kvm.c
> +++ b/target/mips/kvm.c
> @@ -590,7 +590,7 @@ static void kvm_mips_update_state(void *opaque, bool running, RunState state)
>       }
>   }
>   
> -static int kvm_mips_put_fpu_registers(CPUState *cs, int level)
> +static int kvm_mips_put_fpu_registers(CPUState *cs, KvmPutState level)
>   {
>       CPUMIPSState *env = cpu_env(cs);
>       int err, ret = 0;
> @@ -749,7 +749,7 @@ static int kvm_mips_get_fpu_registers(CPUState *cs)
>   }
>   
>   
> -static int kvm_mips_put_cp0_registers(CPUState *cs, int level)
> +static int kvm_mips_put_cp0_registers(CPUState *cs, KvmPutState level)
>   {
>       CPUMIPSState *env = cpu_env(cs);
>       int err, ret = 0;
> @@ -1177,7 +1177,7 @@ static int kvm_mips_get_cp0_registers(CPUState *cs)
>       return ret;
>   }
>   
> -int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
> +int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
>   {
>       CPUMIPSState *env = cpu_env(cs);
>       struct kvm_regs regs;
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 2521ff65c6c..cd60893a17d 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -907,7 +907,7 @@ int kvmppc_put_books_sregs(PowerPCCPU *cpu)
>       return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS, &sregs);
>   }
>   
> -int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
> +int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
>   {
>       PowerPCCPU *cpu = POWERPC_CPU(cs);
>       CPUPPCState *env = &cpu->env;
> diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
> index 187c2c9501e..75ca3fb9fd9 100644
> --- a/target/riscv/kvm/kvm-cpu.c
> +++ b/target/riscv/kvm/kvm-cpu.c
> @@ -1369,7 +1369,7 @@ int kvm_riscv_sync_mpstate_to_kvm(RISCVCPU *cpu, int state)
>       return 0;
>   }
>   
> -int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
> +int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
>   {
>       int ret = 0;
>   
> diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
> index 491cc5f9756..916dac1f14e 100644
> --- a/target/s390x/kvm/kvm.c
> +++ b/target/s390x/kvm/kvm.c
> @@ -468,7 +468,7 @@ static int can_sync_regs(CPUState *cs, int regs)
>   #define KVM_SYNC_REQUIRED_REGS (KVM_SYNC_GPRS | KVM_SYNC_ACRS | \
>                                   KVM_SYNC_CRS | KVM_SYNC_PREFIX)
>   
> -int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
> +int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
>   {
>       CPUS390XState *env = cpu_env(cs);
>       struct kvm_fpu fpu = {};


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

* Re: [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out
  2025-10-07  8:16 ` [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out Philippe Mathieu-Daudé
@ 2025-10-07 13:30   ` Andrew Jones
  2025-10-07 13:53     ` Philippe Mathieu-Daudé
  2025-10-07 19:34   ` Richard Henderson
  1 sibling, 1 reply; 9+ messages in thread
From: Andrew Jones @ 2025-10-07 13:30 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Weiwei Li, David Hildenbrand, Christian Borntraeger,
	Daniel Henrique Barboza, qemu-s390x, Song Gao, Liu Zhiwei,
	Matthew Rosato, Eric Farman, Richard Henderson, Halil Pasic, kvm,
	Aurelien Jarno, Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen,
	qemu-riscv, Nicholas Piggin, Harsh Prateek Bora, Chinmay Rath,
	Ilya Leoshkevich, Thomas Huth, qemu-ppc, Alistair Francis,
	Paolo Bonzini, Palmer Dabbelt, Jiaxun Yang

On Tue, Oct 07, 2025 at 10:16:16AM +0200, Philippe Mathieu-Daudé wrote:
> The same code is duplicated 3 times: factor a common method.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  accel/kvm/kvm-all.c | 47 ++++++++++++++++++---------------------------
>  1 file changed, 19 insertions(+), 28 deletions(-)
> 
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 9060599cd73..de79f4ca099 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -2935,22 +2935,32 @@ void kvm_cpu_synchronize_state(CPUState *cpu)
>      }
>  }
>  
> -static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
> +static bool kvm_cpu_synchronize_put(CPUState *cpu, KvmPutState state,
> +                                    const char *desc)
>  {
>      Error *err = NULL;
> -    int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE, &err);
> +    int ret = kvm_arch_put_registers(cpu, state, &err);
>      if (ret) {
>          if (err) {
> -            error_reportf_err(err, "Restoring resisters after reset: ");
> +            error_reportf_err(err, "Restoring resisters %s: ", desc);
>          } else {
> -            error_report("Failed to put registers after reset: %s",
> +            error_report("Failed to put registers %s: %s", desc,
>                           strerror(-ret));
>          }
> -        cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
> -        vm_stop(RUN_STATE_INTERNAL_ERROR);
> +        return false;
>      }
>  
>      cpu->vcpu_dirty = false;
> +
> +    return true;
> +}
> +
> +static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
> +{
> +    if (kvm_cpu_synchronize_put(cpu, KVM_PUT_RESET_STATE, "after reset")) {

This should be !kvm_cpu_synchronize_put() and same comment for the other
calls below.

Thanks,
drew

> +        cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
> +        vm_stop(RUN_STATE_INTERNAL_ERROR);
> +    }
>  }
>  
>  void kvm_cpu_synchronize_post_reset(CPUState *cpu)
> @@ -2964,19 +2974,9 @@ void kvm_cpu_synchronize_post_reset(CPUState *cpu)
>  
>  static void do_kvm_cpu_synchronize_post_init(CPUState *cpu, run_on_cpu_data arg)
>  {
> -    Error *err = NULL;
> -    int ret = kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE, &err);
> -    if (ret) {
> -        if (err) {
> -            error_reportf_err(err, "Putting registers after init: ");
> -        } else {
> -            error_report("Failed to put registers after init: %s",
> -                         strerror(-ret));
> -        }
> +    if (kvm_cpu_synchronize_put(cpu, KVM_PUT_FULL_STATE, "after init")) {
>          exit(1);
>      }
> -
> -    cpu->vcpu_dirty = false;
>  }
>  
>  void kvm_cpu_synchronize_post_init(CPUState *cpu)
> @@ -3166,20 +3166,11 @@ int kvm_cpu_exec(CPUState *cpu)
>          MemTxAttrs attrs;
>  
>          if (cpu->vcpu_dirty) {
> -            Error *err = NULL;
> -            ret = kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE, &err);
> -            if (ret) {
> -                if (err) {
> -                    error_reportf_err(err, "Putting registers after init: ");
> -                } else {
> -                    error_report("Failed to put registers after init: %s",
> -                                 strerror(-ret));
> -                }
> +            if (kvm_cpu_synchronize_put(cpu, KVM_PUT_RUNTIME_STATE,
> +                                        "at runtime")) {
>                  ret = -1;
>                  break;
>              }
> -
> -            cpu->vcpu_dirty = false;
>          }
>  
>          kvm_arch_pre_run(cpu, run);
> -- 
> 2.51.0
> 
> 


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

* Re: [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out
  2025-10-07 13:30   ` Andrew Jones
@ 2025-10-07 13:53     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-07 13:53 UTC (permalink / raw)
  To: Andrew Jones
  Cc: qemu-devel, Weiwei Li, David Hildenbrand, Christian Borntraeger,
	Daniel Henrique Barboza, qemu-s390x, Song Gao, Liu Zhiwei,
	Matthew Rosato, Eric Farman, Richard Henderson, Halil Pasic, kvm,
	Aurelien Jarno, Aleksandar Rikalo, Marcelo Tosatti, Huacai Chen,
	qemu-riscv, Nicholas Piggin, Harsh Prateek Bora, Chinmay Rath,
	Ilya Leoshkevich, Thomas Huth, qemu-ppc, Alistair Francis,
	Paolo Bonzini, Palmer Dabbelt, Jiaxun Yang

On 7/10/25 15:30, Andrew Jones wrote:
> On Tue, Oct 07, 2025 at 10:16:16AM +0200, Philippe Mathieu-Daudé wrote:
>> The same code is duplicated 3 times: factor a common method.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>>   accel/kvm/kvm-all.c | 47 ++++++++++++++++++---------------------------
>>   1 file changed, 19 insertions(+), 28 deletions(-)
>>
>> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
>> index 9060599cd73..de79f4ca099 100644
>> --- a/accel/kvm/kvm-all.c
>> +++ b/accel/kvm/kvm-all.c
>> @@ -2935,22 +2935,32 @@ void kvm_cpu_synchronize_state(CPUState *cpu)
>>       }
>>   }
>>   
>> -static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
>> +static bool kvm_cpu_synchronize_put(CPUState *cpu, KvmPutState state,
>> +                                    const char *desc)
>>   {
>>       Error *err = NULL;
>> -    int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE, &err);
>> +    int ret = kvm_arch_put_registers(cpu, state, &err);
>>       if (ret) {
>>           if (err) {
>> -            error_reportf_err(err, "Restoring resisters after reset: ");
>> +            error_reportf_err(err, "Restoring resisters %s: ", desc);
>>           } else {
>> -            error_report("Failed to put registers after reset: %s",
>> +            error_report("Failed to put registers %s: %s", desc,
>>                            strerror(-ret));
>>           }
>> -        cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
>> -        vm_stop(RUN_STATE_INTERNAL_ERROR);
>> +        return false;
>>       }
>>   
>>       cpu->vcpu_dirty = false;
>> +
>> +    return true;
>> +}
>> +
>> +static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
>> +{
>> +    if (kvm_cpu_synchronize_put(cpu, KVM_PUT_RESET_STATE, "after reset")) {
> 
> This should be !kvm_cpu_synchronize_put() and same comment for the other
> calls below.

Oops! Thanks :)

> 
> Thanks,
> drew



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

* Re: [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out
  2025-10-07  8:16 ` [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out Philippe Mathieu-Daudé
  2025-10-07 13:30   ` Andrew Jones
@ 2025-10-07 19:34   ` Richard Henderson
  1 sibling, 0 replies; 9+ messages in thread
From: Richard Henderson @ 2025-10-07 19:34 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel

On 10/7/25 01:16, Philippe Mathieu-Daudé wrote:
> The same code is duplicated 3 times: factor a common method.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   accel/kvm/kvm-all.c | 47 ++++++++++++++++++---------------------------
>   1 file changed, 19 insertions(+), 28 deletions(-)
> 
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 9060599cd73..de79f4ca099 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -2935,22 +2935,32 @@ void kvm_cpu_synchronize_state(CPUState *cpu)
>       }
>   }
>   
> -static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg)
> +static bool kvm_cpu_synchronize_put(CPUState *cpu, KvmPutState state,
> +                                    const char *desc)
>   {
>       Error *err = NULL;
> -    int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE, &err);
> +    int ret = kvm_arch_put_registers(cpu, state, &err);
>       if (ret) {
>           if (err) {
> -            error_reportf_err(err, "Restoring resisters after reset: ");
> +            error_reportf_err(err, "Restoring resisters %s: ", desc);
>           } else {
> -            error_report("Failed to put registers after reset: %s",
> +            error_report("Failed to put registers %s: %s", desc,
>                            strerror(-ret));
>           }

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

For the to-do list: the arch routine really should be using error_setg_errno, not 
deferring the test of errno to here.  But it seems i386 is the only target that actually 
sets errp.


r~


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

end of thread, other threads:[~2025-10-07 19:35 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-07  8:16 [PATCH 0/3] accel/kvm: Cleanups around kvm_arch_put_registers() Philippe Mathieu-Daudé
2025-10-07  8:16 ` [PATCH 1/3] accel/kvm: Do not expect more then KVM_PUT_FULL_STATE Philippe Mathieu-Daudé
2025-10-07  8:20   ` Harsh Prateek Bora
2025-10-07  8:16 ` [PATCH 2/3] accel/kvm: Introduce KvmPutState enum Philippe Mathieu-Daudé
2025-10-07  8:30   ` Harsh Prateek Bora
2025-10-07  8:16 ` [PATCH 3/3] accel/kvm: Factor kvm_cpu_synchronize_put() out Philippe Mathieu-Daudé
2025-10-07 13:30   ` Andrew Jones
2025-10-07 13:53     ` Philippe Mathieu-Daudé
2025-10-07 19:34   ` Richard Henderson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).