From nobody Tue Feb 10 00:24:45 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1616089267; cv=none; d=zohomail.com; s=zohoarc; b=A9D7OCIXIgB42YH7Tr8aqzRksZXGGSgQGg5KAWgNIgea9IGacgZQWGUwwsdis8w5FV5943ILwOfvEsb59Lc0aTiYSwj7ndx9SapnXJfzq82EszQtV+K2VoELwFUg1lQw6pJkgZUd5Or1lKv4ja4FnbqY2+0S5phiCcws87+DD5A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616089267; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=AERglxOVuUMz30U4ShRRTt3gRy3ZcxcxVwih1N4716M=; b=nytTnbFT67MPRyX0pFbtm6Bgl6GjcNgx7ta0j67IppTBxsTCOV5l3dygp5A9g8MHwhRkqNLslxNnnKqnTTOMQKf0lXc2sgNiV3EcUJcG2RvhA9ZtUYb2bIilz1tZXPjTfWlolzOQSuaUSTORd9i+l13OZmVCBxnWl/vr4D4NA5o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1616089267008651.7633969343453; Thu, 18 Mar 2021 10:41:07 -0700 (PDT) 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-349-1i15S_pcN9Gv3TBjlgWymw-1; Thu, 18 Mar 2021 13:40:34 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CF399106BAFC; Thu, 18 Mar 2021 17:40:26 +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 A8FDF39A60; Thu, 18 Mar 2021 17:40: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 5792A1800215; Thu, 18 Mar 2021 17:40:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 12IHeLo8011164 for ; Thu, 18 Mar 2021 13:40:21 -0400 Received: by smtp.corp.redhat.com (Postfix) id D2BD337DD; Thu, 18 Mar 2021 17:40:21 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 25F6A610F1 for ; Thu, 18 Mar 2021 17:40:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1616089265; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=AERglxOVuUMz30U4ShRRTt3gRy3ZcxcxVwih1N4716M=; b=HtbGjE+21sHcOSsDW4/YZAjS3RpoP861z0fQc/zTgIeYvVQypCqxc64OlLTh3eD1x3jUKx JA3wlwHWUMyeh6BiCKWMvS1OTNRp6AIjKQsBMy1EVMtsZI5fXjcj/ULwMYOI6fCJDw1f5P 8+qza5/g83UB0G3g5p0n0lSRJxiuhqs= X-MC-Unique: 1i15S_pcN9Gv3TBjlgWymw-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 3/3] qemu: Update paused reason on unexpected 'STOP' event Date: Thu, 18 Mar 2021 18:40:13 +0100 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.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.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The qemu STOP event doesn't really report why the VM was stopped. In certain cases we do expect this by storing the expectation in the private data. In cases we've encountered an unexpected STOP event we can offload to the event thread a job to refresh the state using 'query-status'. For all other paused reasons which are expected we keep the original logic. Signed-off-by: Peter Krempa --- src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain.h | 1 + src/qemu/qemu_driver.c | 37 +++++++++++++++++++++++++++++++++++++ src/qemu/qemu_process.c | 22 +++++++++++++++++++--- 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index dde9ba92c6..106a292ef3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11049,6 +11049,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event) virObjectUnref(event->data); break; case QEMU_PROCESS_EVENT_PR_DISCONNECT: + case QEMU_PROCESS_EVENT_STOP: case QEMU_PROCESS_EVENT_LAST: break; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 949307229b..b057e94df0 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -441,6 +441,7 @@ typedef enum { QEMU_PROCESS_EVENT_PR_DISCONNECT, QEMU_PROCESS_EVENT_RDMA_GID_STATUS_CHANGED, QEMU_PROCESS_EVENT_GUEST_CRASHLOADED, + QEMU_PROCESS_EVENT_STOP, QEMU_PROCESS_EVENT_LAST } qemuProcessEventType; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f3f8caab44..53be363338 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4316,6 +4316,40 @@ processGuestCrashloadedEvent(virQEMUDriverPtr driver, } +static void +processGuestStopEvent(virDomainObjPtr vm) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + virObjectEventPtr event =3D NULL; + virDomainPausedReason reason =3D VIR_DOMAIN_PAUSED_UNKNOWN; + + if (qemuDomainObjBeginJob(priv->driver, vm, QEMU_JOB_MODIFY) =3D=3D 0)= { + bool running; + int rc; + + qemuDomainObjEnterMonitor(priv->driver, vm); + + rc =3D qemuMonitorGetStatus(priv->mon, &running, &reason); + + /* update reason only on successful state update */ + if (qemuDomainObjExitMonitor(priv->driver, vm) < 0) + rc =3D -1; + + qemuDomainObjEndJob(priv->driver, vm); + + if (rc < 0) + return; + } + + virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason); + + event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_SUSPE= NDED, + qemuDomainPausedReasonToSusp= endedEvent(reason)); + + virObjectEventStateQueue(priv->driver->domainEventState, event); +} + + static void qemuProcessEventHandler(void *data, void *opaque) { struct qemuProcessEvent *processEvent =3D data; @@ -4365,6 +4399,9 @@ static void qemuProcessEventHandler(void *data, void = *opaque) case QEMU_PROCESS_EVENT_GUEST_CRASHLOADED: processGuestCrashloadedEvent(driver, vm); break; + case QEMU_PROCESS_EVENT_STOP: + processGuestStopEvent(vm); + break; case QEMU_PROCESS_EVENT_LAST: break; } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 5f31260221..7003c92046 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -689,10 +689,26 @@ qemuProcessHandleStop(qemuMonitorPtr mon G_GNUC_UNUSE= D, if (priv->signalStop) virDomainObjBroadcast(vm); + /* In case of VIR_DOMAIN_PAUSED_UNKNOWN we'll update it later, but= we + * must set the state to PAUSED right away. We delay the event unt= il + * the update. */ virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason); - event =3D virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_SUSPEND= ED, - detail); + if (reason =3D=3D VIR_DOMAIN_PAUSED_UNKNOWN) { + /* offload unknown state to thread updating state */ + struct qemuProcessEvent *processEvent =3D g_new0(struct qemuPr= ocessEvent, 1); + + processEvent->eventType =3D QEMU_PROCESS_EVENT_STOP; + processEvent->vm =3D virObjectRef(vm); + + if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) = < 0) { + virObjectUnref(vm); + qemuProcessEventFree(processEvent); + } + } else { + event =3D virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_SUS= PENDED, + detail); + } VIR_FREE(priv->lockState); if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lock= State) < 0) --=20 2.29.2