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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.