From nobody Mon Feb 9 19:07:37 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655304892; cv=none; d=zohomail.com; s=zohoarc; b=AvylPggYhWj7rbzV6JySdt1Da8T0LSD2m/aOHGq4qza05sQgk7q498CJNtLQc/0KqgmeBps6ed5FbBHloRNXATrFFXGMxWzBU30LOUIYaOijPudBbXMQ9KGjffIb/HZ38GPuSE5SeQJgx/eLDeGVWSG52oYpeO4DMpk9PT705SY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655304892; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=y1C0ovCma94MwaNzMH0fejgdXb17aj2Xl6bNkPSIkW4=; b=Iw8EDnai1oN5yyrK1NJnubdkyw9+nh3vv+gdX378xarskSbGqaPYwGfUc+f0nAbXICssLk3mto1GNEIv5mWj4wVJrA83+b9YOvHtnFVauPuFZkpGGBfAfUADvjw8S4o0bs0l6GJGeWO82tBT9aHp6Oral4igsSznhXCiZOU8elg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655304892367632.1893028369041; Wed, 15 Jun 2022 07:54:52 -0700 (PDT) Received: from localhost ([::1]:56166 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UPz-0000mx-BG for importer@patchew.org; Wed, 15 Jun 2022 10:54:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47268) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO7-00067t-7O for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:55 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:5382) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO5-000103-0I for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:54 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE61k6001479; Wed, 15 Jun 2022 14:52:40 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tk4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:39 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ79i023087; Wed, 15 Jun 2022 14:52:39 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpkk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:38 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMx018501; Wed, 15 Jun 2022 14:52:38 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-9; Wed, 15 Jun 2022 14:52:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=y1C0ovCma94MwaNzMH0fejgdXb17aj2Xl6bNkPSIkW4=; b=sAY8GsiLznSyKmZgFEXTbQZfo808YYjtDjxZmj5GAMzrSHGUVGSnyLH56Eqi6zwWZJYn Mc0ttGUjthdGIEcqmlDVFXnT++sCRS0tiTYHOCq+i4ii5j6OSonq2dg08Ux3GFblHT1i d/qISwi7+GEN003Pwy7K/IwEH7Fs73aTEAuwlRUHFusavSpxU9X+xKJEj/jMsmnqxBb6 n7XfNbZ8lFh6bg3VhbMt1CiNVgfgjLTs3Kwz7zaVim14UW2PWQzv1ZWqImugVHV64Z/u LelypeAKTaZzbEBhGiRY7ulvDbRG2+d1GIK68nx29ObBhGlG37frbPok4KlT7qEatkiH 1g== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 08/39] cpr: blockers Date: Wed, 15 Jun 2022 07:51:55 -0700 Message-Id: <1655304746-102776-9-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: dI8tkBbO_SkoO4XW6v7F4nD0nKO6ei5f X-Proofpoint-ORIG-GUID: dI8tkBbO_SkoO4XW6v7F4nD0nKO6ei5f Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655304892905100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add an interface to register a blocker for cpr-save for one or more modes. Devices and options that do not support a cpr mode can register a blocker, and cpr-save will fail with a descriptive error message. Conversely, if such a device is deleted and un-registers its blocker, cpr will be allowed again. Signed-off-by: Steve Sistare --- MAINTAINERS | 1 + include/migration/cpr.h | 6 ++++ migration/cpr.c | 79 +++++++++++++++++++++++++++++++++++++++++++++= ++++ stubs/cpr.c | 23 ++++++++++++++ stubs/meson.build | 1 + 5 files changed, 110 insertions(+) create mode 100644 stubs/cpr.c diff --git a/MAINTAINERS b/MAINTAINERS index 9273891..1e4e72f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3159,6 +3159,7 @@ S: Maintained F: include/migration/cpr.h F: migration/cpr.c F: qapi/cpr.json +F: stubs/cpr.c =20 Record/replay M: Pavel Dovgalyuk diff --git a/include/migration/cpr.h b/include/migration/cpr.h index 1b6c82f..dfe5a1d 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -13,4 +13,10 @@ void cpr_set_mode(CprMode mode); CprMode cpr_get_mode(void); =20 +#define CPR_MODE_ALL CPR_MODE__MAX + +int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...); +int cpr_add_blocker_str(const char *reason, Error **errp, CprMode mode, ..= .); +void cpr_del_blocker(Error **reasonp); + #endif diff --git a/migration/cpr.c b/migration/cpr.c index 24b0bcc..c1da784 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -29,12 +29,91 @@ void cpr_set_mode(CprMode mode) cpr_mode =3D mode; } =20 +static GSList *cpr_blockers[CPR_MODE__MAX]; + +/* + * Add blocker for each mode in varargs list, or for all modes if CPR_MODE= _ALL + * is specified. Caller terminates the list with 0 or CPR_MODE_ALL. This + * function takes ownership of *reasonp, and frees it on error, or in + * cpr_del_blocker. errp is set in a later patch. + */ +int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...) +{ + int modes =3D 0; + va_list ap; + ERRP_GUARD(); + + va_start(ap, mode); + while (mode !=3D CPR_MODE_NONE && mode !=3D CPR_MODE_ALL) { + assert(mode > CPR_MODE_NONE && mode < CPR_MODE__MAX); + modes |=3D BIT(mode); + mode =3D va_arg(ap, CprMode); + } + va_end(ap); + if (mode =3D=3D CPR_MODE_ALL) { + modes =3D BIT(CPR_MODE__MAX) - 1; + } + + for (mode =3D 0; mode < CPR_MODE__MAX; mode++) { + if (modes & BIT(mode)) { + cpr_blockers[mode] =3D g_slist_prepend(cpr_blockers[mode], *re= asonp); + } + } + return 0; +} + +/* + * Delete the blocker from all modes it is associated with. + */ +void cpr_del_blocker(Error **reasonp) +{ + CprMode mode; + + if (*reasonp) { + for (mode =3D 0; mode < CPR_MODE__MAX; mode++) { + cpr_blockers[mode] =3D g_slist_remove(cpr_blockers[mode], *rea= sonp); + } + error_free(*reasonp); + *reasonp =3D NULL; + } +} + +/* + * Add a blocker which will not be deleted. Simpler for some callers. + */ +int cpr_add_blocker_str(const char *msg, Error **errp, CprMode mode, ...) +{ + int ret; + va_list ap; + Error *reason =3D NULL; + + error_setg(&reason, "%s", msg); + va_start(ap, mode); + ret =3D cpr_add_blocker(&reason, errp, mode, ap); + va_end(ap); + return ret; +} + +static bool cpr_is_blocked(Error **errp, CprMode mode) +{ + if (cpr_blockers[mode]) { + error_propagate(errp, error_copy(cpr_blockers[mode]->data)); + return true; + } + + return false; +} + void qmp_cpr_save(const char *filename, CprMode mode, Error **errp) { int ret; QEMUFile *f; int saved_vm_running =3D runstate_is_running(); =20 + if (cpr_is_blocked(errp, mode)) { + return; + } + if (global_state_store()) { error_setg(errp, "Error saving global state"); return; diff --git a/stubs/cpr.c b/stubs/cpr.c new file mode 100644 index 0000000..06a9a1c --- /dev/null +++ b/stubs/cpr.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "migration/cpr.h" + +int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...) +{ + return 0; +} + +int cpr_add_blocker_str(const char *reason, Error **errp, CprMode mode, ..= .) +{ + return 0; +} + +void cpr_del_blocker(Error **reasonp) +{ +} diff --git a/stubs/meson.build b/stubs/meson.build index 6f80fec..0d7565b 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -4,6 +4,7 @@ stub_ss.add(files('blk-exp-close-all.c')) stub_ss.add(files('blockdev-close-all-bdrv-states.c')) stub_ss.add(files('change-state-handler.c')) stub_ss.add(files('cmos.c')) +stub_ss.add(files('cpr.c')) stub_ss.add(files('cpu-get-clock.c')) stub_ss.add(files('cpus-get-virtual-clock.c')) stub_ss.add(files('qemu-timer-notify-cb.c')) --=20 1.8.3.1