From: Tao Cui <cui.tao@linux.dev>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, armbru@redhat.com, eblake@redhat.com,
kvm@vger.kernel.org, Tao Cui <cuitao@kylinos.cn>
Subject: [PATCH v1 2/2] accel/kvm: emit KVM_VCPU_ERROR on unrecoverable vCPU exits
Date: Wed, 8 Jul 2026 14:12:20 +0800 [thread overview]
Message-ID: <20260708061220.53507-3-cui.tao@linux.dev> (raw)
In-Reply-To: <20260708061220.53507-1-cui.tao@linux.dev>
From: Tao Cui <cuitao@kylinos.cn>
Emit the KVM_VCPU_ERROR event at the three points where a vCPU run
becomes unrecoverable:
- KVM_RUN ioctl failure (reason "ioctl-failed")
- KVM_EXIT_UNKNOWN (reason "unknown")
- KVM_EXIT_INTERNAL_ERROR (reason "internal-error",
with suberror and exit-data)
The KVM_RUN loop in kvm_cpu_exec() runs without the BQL, but QMP event
emission goes through the monitor and requires it; take and release the
lock around the send, mirroring the KVM_SYSTEM_EVENT_CRASH path.
This resolves the long-standing FIXME in kvm_handle_internal_error().
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
accel/kvm/kvm-all.c | 46 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 5d55cb45cf..4f68e3b82b 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -46,6 +46,7 @@
#include "qapi/visitor.h"
#include "qapi/qapi-types-common.h"
#include "qapi/qapi-visit-common.h"
+#include "qapi/qapi-events-run-state.h"
#include "system/reset.h"
#include "qemu/guest-random.h"
#include "system/hw_accel.h"
@@ -3140,6 +3141,38 @@ static void kvm_handle_io(uint16_t port, MemTxAttrs attrs, void *data, int direc
}
}
+/*
+ * Notify the management layer that a vCPU hit an unrecoverable KVM run
+ * error. The KVM_RUN loop in kvm_cpu_exec() runs without the BQL, but
+ * emitting a QMP event goes through the monitor and therefore requires
+ * it; take/release the lock around the send.
+ */
+static void kvm_emit_vcpu_error(CPUState *cpu, KvmVcpuErrorReason reason,
+ bool has_suberror, int64_t suberror,
+ uint32_t ndata, const uint64_t *data)
+{
+ g_autofree char *qom_path = object_get_canonical_path(OBJECT(cpu));
+ uint64List *exit_data = NULL;
+ uint64List **tail = &exit_data;
+ uint32_t i;
+
+ for (i = 0; i < ndata; i++) {
+ uint64List *node = g_new(uint64List, 1);
+ node->value = data[i];
+ node->next = NULL;
+ *tail = node;
+ tail = &node->next;
+ }
+
+ bql_lock();
+ qapi_event_send_kvm_vcpu_error(cpu->cpu_index, qom_path, reason,
+ has_suberror, suberror,
+ !!ndata, exit_data);
+ bql_unlock();
+
+ qapi_free_uint64List(exit_data);
+}
+
static int kvm_handle_internal_error(CPUState *cpu, struct kvm_run *run)
{
int i;
@@ -3151,6 +3184,12 @@ static int kvm_handle_internal_error(CPUState *cpu, struct kvm_run *run)
fprintf(stderr, "extra data[%d]: 0x%016"PRIx64"\n",
i, (uint64_t)run->internal.data[i]);
}
+
+ kvm_emit_vcpu_error(cpu, KVM_VCPU_ERROR_REASON_INTERNAL_ERROR,
+ true, run->internal.suberror,
+ run->internal.ndata,
+ (const uint64_t *)run->internal.data);
+
if (run->internal.suberror == KVM_INTERNAL_ERROR_EMULATION) {
fprintf(stderr, "emulation failure\n");
if (!kvm_arch_stop_on_emulation_error(cpu)) {
@@ -3158,9 +3197,6 @@ static int kvm_handle_internal_error(CPUState *cpu, struct kvm_run *run)
return EXCP_INTERRUPT;
}
}
- /* FIXME: Should trigger a qmp message to let management know
- * something went wrong.
- */
return -1;
}
@@ -3508,6 +3544,8 @@ int kvm_cpu_exec(CPUState *cpu)
"secondary threads offline.\n");
}
#endif
+ kvm_emit_vcpu_error(cpu, KVM_VCPU_ERROR_REASON_IOCTL_FAILED,
+ false, 0, 0, NULL);
ret = -1;
break;
}
@@ -3543,6 +3581,8 @@ int kvm_cpu_exec(CPUState *cpu)
case KVM_EXIT_UNKNOWN:
fprintf(stderr, "KVM: unknown exit, hardware reason %" PRIx64 "\n",
(uint64_t)run->hw.hardware_exit_reason);
+ kvm_emit_vcpu_error(cpu, KVM_VCPU_ERROR_REASON_UNKNOWN,
+ false, 0, 0, NULL);
ret = -1;
break;
case KVM_EXIT_INTERNAL_ERROR:
--
2.43.0
prev parent reply other threads:[~2026-07-08 6:13 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-08 6:12 [PATCH v1 0/2] accel/kvm: notify management of vCPU run errors Tao Cui
2026-07-08 6:12 ` [PATCH v1 1/2] qapi: add KVM_VCPU_ERROR event Tao Cui
2026-07-08 6:12 ` Tao Cui [this message]
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=20260708061220.53507-3-cui.tao@linux.dev \
--to=cui.tao@linux.dev \
--cc=armbru@redhat.com \
--cc=cuitao@kylinos.cn \
--cc=eblake@redhat.com \
--cc=kvm@vger.kernel.org \
--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