From nobody Fri Apr 19 03:34:56 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=bytedance.com Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1580802098568762.5945972573387; Mon, 3 Feb 2020 23:41:38 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-356-nGeFZLAfOFGroLKGYXtPzg-1; Tue, 04 Feb 2020 02:41:34 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1DA04800D5C; Tue, 4 Feb 2020 07:41:28 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 30C7319C7F; Tue, 4 Feb 2020 07:41:26 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 440D318089CD; Tue, 4 Feb 2020 07:41:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 0147fIkS006772 for ; Tue, 4 Feb 2020 02:41:19 -0500 Received: by smtp.corp.redhat.com (Postfix) id 9BFDE2166B28; Tue, 4 Feb 2020 07:41:18 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast05.extmail.prod.ext.rdu2.redhat.com [10.11.55.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 979E52166B27 for ; Tue, 4 Feb 2020 07:41:16 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 13FFA90083A for ; Tue, 4 Feb 2020 07:41:16 +0000 (UTC) Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-380--DjfpTpOOr2DoDVnjYJC4g-1; Tue, 04 Feb 2020 02:41:07 -0500 Received: by mail-pj1-f66.google.com with SMTP id m13so978540pjb.2 for ; Mon, 03 Feb 2020 23:41:07 -0800 (PST) Received: from libai.bytedance.net ([61.120.150.71]) by smtp.gmail.com with ESMTPSA id l10sm1938734pjy.5.2020.02.03.23.41.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Feb 2020 23:41:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580802097; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:content-type:content-type: content-transfer-encoding:content-transfer-encoding:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=W9AJ+Az/xpWdVK+YgxcmzkdNhoWGLKEC7nNr99wTfVI=; b=hQNiiEE32cXbIU8EgVCSl0C3tWPjScOAJx36xFNXwzHY5JWZ/U8chufV7KK3AN7iiab+bc T4UT1ldJx3ywq9EGrofAWofFoBB9jFNBikUaoMkq/r/55hoDER0nkfYMmmPg0tkVjUVF76 6eSG6SYkdgz4tJYGkbOo6ofPlAFXF50= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=hQIB7+zrpo7sH9bk00Gll9snJSu4Z8MVNtuS1VEE0M0=; b=Yb4K6s9Oe6XfkOx5AxzFsp0wuOgYaMfk53puVepzHIEV9TM6hHEHO6ziIgR8XZdj24 6RXvogc/WT6U7rnjEYd5ThHYFCZ1nz094+EbGvbGaOn/qZ/6e4s6tOpvku4SqT6qDxhq +vdmWOuXZstk+k60+mh4aM2/dCpd6jdkwmZDYCt7jm3d8u7WZq3ar2qb7RZ0oDKVejbs yHBYbH32CE+Rwq7oMhVSKJjQSWuhsTLQ/7QC/NL8YoREHxv7W6zq/XjaxVDeumBhYZKD Vi0FgUSQB4CJbkXTjVXwRkaDKuQdgj1sK7/81T0hF+b69pAs66XO//8mTCaKNRfzUSWr oD5w== X-Gm-Message-State: APjAAAWKZji2xcIhfL+DysSPEby0owlGUatvBUs+7cjnClTx9BOtpnGy RMWRTG0XSdhvFp8uBbLLFscOkg== X-Google-Smtp-Source: APXvYqxOwidiJqJHT7I7m4DWZd+2HtEfDUM5mRYNYRC70PTU9JU1ay+ZHqEKIWm87DAVeDuwe7y0xg== X-Received: by 2002:a17:902:d688:: with SMTP id v8mr28850664ply.238.1580802066481; Mon, 03 Feb 2020 23:41:06 -0800 (PST) From: zhenwei pi To: mprivozn@redhat.com, berrange@redhat.com Subject: [PATCH] qemu: support Panic Crashloaded event handling Date: Tue, 4 Feb 2020 15:41:00 +0800 Message-Id: <20200204074100.879609-1-pizhenwei@bytedance.com> X-MC-Unique: -DjfpTpOOr2DoDVnjYJC4g-1 X-MC-Unique: nGeFZLAfOFGroLKGYXtPzg-1 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 0147fIkS006772 X-loop: libvir-list@redhat.com Cc: libvir-list@redhat.com, pbonzini@redhat.com, pizhenwei@bytedance.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 2 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Pvpanic device supports bit 1 as crashloaded event, it means that guest actually panicked and run kexec to handle error by guest side. Handle crashloaded as a lifecyle event in libvirt. Test case: Guest side: before testing, we need make sure kdump is enabled, 1, build new pvpanic driver (with commit from upstream e0b9a42735f2672ca2764cfbea6e55a81098d5ba 191941692a3d1b6a9614502b279be062926b70f5) 2, insmod new kmod 3, enable crash_kexec_post_notifiers, # echo 1 > /sys/module/kernel/parameters/crash_kexec_post_notifiers 4, trigger kernel panic # echo 1 > /proc/sys/kernel/sysrq # echo c > /proc/sysrq-trigger Host side: 1, build new qemu with pvpanic patches (with commit from upstream 600d7b47e8f5085919fd1d1157f25950ea8dbc11 7dc58deea79a343ac3adc5cadb97215086054c86) 2, build libvirt with this patch 3, handle lifecycle event and trigger guest side panic # virsh event stretch --event lifecycle event 'lifecycle' for domain stretch: Crashed Crashloaded events received: 1 Signed-off-by: zhenwei pi --- examples/c/misc/event-test.c | 3 +++ include/libvirt/libvirt-domain.h | 1 + src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain.h | 1 + src/qemu/qemu_driver.c | 17 +++++++++++++++++ src/qemu/qemu_monitor.c | 10 ++++++++++ src/qemu/qemu_monitor.h | 7 +++++++ src/qemu/qemu_monitor_json.c | 12 ++++++++++++ src/qemu/qemu_process.c | 30 ++++++++++++++++++++++++++++++ tools/virsh-domain.c | 3 ++- 10 files changed, 84 insertions(+), 1 deletion(-) diff --git a/examples/c/misc/event-test.c b/examples/c/misc/event-test.c index 7e48cecc92..52caa8ffa8 100644 --- a/examples/c/misc/event-test.c +++ b/examples/c/misc/event-test.c @@ -273,6 +273,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_CRASHED_PANICKED: return "Panicked"; =20 + case VIR_DOMAIN_EVENT_CRASHED_CRASHLOADED: + return "Crashloaded"; + case VIR_DOMAIN_EVENT_CRASHED_LAST: break; } diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 5846e93d98..b440818ec2 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -3175,6 +3175,7 @@ typedef enum { */ typedef enum { VIR_DOMAIN_EVENT_CRASHED_PANICKED =3D 0, /* Guest was panicked */ + VIR_DOMAIN_EVENT_CRASHED_CRASHLOADED =3D 1, /* Guest was crashloaded */ =20 # ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_CRASHED_LAST diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cb691ca048..4933584cf2 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -16348,6 +16348,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event) case QEMU_PROCESS_EVENT_SERIAL_CHANGED: case QEMU_PROCESS_EVENT_BLOCK_JOB: case QEMU_PROCESS_EVENT_MONITOR_EOF: + case QEMU_PROCESS_EVENT_GUEST_CRASHLOADED: VIR_FREE(event->data); break; case QEMU_PROCESS_EVENT_JOB_STATUS_CHANGE: diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index c581b3a162..f8fb48f2ff 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -583,6 +583,7 @@ typedef enum { QEMU_PROCESS_EVENT_MONITOR_EOF, QEMU_PROCESS_EVENT_PR_DISCONNECT, QEMU_PROCESS_EVENT_RDMA_GID_STATUS_CHANGED, + QEMU_PROCESS_EVENT_GUEST_CRASHLOADED, =20 QEMU_PROCESS_EVENT_LAST } qemuProcessEventType; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8bb845298b..def6631fed 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4877,6 +4877,20 @@ processRdmaGidStatusChangedEvent(virDomainObjPtr vm, } =20 =20 +static void +processGuestCrashloadedEvent(virQEMUDriverPtr driver, + virDomainObjPtr vm) +{ + virObjectEventPtr event =3D NULL; + + event =3D virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_CRASHED, + VIR_DOMAIN_EVENT_CRASHED_CRA= SHLOADED); + + virObjectEventStateQueue(driver->domainEventState, event); +} + + static void qemuProcessEventHandler(void *data, void *opaque) { struct qemuProcessEvent *processEvent =3D data; @@ -4923,6 +4937,9 @@ static void qemuProcessEventHandler(void *data, void = *opaque) case QEMU_PROCESS_EVENT_RDMA_GID_STATUS_CHANGED: processRdmaGidStatusChangedEvent(vm, processEvent->data); break; + case QEMU_PROCESS_EVENT_GUEST_CRASHLOADED: + processGuestCrashloadedEvent(driver, vm); + break; case QEMU_PROCESS_EVENT_LAST: break; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index ceedcd527a..ba70d01d47 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1591,6 +1591,16 @@ qemuMonitorEmitRdmaGidStatusChanged(qemuMonitorPtr m= on, =20 =20 int +qemuMonitorEmitGuestCrashloaded(qemuMonitorPtr mon) +{ + int ret =3D -1; + VIR_DEBUG("mon=3D%p", mon); + QEMU_MONITOR_CALLBACK(mon, ret, domainGuestCrashloaded, mon->vm); + return ret; +} + + +int qemuMonitorSetCapabilities(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index cca2cdcb27..89197cfe0d 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -345,6 +345,10 @@ typedef int (*qemuMonitorDomainRdmaGidStatusChangedCal= lback)(qemuMonitorPtr mon, unsigned long= long interface_id, void *opaque); =20 +typedef int (*qemuMonitorDomainGuestCrashloadedCallback)(qemuMonitorPtr mo= n, + virDomainObjPtr v= m, + void *opaque); + typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks; typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr; struct _qemuMonitorCallbacks { @@ -380,6 +384,7 @@ struct _qemuMonitorCallbacks { qemuMonitorDomainDumpCompletedCallback domainDumpCompleted; qemuMonitorDomainPRManagerStatusChangedCallback domainPRManagerStatusC= hanged; qemuMonitorDomainRdmaGidStatusChangedCallback domainRdmaGidStatusChang= ed; + qemuMonitorDomainGuestCrashloadedCallback domainGuestCrashloaded; }; =20 qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, @@ -512,6 +517,8 @@ int qemuMonitorEmitRdmaGidStatusChanged(qemuMonitorPtr = mon, unsigned long long subnet_prefix, unsigned long long interface_id); =20 +int qemuMonitorEmitGuestCrashloaded(qemuMonitorPtr mon); + int qemuMonitorStartCPUs(qemuMonitorPtr mon); int qemuMonitorStopCPUs(qemuMonitorPtr mon); =20 diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 981d091ba0..385f6c4738 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -99,6 +99,7 @@ static void qemuMonitorJSONHandleBlockJobReady(qemuMonito= rPtr mon, virJSONValueP static void qemuMonitorJSONHandleJobStatusChange(qemuMonitorPtr mon, virJS= ONValuePtr data); static void qemuMonitorJSONHandleBalloonChange(qemuMonitorPtr mon, virJSON= ValuePtr data); static void qemuMonitorJSONHandlePMSuspendDisk(qemuMonitorPtr mon, virJSON= ValuePtr data); +static void qemuMonitorJSONHandleGuestCrashloaded(qemuMonitorPtr mon, virJ= SONValuePtr data); static void qemuMonitorJSONHandleGuestPanic(qemuMonitorPtr mon, virJSONVal= uePtr data); static void qemuMonitorJSONHandleDeviceDeleted(qemuMonitorPtr mon, virJSON= ValuePtr data); static void qemuMonitorJSONHandleNicRxFilterChanged(qemuMonitorPtr mon, vi= rJSONValuePtr data); @@ -128,6 +129,7 @@ static qemuEventHandler eventHandlers[] =3D { { "DEVICE_DELETED", qemuMonitorJSONHandleDeviceDeleted, }, { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, }, { "DUMP_COMPLETED", qemuMonitorJSONHandleDumpCompleted, }, + { "GUEST_CRASHLOADED", qemuMonitorJSONHandleGuestCrashloaded, }, { "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, }, { "JOB_STATUS_CHANGE", qemuMonitorJSONHandleJobStatusChange, }, { "MIGRATION", qemuMonitorJSONHandleMigrationStatus, }, @@ -1543,6 +1545,16 @@ static void qemuMonitorJSONHandleRdmaGidStatusChange= d(qemuMonitorPtr mon, } =20 =20 +static void +qemuMonitorJSONHandleGuestCrashloaded(qemuMonitorPtr mon, + virJSONValuePtr data) +{ + VIR_DEBUG("qemuMonitorJSONHandleGuestCrashloaded event, mon %p, data %= p", mon, data); + + qemuMonitorEmitGuestCrashloaded(mon); +} + + int qemuMonitorJSONHumanCommand(qemuMonitorPtr mon, const char *cmd_str, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ddcc763cfd..458db2c09f 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1848,6 +1848,35 @@ qemuProcessHandleRdmaGidStatusChanged(qemuMonitorPtr= mon G_GNUC_UNUSED, } =20 =20 +static int +qemuProcessHandleGuestCrashloaded(qemuMonitorPtr mon G_GNUC_UNUSED, + virDomainObjPtr vm, + void *opaque) +{ + virQEMUDriverPtr driver =3D opaque; + struct qemuProcessEvent *processEvent; + + virObjectLock(vm); + if (VIR_ALLOC(processEvent) < 0) + goto cleanup; + + processEvent->eventType =3D QEMU_PROCESS_EVENT_GUEST_CRASHLOADED; + processEvent->vm =3D virObjectRef(vm); + + if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) { + if (!virObjectUnref(vm)) + vm =3D NULL; + qemuProcessEventFree(processEvent); + } + + cleanup: + if (vm) + virObjectUnlock(vm); + + return 0; +} + + static qemuMonitorCallbacks monitorCallbacks =3D { .eofNotify =3D qemuProcessHandleMonitorEOF, .errorNotify =3D qemuProcessHandleMonitorError, @@ -1879,6 +1908,7 @@ static qemuMonitorCallbacks monitorCallbacks =3D { .domainDumpCompleted =3D qemuProcessHandleDumpCompleted, .domainPRManagerStatusChanged =3D qemuProcessHandlePRManagerStatusChan= ged, .domainRdmaGidStatusChanged =3D qemuProcessHandleRdmaGidStatusChanged, + .domainGuestCrashloaded =3D qemuProcessHandleGuestCrashloaded, }; =20 static void diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 32b2792694..f20150a258 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -12910,7 +12910,8 @@ VIR_ENUM_IMPL(virshDomainEventPMSuspended, VIR_ENUM_DECL(virshDomainEventCrashed); VIR_ENUM_IMPL(virshDomainEventCrashed, VIR_DOMAIN_EVENT_CRASHED_LAST, - N_("Panicked")); + N_("Panicked"), + N_("Crashloaded")); =20 static const char * virshDomainEventDetailToString(int event, int detail) --=20 2.11.0