qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: 18622748025 <18622748025@163.com>
To: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: "pbonzini@redhat.com" <pbonzini@redhat.com>,
	 "liguang.zhang@hexintek.com" <liguang.zhang@hexintek.com>,
	 "alistair23@gmail.com" <alistair23@gmail.com>
Subject: Re: Re: [PATCH] target/riscv: fix the issue of guest reboot then no response or crash in kvm-mode
Date: Tue, 18 Jul 2023 19:08:56 +0800 (GMT+08:00)	[thread overview]
Message-ID: <74618321.a940.18968b0605c.Coremail.18622748025@163.com> (raw)
In-Reply-To: <CAKmqyKN+USh-38Gzc3vGJYVAw9xThtqx2B8Nf1LAHbrNQ_=EDA@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 6017 bytes --]

On Sun, July 18, 2023 at 6:55 PM liguang.zhang <18622748025@163.com> wrote:

On Sun, Jun 25, 2023 at 12:50 PM liguang.zhang <18622748025@163.com> wrote:
From: "liguang.zhang" <liguang.zhang@hexintek.com>

There are two issues when rebooting a guest using KVM
1. When the guest initiates a reboot the host is unable to stop the vcpu
2. When running a SMP guest the qemu monitor system_reset causes a vcpu crash

This can be fixed by clearing the CSR values at reset and syncing the
MPSTATE with the host.

Thanks for the patch.

I think we should move everything
--- from here ---


kernel log
```shell
$reboot

The system is going down NOW!
Sent SIGTERM to all processes
logout
Sent SIGKILL to all processes
Requesting system reboot

```
then no response

for qemu command:
$system_reset:

kernel log:
```shell
[   53.739556] kvm [150]: VCPU exit error -95
[   53.739563] kvm [148]: VCPU exit error -95
[   53.739557] kvm [149]: VCPU exit error -95
[   53.740957] kvm [149]: SEPC=0x0 SSTATUS=0x200004120 HSTATUS=0x2002001c0
[   53.740957] kvm [148]: SEPC=0x0 SSTATUS=0x200004120 HSTATUS=0x2002001c0
[   53.741054] kvm [148]: SCAUSE=0x14 STVAL=0x0 HTVAL=0x0 HTINST=0x0
[   53.741058] kvm [149]: SCAUSE=0x14 STVAL=0x0 HTVAL=0x0 HTINST=0x0
[   53.756187] kvm [150]: SEPC=0x0 SSTATUS=0x200004120 HSTATUS=0x2002001c0
[   53.757797] kvm [150]: SCAUSE=0x14 STVAL=0x0 HTVAL=0x0 HTINST=0x0
```

solution:

add reset csr and context for riscv vcpu
qemu ioctl reset vcpu->arch.power_off state of kvm

tests:

qemu-system-riscv64 -M virt -bios none -kernel Image \
-smp 4 -enable-kvm \
-append "rootwait root=/dev/vda ro" \
-drive file=rootfs.ext2,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0

in guest shell:
$reboot

qemu command:
$system_reset

---
v3:
- change kvm_riscv_set_mpstate_to_kvm to kvm_riscv_sync_mpstate_to_kvm
- remove newline after if(cap_has_mp_state)
- update submit description

--- to here ---


Signed-off-by: liguang.zhang <liguang.zhang@hexintek.com>
---

below this line. That way it will be included in the patch submission,
but won't be included in the git tree.

We never include the patch changelog in the git tree and I don't think
we need to include the steps as well (they will be preserved on the
mailing list).

Ok, It's no problem.

For the patch title (the git commit title) can you explain what the
patch is doing?

How about the title use:
"target/riscv: Clearing the CSR values at reset and syncing the MPSTATE with the host"


And the reason description is


Fix the guest reboot error when using KVM
There are two issues when rebooting a guest using KVM
1. When the guest initiates a reboot the host is unable to stop the vcpu
2. When running a SMP guest the qemu monitor system_reset causes a vcpu crash

This can be fixed by clearing the CSR values at reset and syncing the
MPSTATE with the host.


Also, do you mind rebasing on
https://github.com/alistair23/qemu/tree/riscv-to-apply.next

I don't remind rebase on it.
Thanks~
-- liguang.zhang

Then the patch should be good to go!

Alistair

target/riscv/kvm.c       | 44 +++++++++++++++++++++++++++++++++++++++-
target/riscv/kvm_riscv.h |  1 +
2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c
index 0f932a5b96..c478c71905 100644
--- a/target/riscv/kvm.c
+++ b/target/riscv/kvm.c
@@ -42,6 +42,8 @@
#include "migration/migration.h"
#include "sysemu/runstate.h"

+static bool cap_has_mp_state;
+
static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type,
uint64_t idx)
{
@@ -99,7 +101,7 @@ static uint64_t kvm_riscv_reg_id(CPURISCVState *env, uint64_t type,

#define KVM_RISCV_SET_TIMER(cs, env, name, reg) \
do { \
-        int ret = kvm_set_one_reg(cs, RISCV_TIMER_REG(env, time), &reg); \
+        int ret = kvm_set_one_reg(cs, RISCV_TIMER_REG(env, name), &reg); \
if (ret) { \
abort(); \
} \
@@ -335,6 +337,24 @@ int kvm_arch_get_registers(CPUState *cs)
return ret;
}

+int kvm_riscv_sync_mpstate_to_kvm(RISCVCPU *cpu, int state)
+{
+    if (cap_has_mp_state) {
+        struct kvm_mp_state mp_state = {
+            .mp_state = state
+        };
+
+        int ret = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MP_STATE, &mp_state);
+        if (ret) {
+            fprintf(stderr, "%s: failed to sync MP_STATE %d/%s\n",
+                    __func__, ret, strerror(-ret));
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
int kvm_arch_put_registers(CPUState *cs, int level)
{
int ret = 0;
@@ -354,6 +374,18 @@ int kvm_arch_put_registers(CPUState *cs, int level)
return ret;
}

+    if (KVM_PUT_RESET_STATE == level) {
+        RISCVCPU *cpu = RISCV_CPU(cs);
+        if (cs->cpu_index == 0) {
+            ret = kvm_riscv_sync_mpstate_to_kvm(cpu, KVM_MP_STATE_RUNNABLE);
+        } else {
+            ret = kvm_riscv_sync_mpstate_to_kvm(cpu, KVM_MP_STATE_STOPPED);
+        }
+        if (ret) {
+            return ret;
+        }
+    }
+
return ret;
}

@@ -428,6 +460,7 @@ int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,

int kvm_arch_init(MachineState *ms, KVMState *s)
{
+    cap_has_mp_state = kvm_check_extension(s, KVM_CAP_MP_STATE);
return 0;
}

@@ -506,10 +539,19 @@ void kvm_riscv_reset_vcpu(RISCVCPU *cpu)
if (!kvm_enabled()) {
return;
}
+    for (int i=0; i<32; i++)
+        env->gpr[i] = 0;
env->pc = cpu->env.kernel_addr;
env->gpr[10] = kvm_arch_vcpu_id(CPU(cpu)); /* a0 */
env->gpr[11] = cpu->env.fdt_addr;          /* a1 */
env->satp = 0;
+    env->mie = 0;
+    env->stvec = 0;
+    env->sscratch = 0;
+    env->sepc = 0;
+    env->scause = 0;
+    env->stval = 0;
+    env->mip = 0;
}

void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level)
diff --git a/target/riscv/kvm_riscv.h b/target/riscv/kvm_riscv.h
index ed281bdce0..88aee902dd 100644
--- a/target/riscv/kvm_riscv.h
+++ b/target/riscv/kvm_riscv.h
@@ -21,5 +21,6 @@

void kvm_riscv_reset_vcpu(RISCVCPU *cpu);
void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level);
+int kvm_riscv_sync_mpstate_to_kvm(RISCVCPU *cpu, int state);

#endif
--
2.17.1

[-- Attachment #2: Type: text/html, Size: 37139 bytes --]

  parent reply	other threads:[~2023-07-18 11:25 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-25  2:50 [PATCH] target/riscv: fix the issue of guest reboot then no response or crash in kvm-mode liguang.zhang
2023-07-10  1:16 ` Alistair Francis
2023-07-18 11:06   ` 18622748025
2023-07-18 11:08   ` 18622748025 [this message]
2023-07-18 11:44   ` Re:Re:[PATCH v3] " liguang.zhang
2023-07-18 11:49 ` liguang.zhang
2023-07-18 12:21 ` [PATCH] target/riscv: Clearing the CSR values at reset and syncing the MPSTATE with the host liguang.zhang
2023-07-24  3:30   ` Alistair Francis
2023-07-24  6:05     ` liguang.zhang
2023-08-10 18:43       ` Alistair Francis
2023-07-24  6:12     ` [PATCH v2] " liguang.zhang
2023-07-24  6:25     ` [PATCH v3] " liguang.zhang
2023-08-10 18:34       ` Alistair Francis
2023-09-13  8:37         ` liguang.zhang
2023-09-13  9:13           ` [PATCH v4] " liguang.zhang
2023-09-19  4:05             ` Alistair Francis
2023-09-19  4:12             ` Alistair Francis
2023-09-19  4:16             ` Alistair Francis
2023-07-18 12:39 ` [PATCH] " liguang.zhang
2023-07-18 12:43 ` liguang.zhang
2023-07-18 12:47 ` [PATCH] target/riscv: fix the issue of guest reboot then no response or crash in kvm-mode liguang.zhang
2023-07-18 12:52 ` liguang.zhang
2023-07-18 13:21   ` [PATCH v4] " liguang.zhang
2023-07-18 12:56 ` [PATCH] target/riscv: Clearing the CSR values at reset and syncing the MPSTATE with the host liguang.zhang
2023-07-18 12:58 ` liguang.zhang
2023-07-18 13:02 ` liguang.zhang
2023-07-18 13:07 ` [PATCH v4] target/riscv: fix the issue of guest reboot then no response or crash in kvm-mode liguang.zhang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=74618321.a940.18968b0605c.Coremail.18622748025@163.com \
    --to=18622748025@163.com \
    --cc=alistair23@gmail.com \
    --cc=liguang.zhang@hexintek.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).