From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755191975; cv=none; d=zohomail.com; s=zohoarc; b=a+UW9CYUiKCnpG7li2Hlf/uGGXP2xXiL0uUaV6hdh2bAn7n5933V9yfI+292JoXpCQky8Vj9pSheZKqoNcSqyTBZ7wZeN6W7ds25T7Qf5AtzwwDJQm0IHM/RHgXzLd2xERfUgO80EQ4xQnIbAdPeLFp/LsPhES0eP78VBwaatqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755191975; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=zLxPi1C1UwPvksw5eo899vW+RJq5qlI4mRosWJfckaI=; b=E8zusHnZz/D4FT2Hsq3w2/XcyoX2JazWh3EC3DhFgRF05uWACYJOl6nAtbyTBN4z+xChWf4Tw3MkLSsnDvIxCqz1JIYfpIMVRgE4QJFjV5jc0mTf4QIuff3RIvKKIXTrum/9VTC1bJnDrVAlXFk6U1N6YFy5B8R1SyPOWVq+SMA= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755191975203711.7830076128243; Thu, 14 Aug 2025 10:19:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umba6-0005TD-0m; Thu, 14 Aug 2025 13:17:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba3-0005SU-UL for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:35 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba0-0002p3-AU for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:35 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECgEMA002381; Thu, 14 Aug 2025 17:17:28 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48h7rmsnk4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:27 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EFU31N010436; Thu, 14 Aug 2025 17:17:27 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbry9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:27 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwu8038225; Thu, 14 Aug 2025 17:17:26 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-2; Thu, 14 Aug 2025 17:17:26 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=zLxPi1C1UwPvksw5eo899vW+RJq5qlI4mRosWJfckaI=; b= dQwUwG/aoTJOVtzo//O3D83ZZwm2G2iNmR+3R9wC3IGcnDaO8b1QhV4YoYvECMXs il8kqy1IjjiMFC7aQxENeog5Qj07PbA7NhWkS9MqqC/DLCebRwZj5bwhJqbX2Gs3 zn6MAvjbKH1K6Sl1Ey7EqDcSQWGeQRvoqJ27skbVzyKjTxDvQ9ryqYDyc4XH56Hv vVsa8GkuXxPDGa7DMslLij+uQ92hSvBXuqIw77yG0hvpwNjBn5j7BGxntZiw23fl TW9/kmvDsQvXm2NocRVNEdzVCEByiH+luwwMAmG+MClzV58mhdEgUyLnq3fdmfdi 6XeQBdpZUbcSMJ0aBwVltg== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 1/9] migration: multi-mode notifier Date: Thu, 14 Aug 2025 10:17:15 -0700 Message-Id: <1755191843-283480-2-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0NiBTYWx0ZWRfX5WPbWpJKPRoi njDwUQ0Bep+Ipq1A+EJjxPS3pRuaQZ3I6fu6urcBXcW6tjSaRXGntsuLKhVhHaVO8tWD9qohtub 91ALL14w0QZk1uvJIHb/HQAiK6mrHDii1J4/0bcHQSAzhVJ+W2eHqc5/kA/8geOkDbmseZwSHmR UTQeRgnELRbXHKoe6Wlakpp50B6Qt1dYv85T1sAGpEpNsDjqDHBZ1KfwmQB+4iUzOwDcfXIEhAd P36nEIm/YMjuZIkbkQe1A/o3DJJ1gGPCqZI/S97ieF62w7/CI8O0zsDY21OzUUCBnffQaqS2e74 a8ucaiOJx5YegCdMZdr+vzRA1Ta7vKuPz1XO65OBpjaTRcW91FeBhSbGIT28byZ8Fpb/WPFlauG 3S3nislXjFoUzZXDuv2hF9FIrXnEGCYPnzlSNIKuSMlN5mC6XDOB5Y/6Cdf4NUPs/H/cfRWq X-Proofpoint-ORIG-GUID: VxfUQirKQpifkvol28RZ7KJlsGVsA7Je X-Authority-Analysis: v=2.4 cv=UN3dHDfy c=1 sm=1 tr=0 ts=689e1a27 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=5EBYLqYaYwAzse22UuoA:9 cc=ntf awl=host:12069 X-Proofpoint-GUID: VxfUQirKQpifkvol28RZ7KJlsGVsA7Je 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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755191978466124100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Allow a notifier to be added for multiple migration modes. To allow a notifier to appear on multiple per-node lists, use a generic list type. We can no longer use NotifierWithReturnList, because it shoe horns the notifier onto a single list. Signed-off-by: Steve Sistare Reviewed-by: Fabiano Rosas --- include/migration/misc.h | 12 ++++++++++ migration/migration.c | 60 +++++++++++++++++++++++++++++++++++++-------= ---- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/include/migration/misc.h b/include/migration/misc.h index a261f99..592b930 100644 --- a/include/migration/misc.h +++ b/include/migration/misc.h @@ -95,7 +95,19 @@ void migration_add_notifier(NotifierWithReturn *notify, void migration_add_notifier_mode(NotifierWithReturn *notify, MigrationNotifyFunc func, MigMode mode); =20 +/* + * Same as migration_add_notifier, but applies to all @mode in the argument + * list. The list is terminated by -1 or MIG_MODE_ALL. For the latter, + * the notifier is added for all modes. + */ +void migration_add_notifier_modes(NotifierWithReturn *notify, + MigrationNotifyFunc func, MigMode mode, = ...); + +/* + * Remove a notifier from all modes. + */ void migration_remove_notifier(NotifierWithReturn *notify); + void migration_file_set_error(int ret, Error *err); =20 /* True if incoming migration entered POSTCOPY_INCOMING_DISCARD */ diff --git a/migration/migration.c b/migration/migration.c index 49d1e7d..271c521 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -74,11 +74,7 @@ =20 #define INMIGRATE_DEFAULT_EXIT_ON_ERROR true =20 -static NotifierWithReturnList migration_state_notifiers[] =3D { - NOTIFIER_ELEM_INIT(migration_state_notifiers, MIG_MODE_NORMAL), - NOTIFIER_ELEM_INIT(migration_state_notifiers, MIG_MODE_CPR_REBOOT), - NOTIFIER_ELEM_INIT(migration_state_notifiers, MIG_MODE_CPR_TRANSFER), -}; +static GSList *migration_state_notifiers[MIG_MODE__MAX]; =20 /* Messages sent on the return path from destination to source */ enum mig_rp_message_type { @@ -1666,23 +1662,51 @@ void migration_cancel(void) } } =20 +static int get_modes(MigMode mode, va_list ap); + +static void add_notifiers(NotifierWithReturn *notify, int modes) +{ + for (MigMode mode =3D 0; mode < MIG_MODE__MAX; mode++) { + if (modes & BIT(mode)) { + migration_state_notifiers[mode] =3D + g_slist_prepend(migration_state_notifiers[mode], notify); + } + } +} + +void migration_add_notifier_modes(NotifierWithReturn *notify, + MigrationNotifyFunc func, MigMode mode, = ...) +{ + int modes; + va_list ap; + + va_start(ap, mode); + modes =3D get_modes(mode, ap); + va_end(ap); + + notify->notify =3D (NotifierWithReturnFunc)func; + add_notifiers(notify, modes); +} + void migration_add_notifier_mode(NotifierWithReturn *notify, MigrationNotifyFunc func, MigMode mode) { - notify->notify =3D (NotifierWithReturnFunc)func; - notifier_with_return_list_add(&migration_state_notifiers[mode], notify= ); + migration_add_notifier_modes(notify, func, mode, -1); } =20 void migration_add_notifier(NotifierWithReturn *notify, MigrationNotifyFunc func) { - migration_add_notifier_mode(notify, func, MIG_MODE_NORMAL); + migration_add_notifier_modes(notify, func, MIG_MODE_NORMAL, -1); } =20 void migration_remove_notifier(NotifierWithReturn *notify) { if (notify->notify) { - notifier_with_return_remove(notify); + for (MigMode mode =3D 0; mode < MIG_MODE__MAX; mode++) { + migration_blockers[mode] =3D + g_slist_remove(migration_state_notifiers[mode], notify); + } notify->notify =3D NULL; } } @@ -1692,13 +1716,23 @@ int migration_call_notifiers(MigrationState *s, Mig= rationEventType type, { MigMode mode =3D s->parameters.mode; MigrationEvent e; + NotifierWithReturn *notifier; + GSList *elem, *next; int ret; =20 e.type =3D type; - ret =3D notifier_with_return_list_notify(&migration_state_notifiers[mo= de], - &e, errp); - assert(!ret || type =3D=3D MIG_EVENT_PRECOPY_SETUP); - return ret; + + for (elem =3D migration_state_notifiers[mode]; elem; elem =3D next) { + next =3D elem->next; + notifier =3D (NotifierWithReturn *)elem->data; + ret =3D notifier->notify(notifier, &e, errp); + if (ret) { + assert(type =3D=3D MIG_EVENT_PRECOPY_SETUP); + return ret; + } + } + + return 0; } =20 bool migration_has_failed(MigrationState *s) --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755191922; cv=none; d=zohomail.com; s=zohoarc; b=D7BAHcActFHDhADbvOmIk8qAwHkquRqWtdhxrV2H3Q64bqUuv+Vn8H0nbX0d2uZ/e/ER3+AzFKKGrjhYnP/SFZyJKr+/QIHmjh3ah36Sr/r0IKv11sGsuqNNDsczS2DpESQgL9j4FnsAbXTaskRR6ny2I/Cm3mE065to2UBNK8A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755191922; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=TEFoIPikc0HL819wjayDhp6+RMMXJYnYxFwcfyldD6M=; b=WTQTPJKfHPNgqIWztisvV1eu+Mis8O5M9KaUuPlQB0ojAkENusMDLk1fugLAxIJQBcZCc59vxQdn7mUG5RQ9JxCemM0wrMNSGpD5+89rieoNuuNpEHs7amyXXQ+4WVW0ggFLFtpBATwsRuTIEfcTHBaNggIG4CLaXXel5dodbhM= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755191922428587.8512214102154; Thu, 14 Aug 2025 10:18:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umbaC-0005aN-HR; Thu, 14 Aug 2025 13:17:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba9-0005Uy-4q for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:41 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba0-0002pG-OQ for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:40 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECgDhC028780; Thu, 14 Aug 2025 17:17:29 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48guchayy8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:29 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EGloDs009881; Thu, 14 Aug 2025 17:17:28 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbryr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:28 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuA038225; Thu, 14 Aug 2025 17:17:27 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-3; Thu, 14 Aug 2025 17:17:27 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=TEFoIPikc0HL819wjayDhp6+RMMXJYnYxFwcfyldD6M=; b= Uym8Gmkd+p+VfYa50V0tHRF6jvwGBIQKwMMwsu55DIf+n5/DHcwOxTuHJlNpikCb swSxMKIoAPRYYIOCekeEekO1PRNyOavX14UXqGVRe70dIEhAB1SDHHZVYTakuoKH uFM0QRI28n2iK/Kh2NN7OSXKx6hTFRZui3NwSzfwRFH5UekP3HsabJQDNE8fFo5z oShJwEh+UKZ1u8gYnySVFbwWeUChpTPqbt2omAzD5llU1qFsKmBBP2J3rqAHpTRm vKZJ0Lhn8Xo2oxE1Gy0vcRQLDtwBnz8UknlvTllKAUJtUTDJwEUCZwvKFy10K8xZ 1NzFYV7q3qXCHroVoUyEbw== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 2/9] migration: add cpr_walk_fd Date: Thu, 14 Aug 2025 10:17:16 -0700 Message-Id: <1755191843-283480-3-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Authority-Analysis: v=2.4 cv=Eo/SrTcA c=1 sm=1 tr=0 ts=689e1a29 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=QEhf6t8kAlL4CJLHOQYA:9 cc=ntf awl=host:12069 X-Proofpoint-ORIG-GUID: WqILoSJiVpnsdwItSFkMli_snv3Plrnc X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfX6ohaAYeXwf3H y3V8cea34Q1i98qZ1/ZsEeNiiQvH4poyy8k59MTy9pU32UTl/zhKJ3DQy7wwOVvzPGUs/91Hq70 zOFEQddR8oj3ZqGWLwo8+1pRxW42MgbSF6OMuxQN3F2KaglqwN0dXgVwbNksn8vVxSyu17v6VeP TeljaTy7D+TFC3fCUm1ON8SS6WyPfD1jondiKWp+Y16u0lqH2OAHfCYWz4ED2SeLWMw+flMlFO6 woC0kJlgrIe4Kpiqk5lmJN9HLoNMCZphFZSh33y32fiOdreY9oMIV9AjhuNPioxSqFdyurheASf 9h/8CYCn3kWATD5GiYTYxNnfiJNh5FuUyqxyj9N0KMC3yBxtGzhDv+VNTnkv2HAiIFFigyf+xug H47abFgLR4vEA6zYG/RsqPfduEu4SJpRPMW1zDaIvKYmdyheDdePn9ajqcGCRN850l9AR0iP X-Proofpoint-GUID: WqILoSJiVpnsdwItSFkMli_snv3Plrnc 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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755191923960124100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add a helper to walk all CPR fd's and run a callback for each. Signed-off-by: Steve Sistare Reviewed-by: Peter Xu --- include/migration/cpr.h | 3 +++ migration/cpr.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/migration/cpr.h b/include/migration/cpr.h index baff57f..f4fc5ca 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -35,6 +35,9 @@ void cpr_resave_fd(const char *name, int id, int fd); int cpr_open_fd(const char *path, int flags, const char *name, int id, Error **errp); =20 +typedef bool (*cpr_walk_fd_cb)(int fd); +bool cpr_walk_fd(cpr_walk_fd_cb cb); + MigMode cpr_get_incoming_mode(void); void cpr_set_incoming_mode(MigMode mode); bool cpr_is_incoming(void); diff --git a/migration/cpr.c b/migration/cpr.c index 6d01b8c..021bd6a 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -134,6 +134,19 @@ int cpr_open_fd(const char *path, int flags, const cha= r *name, int id, return fd; } =20 +bool cpr_walk_fd(cpr_walk_fd_cb cb) +{ + CprFd *elem; + + QLIST_FOREACH(elem, &cpr_state.fds, next) { + g_assert(elem->fd >=3D 0); + if (!cb(elem->fd)) { + return false; + } + } + return true; +} + /*************************************************************************/ static const VMStateDescription vmstate_cpr_state =3D { .name =3D CPR_STATE, --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755192008; cv=none; d=zohomail.com; s=zohoarc; b=hLKGISfoCvPpl9lCStk91wKg8YtKsdfpwLVkhxL3tej/SvyhdQ2FnOD8ml6pEpwwhAUbtGu1hKtFt8sbUvqdD5oQg80WG7vmWhWzasOwTl2Qqgoipau0/9N3ipGzCApH2mKyycgszBQ0CjWNeWd6GPPSoS+f9wK5paGqRqE/C7I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755192008; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JgRIAMoCHuh6OPoNq+NuoU6FlbtY4XgJKfRrNefoGR4=; b=HkBQJi+h5k3+td5bwrknEFbt55u1EephoZDQRyHPX+AM4Si0aYxHRpkEA3CJGUP7HwXfMf//zJvvdk6R8P3JkVh1lINtM4mnCiq1Mx53DvXG7JeSpNw+/AnyeDPE7auQwvAQlz0ZmL7k01PvOe6Zsy1EAS7k5TRaHGChN8CEBGw= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755192008798550.9654454249073; Thu, 14 Aug 2025 10:20:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umba8-0005TW-22; Thu, 14 Aug 2025 13:17:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba4-0005Ss-OY for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:36 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba0-0002pg-J9 for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:36 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECgE27020388; Thu, 14 Aug 2025 17:17:30 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48dw452hcu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:30 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EHEemW009858; Thu, 14 Aug 2025 17:17:29 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs0b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:29 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuC038225; Thu, 14 Aug 2025 17:17:28 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-4; Thu, 14 Aug 2025 17:17:28 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=JgRIAMoCHuh6OPoNq+NuoU6FlbtY4XgJKfRrNefoGR4=; b= dzcB7OJudoAeaKal0GCPwXyQ38Ev0H12Vm6btZPoPtCAJWWLMmEb7ToP7eJsC+Jq C0MrdqGhXo0iYtOl4gIpPmrgW82vgoTSLkuUwIpsThFgGBZim3aFn9bhaERDyG9y mZEmO2OPjBSZGo+dvCt36cveXkpgJCcQNravdEkmy2FP5bN4zJAKhT5ubtU17oVq JR9vOBkgexK7AWACCGS6jVIgk/haowDBSQLUfrq5sS8dJOLa7rimCiL687zj/eKc XasuAXtXZKURcGPwNNAbyYD4tJ7oU9rXsf02UNPiUZfFy3izvnlw4hf4vNbO1ui2 a2COi1dOM01NxXrjPexAZw== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 3/9] oslib: qemu_clear_cloexec Date: Thu, 14 Aug 2025 10:17:17 -0700 Message-Id: <1755191843-283480-4-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-ORIG-GUID: dceiOfFlFjEC_F95EDC2pLeWdAfB8kDU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfXy+k58kRWSG8T 7FIofaHTWQoCIyBurTn098xkgMRxHKTRe9PArTkvSNR3FZ0vMSMiNFE9sDZPoJIxl8LBVNVHf7D 7T5MWdkn3G1PgqivXStvCg/Sg4ewSBLxRog82bQUgo/aYvTDo0RKBwNo5h+8GT9eDCC9ETKuctr BtF9g4QafdpSUahTv6uyJT97aXATWH17AABTFGIfFOP7biAL3tzhHUz8al/n9NysKGbCpXLBCR9 mwX0HBSOZ8ObQ4JimIsf1V6XgN85Duc2ruDHCUx3lMfWAFQ2MtCg1rPiqULBDe4ULBtY0lLOr8h DKolLcO0FmM3NqdLPb2qywCI0tTlUET//fSdKqTzBrbUAHK6HQcC6MVXjOkGrk57kNBGxPSKUN+ jrTMKU+HaO37c1YxMFawut9dxLmuE7TOxib+S1YrsdjGIqsKE7KfZAloLfwu88AfdFBWVJ4n X-Authority-Analysis: v=2.4 cv=X9FSKHTe c=1 sm=1 tr=0 ts=689e1a2a b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=IkcTkHD0fZMA:10 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=20KFwNOVAAAA:8 a=eRAJs6dweEk5O_tl00MA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 cc=ntf awl=host:12069 X-Proofpoint-GUID: dceiOfFlFjEC_F95EDC2pLeWdAfB8kDU 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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755192010041116600 Define qemu_clear_cloexec, analogous to qemu_set_cloexec. Signed-off-by: Steve Sistare Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Fabiano Rosas --- include/qemu/osdep.h | 9 +++++++++ util/oslib-posix.c | 9 +++++++++ util/oslib-win32.c | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index 96fe51b..30136ea 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -680,6 +680,15 @@ ssize_t qemu_write_full(int fd, const void *buf, size_= t count) =20 void qemu_set_cloexec(int fd); =20 +/* + * Clear FD_CLOEXEC for a descriptor. + * + * The caller must guarantee that no other fork+exec's occur before the + * exec that is intended to inherit this descriptor, eg by suspending CPUs + * and blocking monitor commands. + */ +void qemu_clear_cloexec(int fd); + /* Return a dynamically allocated directory path that is appropriate for s= toring * local state. * diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 4ff577e..4c04658 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -307,6 +307,15 @@ int qemu_socketpair(int domain, int type, int protocol= , int sv[2]) return ret; } =20 +void qemu_clear_cloexec(int fd) +{ + int f; + f =3D fcntl(fd, F_GETFD); + assert(f !=3D -1); + f =3D fcntl(fd, F_SETFD, f & ~FD_CLOEXEC); + assert(f !=3D -1); +} + char * qemu_get_local_state_dir(void) { diff --git a/util/oslib-win32.c b/util/oslib-win32.c index b735163..843a901 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -222,6 +222,10 @@ void qemu_set_cloexec(int fd) { } =20 +void qemu_clear_cloexec(int fd) +{ +} + int qemu_get_thread_id(void) { return GetCurrentThreadId(); --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755192010; cv=none; d=zohomail.com; s=zohoarc; b=kd6gbeX8dgYH8jSx9Hk+UD3hD4+9tdTXkG3aYXo9bFIUfljLyvCbxHA1N1ZY4lz93g1naVecDDZHf6sA6M02teO0kcpQ2KHpgOsAI8yW4JIeSFIheDqbmS8s5BPDRtzO1ED+uXTlA6KTPYZxFG4IXOq/1X1GJOYemjc+TY333EE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755192010; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=XMqwtmpD+QnI/KOlEdK3J9UJbWrXieuuBA8a9T/SZew=; b=NpuMX5uXoZzc4A+I1wSeCTKyv2zxJVv7NAyoODCDZFF0A1yPfhuPbZgmyCqcpoSku9c2DlB+CJDri1YskGpTUIJFIiXD/K7pYdzoaNSkwKlc91Me27dp8gmK8PREZTsVtGMm4vvFcoFaOwO+weBvZrJXp4q6f1lmlSKy7k6pqY0= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755192010792876.7006218913789; Thu, 14 Aug 2025 10:20:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umba6-0005Ta-M3; Thu, 14 Aug 2025 13:17:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba5-0005T1-22 for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:37 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba1-0002pu-St for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:36 -0400 Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECgBfL006028; Thu, 14 Aug 2025 17:17:32 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48dw8ejfd1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:32 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EGBgsk010424; Thu, 14 Aug 2025 17:17:30 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs0n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:30 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuE038225; Thu, 14 Aug 2025 17:17:30 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-5; Thu, 14 Aug 2025 17:17:29 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=XMqwtmpD+QnI/KOlEdK3J9UJbWrXieuuBA8a9T/SZew=; b= VCAObz6fWkHpyzNFMklE0xy9gU3NSpbG+6wk96Yo/Hv9ugyyVIMuFJrOTJAh4OQG KEu9f0mfFTWNjnWWes0RYwMIq5QrrmiDwMvRqKPhGok4vtMEKj53B3U1Yzk6aDt7 LlkdPCe6/3A/kwJHsiu5uCjSHZ581p/oGYLVBlYoHOWs9QnKH3VlUTdHZGTdDL6A sV5Wm6aW41JQEj0ULwN5RKW9QjLaIkVvjFfH9KYcfD5H0K+Gi92/XiyN9Hisb7w1 fmiSv2l9ZN/xz6ll0pW8847Wx41URjdR9IhF1jAHudSnsIrz6oebqCLWLpZdPQMh 2uGTPzxKTo59wtUigF87ng== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 4/9] vl: helper to request exec Date: Thu, 14 Aug 2025 10:17:18 -0700 Message-Id: <1755191843-283480-5-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-GUID: 4L2T9NXglNaAK5YdovRqq726C7Tdmias X-Proofpoint-ORIG-GUID: 4L2T9NXglNaAK5YdovRqq726C7Tdmias X-Authority-Analysis: v=2.4 cv=ePQTjGp1 c=1 sm=1 tr=0 ts=689e1a2c b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=osZJ3dnYYTX8la6_xJwA:9 cc=ntf awl=host:12069 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfXzHT+C40J/gdm wmNQwXkSID/5+zf1rEx3Jmdr6SjwqhtDtWHSC99aIg+wP4zttwRbopvREPMQHrIFiwvGLX3bFAi lgrfb7rBC1/5TziREZxDJLjwAGzB18JqQfjIeL1Kmp6AjNoI0h5udPtyxzzMNZyXtv+bH7CrMqd 2Ik7EYnPnzdx3vEXM8ibYaaV3ksD8zoifV27YWcrKOjPVcMgSsWTzheHYeYPXetYUJvBO5CXX6j fmX17qzTxe4O+aOi3nSSiKVS6hVHkNd1q3iROW5XlyCIgQEWbg2oJadf0jpjKSUi/Hfq7YLgFhN IF6wF/NGILWwpQJDMMI3CHFWW029S+r8WL2MEUJmbluvkb13zD1neHfHW8A31KCvlR9hpizhHAN gSn9GHDzqoSjg0LmsnYqySzcQeNL+vd+SkxbDXVGRFSJPDglQCYZCuCGqVrTFi2gk41lo2nW 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.165.32; envelope-from=steven.sistare@oracle.com; helo=mx0a-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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755192011988116600 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add a qemu_system_exec_request() hook that causes the main loop to exit and exec a command using the specified arguments. This will be used during CPR to exec a new version of QEMU. Signed-off-by: Steve Sistare --- include/system/runstate.h | 3 +++ system/runstate.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/system/runstate.h b/include/system/runstate.h index 929379a..c005f49 100644 --- a/include/system/runstate.h +++ b/include/system/runstate.h @@ -128,6 +128,8 @@ typedef enum WakeupReason { QEMU_WAKEUP_REASON_OTHER, } WakeupReason; =20 +typedef void (*qemu_exec_func)(char **exec_argv); + void qemu_system_reset_request(ShutdownCause reason); void qemu_system_suspend_request(void); void qemu_register_suspend_notifier(Notifier *notifier); @@ -139,6 +141,7 @@ void qemu_register_wakeup_support(void); void qemu_system_shutdown_request_with_code(ShutdownCause reason, int exit_code); void qemu_system_shutdown_request(ShutdownCause reason); +void qemu_system_exec_request(qemu_exec_func func, const strList *args); void qemu_system_powerdown_request(void); void qemu_register_powerdown_notifier(Notifier *notifier); void qemu_register_shutdown_notifier(Notifier *notifier); diff --git a/system/runstate.c b/system/runstate.c index 6178b00..b4980ff 100644 --- a/system/runstate.c +++ b/system/runstate.c @@ -41,6 +41,7 @@ #include "qapi/error.h" #include "qapi/qapi-commands-run-state.h" #include "qapi/qapi-events-run-state.h" +#include "qapi/type-helpers.h" #include "qemu/accel.h" #include "qemu/error-report.h" #include "qemu/job.h" @@ -422,6 +423,8 @@ static NotifierList wakeup_notifiers =3D static NotifierList shutdown_notifiers =3D NOTIFIER_LIST_INITIALIZER(shutdown_notifiers); static uint32_t wakeup_reason_mask =3D ~(1 << QEMU_WAKEUP_REASON_NONE); +qemu_exec_func exec_func; +static char **exec_argv; =20 ShutdownCause qemu_shutdown_requested_get(void) { @@ -443,6 +446,11 @@ static int qemu_shutdown_requested(void) return qatomic_xchg(&shutdown_requested, SHUTDOWN_CAUSE_NONE); } =20 +static int qemu_exec_requested(void) +{ + return exec_argv !=3D NULL; +} + static void qemu_kill_report(void) { if (!qtest_driver() && shutdown_signal) { @@ -803,6 +811,23 @@ void qemu_system_shutdown_request(ShutdownCause reason) qemu_notify_event(); } =20 +static void qemu_system_exec(void) +{ + exec_func(exec_argv); + + /* exec failed */ + g_strfreev(exec_argv); + exec_argv =3D NULL; + exec_func =3D NULL; +} + +void qemu_system_exec_request(qemu_exec_func func, const strList *args) +{ + exec_func =3D func; + exec_argv =3D strv_from_str_list(args); + qemu_notify_event(); +} + static void qemu_system_powerdown(void) { qapi_event_send_powerdown(); @@ -849,6 +874,10 @@ static bool main_loop_should_exit(int *status) if (qemu_suspend_requested()) { qemu_system_suspend(); } + if (qemu_exec_requested()) { + qemu_system_exec(); + return false; + } request =3D qemu_shutdown_requested(); if (request) { qemu_kill_report(); --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755191882; cv=none; d=zohomail.com; s=zohoarc; b=O5g1WTFSjencfU8VoEGYjv9MOb1GO4H0xPdmpmnRZGMOcPjyQhnfH0ScsOTRJ1B2GU2O38KTvIagtQ6bcvsb4vQj+8p9lla1c+iQi0qEPdaUima9TAdAgoqeAgR0ssBI87hyrKzqY/Xk+1nAKKgGdpGdpMC5mlhAwPAs+IyBhjk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755191882; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7G4MmNkOgO0J13SkLn3jeCUijid877VZrdqJF/Fmns0=; b=VS5aLcdJa9mhEaB1NXCPHWJKx4ISz8VlWMeYfmiH2L8TN5a60Edx8ak8vzMBuQEf3EPn+6uYwWq7Hxpdv+PEKLdZ1DiNjmf6fwh+Dvh+FiaStqTOwwwWwz0ZJsgPB4i7rUul35aGhQOpfTjw1bXypBYZ3n/OLfoj4iSBDpcWgVk= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755191882354739.2799342016887; Thu, 14 Aug 2025 10:18:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umbaA-0005X3-N0; Thu, 14 Aug 2025 13:17:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba8-0005Up-R7 for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:40 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba3-0002q8-Sf for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:40 -0400 Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECgFu7002148; Thu, 14 Aug 2025 17:17:33 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48dxvx2d71-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:33 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EHDe9F010466; Thu, 14 Aug 2025 17:17:31 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs16-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:31 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuG038225; Thu, 14 Aug 2025 17:17:31 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-6; Thu, 14 Aug 2025 17:17:31 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=7G4MmNkOgO0J13SkLn3jeCUijid877VZrdqJF/Fmns0=; b= m0X7KMq2pR5Y/U1yTI3QQ/Olg0kONADJSzHh3MUNgMo0+G7eFB3R4TmH7tABA9Tv jqus22wlCms/DDOKbRMn3OJ2XtjEgikJ+MYb7oBy9FiTNwwfRpTWyOumxO1smpXH wvrC5nXOSuqKFyxsacu4CgIHX5yYquj5HZYwFwGfrbiDA3jv72sy0ZRPvetUcM3h szMWXQUX/Kbtk1YNqeq9EGjDMfVp9zRU6QQIKx6c7wzBNEqqIRztVHwnW7A6rVa2 CpGGw2eCFCbTskxIPPN6eoXS5PZKR0UuiwVhJ7jjiWac7mo7v6D3s/YDafpytEIB IvIjAv0CGfsh36grHrif4Q== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 5/9] migration: cpr-exec-command parameter Date: Thu, 14 Aug 2025 10:17:19 -0700 Message-Id: <1755191843-283480-6-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-GUID: hEHSE3cvGLkWqk0Cw8h1PMjVyjk0piQV X-Proofpoint-ORIG-GUID: hEHSE3cvGLkWqk0Cw8h1PMjVyjk0piQV X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfX8jn3LuRCWfFM sccnD+7HDzsPcY/y8LtXkaxF/HQnt3j36+kcVDSiFS+ciH8AUcCXGu9BKuzeS4WRTduO3+s95I1 YH5vPicjfP0gPKBoklyT9JT9izDC7iUBRg52Ob5TESdyEJDYm9wrnhUx2LLiu4SW60XXvSO9Wad 6OpEyNy7pghuDl+4s2EAutQgqV5faXqdnCM80q/1vwyKzyhLp5a6WTTkIf32poWmHi92d/WCPp4 7XrHp2QkF9QwneQ0wSVRm2hA0jCbUHbFczdlUgDUpYzWsYMzadCPFfIUf66+EpIIG1zRzF18rgy 0Gdp3aETKP313AFYFs8pI+224DL7GeWvNkT7gpA1XefIxUeUYgxa7Bz1OaLQGBCz3rtGI1pLXRZ kBe7Uf3BdaywHZeyyuuSGzMJwD+q93i19En0mWH0pmsW9RC3ojfw+2ubCiwuImpJXMntGjDa X-Authority-Analysis: v=2.4 cv=dpnbC0g4 c=1 sm=1 tr=0 ts=689e1a2d b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=MKfdV2AELyQW9RJxCdwA:9 cc=ntf awl=host:12069 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.165.32; envelope-from=steven.sistare@oracle.com; helo=mx0a-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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755191883936124100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Create the cpr-exec-command migration parameter, defined as a list of strings. It will be used for cpr-exec migration mode in a subsequent patch, and contains forward references to cpr-exec mode in the qapi doc. No functional change, except that cpr-exec-command is shown by the 'info migrate' command. Signed-off-by: Steve Sistare Acked-by: Markus Armbruster --- qapi/migration.json | 21 ++++++++++++++++++--- migration/migration-hmp-cmds.c | 25 +++++++++++++++++++++++++ migration/options.c | 14 ++++++++++++++ hmp-commands.hx | 2 +- 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/qapi/migration.json b/qapi/migration.json index 2387c21..ea410fd 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -924,6 +924,10 @@ # only has effect if the @mapped-ram capability is enabled. # (Since 9.1) # +# @cpr-exec-command: Command to start the new QEMU process when @mode +# is @cpr-exec. The first list element is the program's filename, +# the remainder its arguments. (Since 10.2) +# # Features: # # @unstable: Members @x-checkpoint-delay and @@ -950,7 +954,8 @@ 'vcpu-dirty-limit', 'mode', 'zero-page-detection', - 'direct-io'] } + 'direct-io', + 'cpr-exec-command'] } =20 ## # @MigrateSetParameters: @@ -1105,6 +1110,10 @@ # only has effect if the @mapped-ram capability is enabled. # (Since 9.1) # +# @cpr-exec-command: Command to start the new QEMU process when @mode +# is @cpr-exec. The first list element is the program's filename, +# the remainder its arguments. (Since 10.2) +# # Features: # # @unstable: Members @x-checkpoint-delay and @@ -1146,7 +1155,8 @@ '*vcpu-dirty-limit': 'uint64', '*mode': 'MigMode', '*zero-page-detection': 'ZeroPageDetection', - '*direct-io': 'bool' } } + '*direct-io': 'bool', + '*cpr-exec-command': [ 'str' ]} } =20 ## # @migrate-set-parameters: @@ -1315,6 +1325,10 @@ # only has effect if the @mapped-ram capability is enabled. # (Since 9.1) # +# @cpr-exec-command: Command to start the new QEMU process when @mode +# is @cpr-exec. The first list element is the program's filename, +# the remainder its arguments. (Since 10.2) +# # Features: # # @unstable: Members @x-checkpoint-delay and @@ -1353,7 +1367,8 @@ '*vcpu-dirty-limit': 'uint64', '*mode': 'MigMode', '*zero-page-detection': 'ZeroPageDetection', - '*direct-io': 'bool' } } + '*direct-io': 'bool', + '*cpr-exec-command': [ 'str' ]} } =20 ## # @query-migrate-parameters: diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c index 0fc21f0..79aa528 100644 --- a/migration/migration-hmp-cmds.c +++ b/migration/migration-hmp-cmds.c @@ -306,6 +306,18 @@ void hmp_info_migrate_capabilities(Monitor *mon, const= QDict *qdict) qapi_free_MigrationCapabilityStatusList(caps); } =20 +static void monitor_print_cpr_exec_command(Monitor *mon, strList *args) +{ + monitor_printf(mon, "%s:", + MigrationParameter_str(MIGRATION_PARAMETER_CPR_EXEC_COMMAND)); + + while (args) { + monitor_printf(mon, " %s", args->value); + args =3D args->next; + } + monitor_printf(mon, "\n"); +} + void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict) { MigrationParameters *params; @@ -435,6 +447,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QD= ict *qdict) MIGRATION_PARAMETER_DIRECT_IO), params->direct_io ? "on" : "off"); } + + assert(params->has_cpr_exec_command); + monitor_print_cpr_exec_command(mon, params->cpr_exec_command); } =20 qapi_free_MigrationParameters(params); @@ -716,6 +731,16 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDi= ct *qdict) p->has_direct_io =3D true; visit_type_bool(v, param, &p->direct_io, &err); break; + case MIGRATION_PARAMETER_CPR_EXEC_COMMAND: { + g_autofree char **strv =3D g_strsplit(valuestr ?: "", " ", -1); + strList **tail =3D &p->cpr_exec_command; + + for (int i =3D 0; strv[i]; i++) { + QAPI_LIST_APPEND(tail, strv[i]); + } + p->has_cpr_exec_command =3D true; + break; + } default: g_assert_not_reached(); } diff --git a/migration/options.c b/migration/options.c index 4e923a2..5183112 100644 --- a/migration/options.c +++ b/migration/options.c @@ -959,6 +959,9 @@ MigrationParameters *qmp_query_migrate_parameters(Error= **errp) params->zero_page_detection =3D s->parameters.zero_page_detection; params->has_direct_io =3D true; params->direct_io =3D s->parameters.direct_io; + params->has_cpr_exec_command =3D true; + params->cpr_exec_command =3D QAPI_CLONE(strList, + s->parameters.cpr_exec_command); =20 return params; } @@ -993,6 +996,7 @@ void migrate_params_init(MigrationParameters *params) params->has_mode =3D true; params->has_zero_page_detection =3D true; params->has_direct_io =3D true; + params->has_cpr_exec_command =3D true; } =20 /* @@ -1297,6 +1301,10 @@ static void migrate_params_test_apply(MigrateSetPara= meters *params, if (params->has_direct_io) { dest->direct_io =3D params->direct_io; } + + if (params->has_cpr_exec_command) { + dest->cpr_exec_command =3D params->cpr_exec_command; + } } =20 static void migrate_params_apply(MigrateSetParameters *params, Error **err= p) @@ -1429,6 +1437,12 @@ static void migrate_params_apply(MigrateSetParameter= s *params, Error **errp) if (params->has_direct_io) { s->parameters.direct_io =3D params->direct_io; } + + if (params->has_cpr_exec_command) { + qapi_free_strList(s->parameters.cpr_exec_command); + s->parameters.cpr_exec_command =3D + QAPI_CLONE(strList, params->cpr_exec_command); + } } =20 void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp) diff --git a/hmp-commands.hx b/hmp-commands.hx index d0e4f35..3cace8f 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1009,7 +1009,7 @@ ERST =20 { .name =3D "migrate_set_parameter", - .args_type =3D "parameter:s,value:s", + .args_type =3D "parameter:s,value:S", .params =3D "parameter value", .help =3D "Set the parameter for migration", .cmd =3D hmp_migrate_set_parameter, --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755192014; cv=none; d=zohomail.com; s=zohoarc; b=YgEcAqvGnNiCEtEJVCqbmXjx4TbGIPTcdcoQbXdzMBOEm9geQbjkxokJp4hjY2COGJVOgZIx3psmeijf+06cuZYDPoqgJel7c/JkBfiFg+XxQ+CypDfctaGyFd6D9bHTt6sH1fhwiA2h0ro1c33hiHGJ22eXNQGe6RFLtttqOJM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755192014; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4QWKzsape/wPi0214a2KMaISzaNbmpDGJwl9PMlhRvc=; b=HCwTzkPR3+x7rN4fpg+2BLCBAotH8X6X0XOt+Cm55035gzEKMfDPj6KEAPbSR+aKd8t5pHdiQxNVQDhRFpL0qi/y9M2HTDuhzq8xDyU0YkY2KwSOx62vUSHxAILYWF9PX+QaHg0R74ONuj1VxMhtWyHbuk9y059tM6yk0fThgww= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755192014967145.36413049802445; Thu, 14 Aug 2025 10:20:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umbaA-0005Vf-5C; Thu, 14 Aug 2025 13:17:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba7-0005U1-2G for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:39 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba4-0002qF-8y for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:38 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECg3g0020157; Thu, 14 Aug 2025 17:17:34 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48dvx4jhap-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:34 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EGs9gL010435; Thu, 14 Aug 2025 17:17:32 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs1k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:32 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuI038225; Thu, 14 Aug 2025 17:17:32 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-7; Thu, 14 Aug 2025 17:17:32 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=4QWKzsape/wPi0214a2KMaISzaNbmpDGJwl9PMlhRvc=; b= pJFwSz/nsPDW92T1bZUp8w2cdQwDS+iBPrqSYiLV1fpylgHDuY8QUtycyszT+ATQ eW0Sk2PEtKqbI/5nivZ9rnarcur26Vb47lMDpF40AXqfb04LvlsjvtOx4NdVtVEQ 2mry08XV2nA5wHmOzdmeF+iRWMP9modLmL0B1b5kodP/MUHIaoK9iVbN8Fa4cP+i oyVXdlsB0h2SlqBMhu/935WcfUikCyte3hED8tOxTu0xyCKcybUfkT8IF2ze6cpe z4jZnK5O91rW/4IFdQHInRa4iwaOHgohLpDeSdnXAmFcEFI54jLjLojdNZJSA6R1 RlEDzEWfgg9nR5QQ7d4UZA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 6/9] migration: cpr-exec save and load Date: Thu, 14 Aug 2025 10:17:20 -0700 Message-Id: <1755191843-283480-7-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfX4zdlPyL0Mo+N 8cHbzNhW8/p776A9LBsLQ9rDz+yl2srA+YniBXG66GFapj7ZbsL08huA+9aODdTfmELjZCbNp9z j7LwgpXlMJFfU/2y4il9nQsLpRhFeA+54AWh59jQJ+OwRoWo7xwyEhc61IKIMFnqjpVMpfsZsVM gmgfZcK+vmQxV2T6XLDqj20ulngXWcg7cxhefPw/pr51vzBOX259NQlXWCvCZ3IO7axhqV4zKYG cHrbgPXRVjXcTKukzwAZ0d0e2BdYRvvP9+nNY0IcavLOCraf2qkSYUE1rbiOHCYNJ+ZgExar7Sv ROi0HGE0ILErQiWCHjrfYLLZ0nvsRwRHPCxqdA6OFTigDkBqgXJxg+BarzC5r8xNbnoRa+GYKiJ +yNXEGP7WE/yJKF0SU8FVwjfSHNGKKcPq+yjGSEwmbPARs3p6kotFImCBBVDkBlco4WpsbGv X-Authority-Analysis: v=2.4 cv=eIsTjGp1 c=1 sm=1 tr=0 ts=689e1a2e b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=mt9KrOKPv6uyc6Gi5S4A:9 cc=ntf awl=host:12069 X-Proofpoint-GUID: 4Bn6d7IUCNIxCvqlLEhYqV6KIs-DFKzH X-Proofpoint-ORIG-GUID: 4Bn6d7IUCNIxCvqlLEhYqV6KIs-DFKzH 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.165.32; envelope-from=steven.sistare@oracle.com; helo=mx0a-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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755192016776124100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" To preserve CPR state across exec, create a QEMUFile based on a memfd, and keep the memfd open across exec. Save the value of the memfd in an environment variable so post-exec QEMU can find it. These new functions are called in a subsequent patch. Signed-off-by: Steve Sistare --- include/migration/cpr.h | 5 +++ migration/cpr-exec.c | 94 +++++++++++++++++++++++++++++++++++++++++++++= ++++ migration/meson.build | 1 + 3 files changed, 100 insertions(+) create mode 100644 migration/cpr-exec.c diff --git a/include/migration/cpr.h b/include/migration/cpr.h index f4fc5ca..aaeec02 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -54,4 +54,9 @@ int cpr_get_fd_param(const char *name, const char *fdname= , int index, bool cpr, QEMUFile *cpr_transfer_output(MigrationChannel *channel, Error **errp); QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp); =20 +QEMUFile *cpr_exec_output(Error **errp); +QEMUFile *cpr_exec_input(Error **errp); +void cpr_exec_persist_state(QEMUFile *f); +bool cpr_exec_has_state(void); +void cpr_exec_unpersist_state(void); #endif diff --git a/migration/cpr-exec.c b/migration/cpr-exec.c new file mode 100644 index 0000000..2c32e9c --- /dev/null +++ b/migration/cpr-exec.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2021-2025 Oracle and/or its affiliates. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/cutils.h" +#include "qemu/memfd.h" +#include "qapi/error.h" +#include "io/channel-file.h" +#include "io/channel-socket.h" +#include "migration/cpr.h" +#include "migration/qemu-file.h" +#include "migration/misc.h" +#include "migration/vmstate.h" +#include "system/runstate.h" + +#define CPR_EXEC_STATE_NAME "QEMU_CPR_EXEC_STATE" + +static QEMUFile *qemu_file_new_fd_input(int fd, const char *name) +{ + g_autoptr(QIOChannelFile) fioc =3D qio_channel_file_new_fd(fd); + QIOChannel *ioc =3D QIO_CHANNEL(fioc); + qio_channel_set_name(ioc, name); + return qemu_file_new_input(ioc); +} + +static QEMUFile *qemu_file_new_fd_output(int fd, const char *name) +{ + g_autoptr(QIOChannelFile) fioc =3D qio_channel_file_new_fd(fd); + QIOChannel *ioc =3D QIO_CHANNEL(fioc); + qio_channel_set_name(ioc, name); + return qemu_file_new_output(ioc); +} + +void cpr_exec_persist_state(QEMUFile *f) +{ + QIOChannelFile *fioc =3D QIO_CHANNEL_FILE(qemu_file_get_ioc(f)); + int mfd =3D dup(fioc->fd); + char val[16]; + + /* Remember mfd in environment for post-exec load */ + qemu_clear_cloexec(mfd); + snprintf(val, sizeof(val), "%d", mfd); + g_setenv(CPR_EXEC_STATE_NAME, val, 1); +} + +static int cpr_exec_find_state(void) +{ + const char *val =3D g_getenv(CPR_EXEC_STATE_NAME); + int mfd; + + assert(val); + g_unsetenv(CPR_EXEC_STATE_NAME); + assert(!qemu_strtoi(val, NULL, 10, &mfd)); + return mfd; +} + +bool cpr_exec_has_state(void) +{ + return g_getenv(CPR_EXEC_STATE_NAME) !=3D NULL; +} + +void cpr_exec_unpersist_state(void) +{ + int mfd; + const char *val =3D g_getenv(CPR_EXEC_STATE_NAME); + + g_unsetenv(CPR_EXEC_STATE_NAME); + assert(val); + assert(!qemu_strtoi(val, NULL, 10, &mfd)); + close(mfd); +} + +QEMUFile *cpr_exec_output(Error **errp) +{ + int mfd =3D memfd_create(CPR_EXEC_STATE_NAME, 0); + + if (mfd < 0) { + error_setg_errno(errp, errno, "memfd_create failed"); + return NULL; + } + + return qemu_file_new_fd_output(mfd, CPR_EXEC_STATE_NAME); +} + +QEMUFile *cpr_exec_input(Error **errp) +{ + int mfd =3D cpr_exec_find_state(); + + lseek(mfd, 0, SEEK_SET); + return qemu_file_new_fd_input(mfd, CPR_EXEC_STATE_NAME); +} diff --git a/migration/meson.build b/migration/meson.build index 276da3b..6087ccc 100644 --- a/migration/meson.build +++ b/migration/meson.build @@ -16,6 +16,7 @@ system_ss.add(files( 'channel-block.c', 'cpr.c', 'cpr-transfer.c', + 'cpr-exec.c', 'cpu-throttle.c', 'dirtyrate.c', 'exec.c', --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755191941; cv=none; d=zohomail.com; s=zohoarc; b=oLX5Dki+4OrMPKionGQ/sTCKsua3FgQiYhnWPg8NDbaQgdh5HovdxOSqoFO7SVq4R+KzpRNpWik//6LOVFNzMBdF24CS9OdYHkIkq/zVFOTRqtsk2j10k6lSAPtoLitNTKF0lERaYkFnH1/WQMZ8aGS8aWbG6o9BXYIkq39UG5U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755191941; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4h8yjVxm5V5qDbXCr9fWVxE1SakDrlIXzE/XZTxOEg4=; b=UEHjUKE5Ii6PpJcFyJXnx02XLdwkuUG/LUUOMQe+wrMag4mQd79RQUwwiKymsWsUAhe56SmAJIzrJfKxQdBotfgztrhVWVClil5hBVMOfZjW7aSLYdXoikCS0XpedxZNPFm0vXGLYwfbm2ap6oUIhV4IVIHxl3Cgil3jniBOcJk= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755191941264958.1829362312418; Thu, 14 Aug 2025 10:19:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umbaD-0005bj-Fa; Thu, 14 Aug 2025 13:17:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba9-0005V1-75 for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:41 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba6-0002qi-3o for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:40 -0400 Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECgBrB006019; Thu, 14 Aug 2025 17:17:35 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48dw8ejfd4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:35 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EFXjc9009866; Thu, 14 Aug 2025 17:17:33 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs2c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:33 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuK038225; Thu, 14 Aug 2025 17:17:33 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-8; Thu, 14 Aug 2025 17:17:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=4h8yjVxm5V5qDbXCr9fWVxE1SakDrlIXzE/XZTxOEg4=; b= TV1Lwlqi/WJdWH2fXXIqI5+LSQTVc5myK1CDKho6adzpkFN7ykmKQslgIofRhmjT jqSX5cKNZ1GUmlFRRKSnpwd+3WX/FpJ102mbMmRNn46hM4dXF0LCNXIW1Frq6/Pk iNxzyo9K8jkxzHC8WsJF+SdYOV0SExZozYewpaMn0NY5yCPd3OqWMSulOrSgcrlu fThgg+ivNV2n/SEYn8BiZ47Javq5rdS+PBdCgWHwbfW7Gf0GfI1GgGx1nOfmttYp otQVtmG8ny9DrRO/OnC2VHTa1bKCq604TJBhhMsYHC2z5oTTXrCDY52siuBz2yjT Hxnbj6kcFhWJ112F7sVACQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 7/9] migration: cpr-exec mode Date: Thu, 14 Aug 2025 10:17:21 -0700 Message-Id: <1755191843-283480-8-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-GUID: Eqqdp1VOXOzUFEMU2TEIOqLNa7ZZXKoX X-Proofpoint-ORIG-GUID: Eqqdp1VOXOzUFEMU2TEIOqLNa7ZZXKoX X-Authority-Analysis: v=2.4 cv=ePQTjGp1 c=1 sm=1 tr=0 ts=689e1a2f b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=V5tUqp5okAFojsnLb_sA:9 cc=ntf awl=host:12069 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfX4Dn9fBl6XwPj 6o+HYqRvnjyLjrR/r15MfHeRXP9OYDMx+xDd/XxwdNthz17U9kdpUg16apqonSHjDsbXNZ7Xecf wsnf2hwT+y1bCKH4CMRksgWMuV9BvEh/mdIKTerpVcXSuymZ2nTX8+TjPCpo8IBnTrqKl1XgHF9 GesREVYrwxWaGLx9dRNsEI17vJPEmkFWPYp1fkCNQ+Lm1pgaw7zPkHgNuj5i0tZ2rPmWghDyZ5l bn/74OgsqNDuWWiD8nmuEXYoa8Zupk5tkPjuJ6Ep2gz/fCKbfYXC0CUes6ZnBV64qCHT9S1WsoX N99CllniqG55hZDgxKVmB8/e94/+LxVE9GZT23D0DNskeDvkHf+Z9dDDfRKu3GelAKO0h1dWiW6 zg+zgr0RHPd4mPh9JsPmpsbibRaoqb2ILXjyDo02VINaG89Zw1OcRVFEBmEBx8zRJMWw7CPD 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.165.32; envelope-from=steven.sistare@oracle.com; helo=mx0a-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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755191942400124100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add the cpr-exec migration mode. Usage: qemu-system-$arch -machine aux-ram-share=3Don ... migrate_set_parameter mode cpr-exec migrate_set_parameter cpr-exec-command \ ... -incoming \ migrate -d The migrate command stops the VM, saves state to uri-1, directly exec's a new version of QEMU on the same host, replacing the original process while retaining its PID, and loads state from uri-1. Guest RAM is preserved in place, albeit with new virtual addresses. The new QEMU process is started by exec'ing the command specified by the @cpr-exec-command parameter. The first word of the command is the binary, and the remaining words are its arguments. The command may be a direct invocation of new QEMU, or may be a non-QEMU command that exec's the new QEMU binary. This mode creates a second migration channel that is not visible to the user. At the start of migration, old QEMU saves CPR state to the second channel, and at the end of migration, it tells the main loop to call cpr_exec. New QEMU loads CPR state early, before objects are created. Because old QEMU terminates when new QEMU starts, one cannot stream data between the two, so uri-1 must be a type, such as a file, that accepts all data before old QEMU exits. Otherwise, old QEMU may quietly block writing to the channel. Memory-backend objects must have the share=3Don attribute, but memory-backend-epc is not supported. The VM must be started with the '-machine aux-ram-share=3Don' option, which allows anonymous memory to be transferred in place to the new process. The memfds are kept open across exec by clearing the close-on-exec flag, their values are saved in CPR state, and they are mmap'd in new QEMU. Signed-off-by: Steve Sistare Acked-by: Markus Armbruster --- qapi/migration.json | 25 +++++++++++++++- include/migration/cpr.h | 1 + migration/cpr-exec.c | 74 +++++++++++++++++++++++++++++++++++++++++++= ++++ migration/cpr.c | 26 ++++++++++++++++- migration/migration.c | 10 ++++++- migration/ram.c | 1 + migration/vmstate-types.c | 8 +++++ migration/trace-events | 1 + 8 files changed, 143 insertions(+), 3 deletions(-) diff --git a/qapi/migration.json b/qapi/migration.json index ea410fd..cbc90e8 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -694,9 +694,32 @@ # until you issue the `migrate-incoming` command. # # (since 10.0) +# +# @cpr-exec: The migrate command stops the VM, saves state to the +# migration channel, directly exec's a new version of QEMU on the +# same host, replacing the original process while retaining its +# PID, and loads state from the channel. Guest RAM is preserved +# in place. Devices and their pinned pages are also preserved for +# VFIO and IOMMUFD. +# +# Old QEMU starts new QEMU by exec'ing the command specified by +# the @cpr-exec-command parameter. The command may be a direct +# invocation of new QEMU, or may be a non-QEMU command that exec's +# the new QEMU binary. +# +# Because old QEMU terminates when new QEMU starts, one cannot +# stream data between the two, so the channel must be a type, +# such as a file, that accepts all data before old QEMU exits. +# Otherwise, old QEMU may quietly block writing to the channel. +# +# Memory-backend objects must have the share=3Don attribute, but +# memory-backend-epc is not supported. The VM must be started +# with the '-machine aux-ram-share=3Don' option. +# +# (since 10.2) ## { 'enum': 'MigMode', - 'data': [ 'normal', 'cpr-reboot', 'cpr-transfer' ] } + 'data': [ 'normal', 'cpr-reboot', 'cpr-transfer', 'cpr-exec' ] } =20 ## # @ZeroPageDetection: diff --git a/include/migration/cpr.h b/include/migration/cpr.h index aaeec02..e99e48e 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -54,6 +54,7 @@ int cpr_get_fd_param(const char *name, const char *fdname= , int index, bool cpr, QEMUFile *cpr_transfer_output(MigrationChannel *channel, Error **errp); QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp); =20 +void cpr_exec_init(void); QEMUFile *cpr_exec_output(Error **errp); QEMUFile *cpr_exec_input(Error **errp); void cpr_exec_persist_state(QEMUFile *f); diff --git a/migration/cpr-exec.c b/migration/cpr-exec.c index 2c32e9c..7d0429f 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -6,15 +6,20 @@ =20 #include "qemu/osdep.h" #include "qemu/cutils.h" +#include "qemu/error-report.h" #include "qemu/memfd.h" #include "qapi/error.h" #include "io/channel-file.h" #include "io/channel-socket.h" +#include "block/block-global-state.h" +#include "qemu/main-loop.h" #include "migration/cpr.h" #include "migration/qemu-file.h" +#include "migration/migration.h" #include "migration/misc.h" #include "migration/vmstate.h" #include "system/runstate.h" +#include "trace.h" =20 #define CPR_EXEC_STATE_NAME "QEMU_CPR_EXEC_STATE" =20 @@ -92,3 +97,72 @@ QEMUFile *cpr_exec_input(Error **errp) lseek(mfd, 0, SEEK_SET); return qemu_file_new_fd_input(mfd, CPR_EXEC_STATE_NAME); } + +static bool preserve_fd(int fd) +{ + qemu_clear_cloexec(fd); + return true; +} + +static bool unpreserve_fd(int fd) +{ + qemu_set_cloexec(fd); + return true; +} + +static void cpr_exec(char **argv) +{ + MigrationState *s =3D migrate_get_current(); + Error *err =3D NULL; + + /* + * Clear the close-on-exec flag for all preserved fd's. We cannot do = so + * earlier because they should not persist across miscellaneous fork a= nd + * exec calls that are performed during normal operation. + */ + cpr_walk_fd(preserve_fd); + + trace_cpr_exec(); + execvp(argv[0], argv); + + cpr_walk_fd(unpreserve_fd); + + error_setg_errno(&err, errno, "execvp %s failed", argv[0]); + error_report_err(error_copy(err)); + migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); + migrate_set_error(s, err); + + migration_call_notifiers(s, MIG_EVENT_PRECOPY_FAILED, NULL); + + err =3D NULL; + if (!migration_block_activate(&err)) { + /* error was already reported */ + return; + } + + if (runstate_is_live(s->vm_old_state)) { + vm_start(); + } +} + +static int cpr_exec_notifier(NotifierWithReturn *notifier, MigrationEvent = *e, + Error **errp) +{ + MigrationState *s =3D migrate_get_current(); + + if (e->type =3D=3D MIG_EVENT_PRECOPY_DONE) { + assert(s->state =3D=3D MIGRATION_STATUS_COMPLETED); + qemu_system_exec_request(cpr_exec, s->parameters.cpr_exec_command); + } else if (e->type =3D=3D MIG_EVENT_PRECOPY_FAILED) { + cpr_exec_unpersist_state(); + } + return 0; +} + +void cpr_exec_init(void) +{ + static NotifierWithReturn exec_notifier; + + migration_add_notifier_mode(&exec_notifier, cpr_exec_notifier, + MIG_MODE_CPR_EXEC); +} diff --git a/migration/cpr.c b/migration/cpr.c index 021bd6a..2078d05 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -198,6 +198,8 @@ int cpr_state_save(MigrationChannel *channel, Error **e= rrp) if (mode =3D=3D MIG_MODE_CPR_TRANSFER) { g_assert(channel); f =3D cpr_transfer_output(channel, errp); + } else if (mode =3D=3D MIG_MODE_CPR_EXEC) { + f =3D cpr_exec_output(errp); } else { return 0; } @@ -215,6 +217,10 @@ int cpr_state_save(MigrationChannel *channel, Error **= errp) return ret; } =20 + if (migrate_mode() =3D=3D MIG_MODE_CPR_EXEC) { + cpr_exec_persist_state(f); + } + /* * Close the socket only partially so we can later detect when the oth= er * end closes by getting a HUP event. @@ -226,6 +232,12 @@ int cpr_state_save(MigrationChannel *channel, Error **= errp) return 0; } =20 +static bool unpreserve_fd(int fd) +{ + qemu_set_cloexec(fd); + return true; +} + int cpr_state_load(MigrationChannel *channel, Error **errp) { int ret; @@ -237,6 +249,12 @@ int cpr_state_load(MigrationChannel *channel, Error **= errp) mode =3D MIG_MODE_CPR_TRANSFER; cpr_set_incoming_mode(mode); f =3D cpr_transfer_input(channel, errp); + } else if (cpr_exec_has_state()) { + mode =3D MIG_MODE_CPR_EXEC; + f =3D cpr_exec_input(errp); + if (channel) { + warn_report("ignoring cpr channel for migration mode cpr-exec"= ); + } } else { return 0; } @@ -245,6 +263,7 @@ int cpr_state_load(MigrationChannel *channel, Error **e= rrp) } =20 trace_cpr_state_load(MigMode_str(mode)); + cpr_set_incoming_mode(mode); =20 v =3D qemu_get_be32(f); if (v !=3D QEMU_CPR_FILE_MAGIC) { @@ -266,6 +285,11 @@ int cpr_state_load(MigrationChannel *channel, Error **= errp) return ret; } =20 + if (migrate_mode() =3D=3D MIG_MODE_CPR_EXEC) { + /* Set cloexec to prevent fd leaks from fork until the next cpr-ex= ec */ + cpr_walk_fd(unpreserve_fd); + } + /* * Let the caller decide when to close the socket (and generate a HUP = event * for the sending side). @@ -286,7 +310,7 @@ void cpr_state_close(void) bool cpr_incoming_needed(void *opaque) { MigMode mode =3D migrate_mode(); - return mode =3D=3D MIG_MODE_CPR_TRANSFER; + return mode =3D=3D MIG_MODE_CPR_TRANSFER || mode =3D=3D MIG_MODE_CPR_E= XEC; } =20 /* diff --git a/migration/migration.c b/migration/migration.c index 271c521..d604284 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -333,6 +333,7 @@ void migration_object_init(void) =20 ram_mig_init(); dirty_bitmap_mig_init(); + cpr_exec_init(); =20 /* Initialize cpu throttle timers */ cpu_throttle_init(); @@ -1797,7 +1798,8 @@ bool migrate_mode_is_cpr(MigrationState *s) { MigMode mode =3D s->parameters.mode; return mode =3D=3D MIG_MODE_CPR_REBOOT || - mode =3D=3D MIG_MODE_CPR_TRANSFER; + mode =3D=3D MIG_MODE_CPR_TRANSFER || + mode =3D=3D MIG_MODE_CPR_EXEC; } =20 int migrate_init(MigrationState *s, Error **errp) @@ -2146,6 +2148,12 @@ static bool migrate_prepare(MigrationState *s, bool = resume, Error **errp) return false; } =20 + if (migrate_mode() =3D=3D MIG_MODE_CPR_EXEC && + !s->parameters.has_cpr_exec_command) { + error_setg(errp, "cpr-exec mode requires setting cpr-exec-command"= ); + return false; + } + if (migration_is_blocked(errp)) { return false; } diff --git a/migration/ram.c b/migration/ram.c index 7208bc1..6730a41 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -228,6 +228,7 @@ bool migrate_ram_is_ignored(RAMBlock *block) MigMode mode =3D migrate_mode(); return !qemu_ram_is_migratable(block) || mode =3D=3D MIG_MODE_CPR_TRANSFER || + mode =3D=3D MIG_MODE_CPR_EXEC || (migrate_ignore_shared() && qemu_ram_is_shared(block) && qemu_ram_is_named_file(block)); } diff --git a/migration/vmstate-types.c b/migration/vmstate-types.c index 741a588..1aa0573 100644 --- a/migration/vmstate-types.c +++ b/migration/vmstate-types.c @@ -321,6 +321,10 @@ static int get_fd(QEMUFile *f, void *pv, size_t size, const VMStateField *field) { int32_t *v =3D pv; + if (migrate_mode() =3D=3D MIG_MODE_CPR_EXEC) { + qemu_get_sbe32s(f, v); + return 0; + } *v =3D qemu_file_get_fd(f); return 0; } @@ -329,6 +333,10 @@ static int put_fd(QEMUFile *f, void *pv, size_t size, const VMStateField *field, JSONWriter *vmdesc) { int32_t *v =3D pv; + if (migrate_mode() =3D=3D MIG_MODE_CPR_EXEC) { + qemu_put_sbe32s(f, v); + return 0; + } return qemu_file_put_fd(f, *v); } =20 diff --git a/migration/trace-events b/migration/trace-events index 706db97..e8edd1f 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -354,6 +354,7 @@ cpr_state_save(const char *mode) "%s mode" cpr_state_load(const char *mode) "%s mode" cpr_transfer_input(const char *path) "%s" cpr_transfer_output(const char *path) "%s" +cpr_exec(void) "" =20 # block-dirty-bitmap.c send_bitmap_header_enter(void) "" --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755191905; cv=none; d=zohomail.com; s=zohoarc; b=CTUUdPpAAtd6M8UjUa7LhAcrHeCP5t2MvUXdTv04khtctZ649LhBfCQ4YsWV5LrAO0wGWcmjCkVW0iHhKgwtNg8KhvcRwfbUSrvOr6IatWUs+GDmUkoJoZNMRQC/1qkjmVhpJ2pNh3P0My5nK3/nscc07oUbtByo3GYM9sRnpXE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755191905; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lo6X3UMp0cHGTVVBmKXC6tE1Dq+dM5ocqlmIJ3zKhLY=; b=Yer7U2Yd8ktw0LUk+FRp2IxKxBWTLO9sPJ/FfnOa3ylasksygSdxkzURvdVN7HwdjcLRLqE3iSoZBVUWuxkP96aGrdou8ruYBlDEQ+qNieah63Utwbmai0FLrsbCP7hnhnHbqSy2giHYiLMAV0bLLk1X7iL8n6RV1fnf9OjlNME= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755191905511706.5466254844423; Thu, 14 Aug 2025 10:18:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umba9-0005Vg-T8; Thu, 14 Aug 2025 13:17:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba8-0005Ug-F5 for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:40 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba6-0002qm-3I for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:40 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECg3mj028292; Thu, 14 Aug 2025 17:17:35 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48guchayyh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:35 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EGYax4009640; Thu, 14 Aug 2025 17:17:34 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs35-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:34 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuM038225; Thu, 14 Aug 2025 17:17:34 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-9; Thu, 14 Aug 2025 17:17:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=lo6X3UMp0cHGTVVBmKXC6tE1Dq+dM5ocqlmIJ3zKhLY=; b= AYTXthg3luew6B/VqSyP1ga/MhIToHnauNqLRLIEOYvEFNN33gpRPtvcStpI4Jga 6ZrJEPq6QF6pe0qiBOJeyqmogQw19WaDoikaikdXeaOXgMbIXgpR0gISXWhCd46d uZpG17W0Y0T0ZmsDB7wZkXtiJZgOwpsDW1jucs1CGM2vsX23gfM3rQR8/kgONsUv NqL6GJo6oGvxMc9lJjEXQzFrgJfZwLmud/frJ49ddS916woUW31+OHm00QYXirGT Db2mfNopM5/6WuqDzlyqU48xpgE8Ah21vutLBV/+xepBnN0ts7P8l/yrc4gJBU9R 74YFRf5D3/RSt/94S1tk9A== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 8/9] migration: cpr-exec docs Date: Thu, 14 Aug 2025 10:17:22 -0700 Message-Id: <1755191843-283480-9-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Authority-Analysis: v=2.4 cv=Eo/SrTcA c=1 sm=1 tr=0 ts=689e1a2f b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=OdD1Jf7BiRZ0qi4wpjQA:9 cc=ntf awl=host:12069 X-Proofpoint-ORIG-GUID: BDfB8vq0eHI17upq3L1nbcQREcnxIcnH X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfX2g81twGbQLWx hSEtIzav3Eo6oUJhpJyjaECk00rXS+WTFT0nYZ4squlVB6FBAcCsFJetk6nsf3Kn/zj2kuY9MMR 5PC1reh77eOJtVSKRBjXrIJzeTorF1wLLQfvajlj54SbriXFCtb6cghm50E+6qzcf1wGJhzZlih pVHHK8QTpPiY2Zuk5DDcYRzYYYF6YkojLsxnbLNDoVMSI2eVTWqNjaHy6LOHtatOKVWgJhAWDD/ vf/ANNRSaVn6tHD3UmsKLR+4NGmf2qN8kHq1eWsbjDeAbxur5Gp5r9wz1gOXcAhRFVicKGMNwa6 n7UsfHD2GHF5F7IdqETfGsLqsFB1wRnqoC3SPBlCJQKaSRgju4oxOlUsfkuYvJZCUH1ikYcGazU 74IreZc5VhWvY3O/XJFfUO8ySK5zDcNZeYt225Pu73UAISaqIogRPhjMOWrO/1yX/rN7GxpE X-Proofpoint-GUID: BDfB8vq0eHI17upq3L1nbcQREcnxIcnH 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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755191906599116601 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Update developer documentation for cpr-exec mode. Signed-off-by: Steve Sistare Reviewed-by: Fabiano Rosas --- docs/devel/migration/CPR.rst | 103 +++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/docs/devel/migration/CPR.rst b/docs/devel/migration/CPR.rst index 0a0fd4f..abc9a90 100644 --- a/docs/devel/migration/CPR.rst +++ b/docs/devel/migration/CPR.rst @@ -5,7 +5,7 @@ CPR is the umbrella name for a set of migration modes in wh= ich the VM is migrated to a new QEMU instance on the same host. It is intended for use when the goal is to update host software components that run the VM, such as QEMU or even the host kernel. At this time, -the cpr-reboot and cpr-transfer modes are available. +the cpr-reboot, cpr-transfer, and cpr-exec modes are available. =20 Because QEMU is restarted on the same host, with access to the same local devices, CPR is allowed in certain cases where normal migration @@ -324,3 +324,104 @@ descriptors from old to new QEMU. In the future, des= criptors for vhost, and char devices could be transferred, preserving those devices and their kernel state without interruption, even if they do not explicitly support live migration. + +cpr-exec mode +------------- + +In this mode, QEMU stops the VM, writes VM state to the migration +URI, and directly exec's a new version of QEMU on the same host, +replacing the original process while retaining its PID. Guest RAM is +preserved in place, albeit with new virtual addresses. The user +completes the migration by specifying the ``-incoming`` option, and +by issuing the ``migrate-incoming`` command if necessary; see details +below. + +This mode supports VFIO/IOMMUFD devices by preserving device descriptors +and hence kernel state across the exec, even for devices that do not +support live migration. + +Because the old and new QEMU instances are not active concurrently, +the URI cannot be a type that streams data from one instance to the +other. + +Usage +^^^^^ + +Arguments for the new QEMU process are taken from the +@cpr-exec-args parameter. The first argument should be the +path of a new QEMU binary, or a prefix command that exec's the +new QEMU binary, and the arguments should include the ''-incoming'' +option. + +Memory backend objects must have the ``share=3Don`` attribute. +The VM must be started with the ``-machine aux-ram-share=3Don`` option. + +Outgoing: + * Set the migration mode parameter to ``cpr-exec``. + * Set the ``cpr-exec-args`` parameter. + * Issue the ``migrate`` command. It is recommended the the URI be + a ``file`` type, but one can use other types such as ``exec``, + provided the command captures all the data from the outgoing side, + and provides all the data to the incoming side. + +Incoming: + * You do not need to explicitly start new QEMU. It is started as + a side effect of the migrate command above. + * If the VM was running when the outgoing ``migrate`` command was + issued, then QEMU automatically resumes VM execution. + +Example 1: incoming URI +^^^^^^^^^^^^^^^^^^^^^^^ + +In these examples, we simply restart the same version of QEMU, but in +a real scenario one would set a new QEMU binary path in cpr-exec-args. + +:: + + # qemu-kvm -monitor stdio + -object memory-backend-memfd,id=3Dram0,size=3D4G + -machine memory-backend=3Dram0 + -machine aux-ram-share=3Don + ... + + QEMU 10.2.50 monitor - type 'help' for more information + (qemu) info status + VM status: running + (qemu) migrate_set_parameter mode cpr-exec + (qemu) migrate_set_parameter cpr-exec-args qemu-kvm ... -incoming file:v= m.state + (qemu) migrate -d file:vm.state + (qemu) QEMU 10.2.50 monitor - type 'help' for more information + (qemu) info status + VM status: running + +Example 2: incoming defer +^^^^^^^^^^^^^^^^^^^^^^^^^ +:: + + # qemu-kvm -monitor stdio + -object memory-backend-memfd,id=3Dram0,size=3D4G + -machine memory-backend=3Dram0 + -machine aux-ram-share=3Don + ... + + QEMU 10.2.50 monitor - type 'help' for more information + (qemu) info status + VM status: running + (qemu) migrate_set_parameter mode cpr-exec + (qemu) migrate_set_parameter cpr-exec-args qemu-kvm ... -incoming defer + (qemu) migrate -d file:vm.state + (qemu) QEMU 10.2.50 monitor - type 'help' for more information + (qemu) info status + status: paused (inmigrate) + (qemu) migrate_incoming file:vm.state + (qemu) info status + VM status: running + +Caveats +^^^^^^^ + +cpr-exec mode may not be used with postcopy, background-snapshot, +or COLO. + +cpr-exec mode requires permission to use the exec system call, which +is denied by certain sandbox options, such as spawn. --=20 1.8.3.1 From nobody Sat Nov 15 05:23:06 2025 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=reject dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1755191919; cv=none; d=zohomail.com; s=zohoarc; b=TfG+klLM15Jpa4X88TNOaCqJuJPOpihGlzalAKRZ3jp2Av181JRQGlj2iaDhA+R4J4PyQY6WCf6vIwE1Tna5B1W8UREN7gletmZRmgqzdRb9P3s2wrbOW0Q27lmn7vLFaV5q66o0LU1CeWX1275t2YGcUSgaXXPxckMJwaONl58= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755191919; h=Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=h4XrkcKhSJInpvoA+ypikKSHM433+/9u2Pw/jSXyyr4=; b=ih2j7oY46es+liIA05sbBe6jsZjZBdySP7Y1UecsY6qBf+dgARN/ZSt/jOaKIbrjo7mX14aTBYgI4N99Qci8yWYWuKb+jObc4UjlzVz431DM5g0pycQzmtXLDmgWkYo4sZ+AtaT78ZKulZmokVq4wpfuf0tZT0o+W/Cs2XnKpWs= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1755191919226874.3492540184557; Thu, 14 Aug 2025 10:18:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umbaB-0005X7-7R; Thu, 14 Aug 2025 13:17:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umbaA-0005Vq-0J for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:42 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umba7-0002rL-E4 for qemu-devel@nongnu.org; Thu, 14 Aug 2025 13:17:41 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57ECg2W3020129; Thu, 14 Aug 2025 17:17:37 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 48dvx4jhar-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:37 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 57EH1epn009691; Thu, 14 Aug 2025 17:17:36 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 48dvskbs3w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2025 17:17:35 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 57EHGwuO038225; Thu, 14 Aug 2025 17:17:35 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 48dvskbrx5-10; Thu, 14 Aug 2025 17:17:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :date:from:in-reply-to:message-id:references:subject:to; s= corp-2025-04-25; bh=h4XrkcKhSJInpvoA+ypikKSHM433+/9u2Pw/jSXyyr4=; b= L/iphArO9+4zdQRk+HrMtpFVkRDmMbzibtQv5gDFAxc68+/LAoMkcKDfSd1NwlmD hxDB2Cs/5nJfoNtXS9fypvbpBdpJo1CC5JtnlcEobvXYnBE0mc9LaagUKJj1xYgc wrZuGJ3nXecFera1Fa3qQ7iD2wHgi0EhQIPigX19evn8BHktzy+7bAx3eqxd/VQZ 8TvpwyX7/TIdPcCEICXxTYRGYCiSWb47cEcTAKtVwa6ak9V3NCxpdpM+g5CIQdrt I48R50XqDtRofnkIAv45CUNrokEfRi6FJwz/z1doQseomwiya+SSK+q6LvG8zI86 xp54pBwHiD3jtt1hDXsKCA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Fabiano Rosas , Peter Xu , Markus Armbruster , Paolo Bonzini , Eric Blake , "Dr. David Alan Gilbert" , Steve Sistare Subject: [PATCH V3 9/9] vfio: cpr-exec mode Date: Thu, 14 Aug 2025 10:17:23 -0700 Message-Id: <1755191843-283480-10-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> References: <1755191843-283480-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-13_02,2025-08-14_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2507300000 definitions=main-2508140147 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODE0MDE0OCBTYWx0ZWRfX4Cu8YJVeBv+V P6qA6ONr3JUs9VJaXgLtoNU25bJRzc1fdVEZZ/t5QyVy9jqzGxKyvrHjOz+8Yoo4cV2ZrPBVxsw zjcrHQLrNk5bAITazr+eU94YW/XLuF+PMPe5MhF9DILQYV09nWGaSf7g1VthIGI/Bcv/5lj9LQS NjYgg4l8U6kNRP/03moh0sH/yQsEgpySArIMrz/4lELg+MCm7bCNMVLybJYzY6ZG69X9YJNGEAG bTxifmLDuzoWsusmWuWBJsgQJberazj5Ke5DX/KpkGuBHZ95GcXEml3VWt05cHv5VS6MEFgnz7T 0HroTi+Dun/8Gkgsu2LUGiq80mrw+02+v3cIMNQzDMTScN0kzfQpfA4AI+GXaIm9BJFYDE+REDN a4swJwAbfv9uVHlqOE8UPqkHly5crwrxB6dLlB0LT8l+9CYYVSOJ5tgVB+dUpttB9O3u0eYw X-Authority-Analysis: v=2.4 cv=eIsTjGp1 c=1 sm=1 tr=0 ts=689e1a31 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=2OwXVqhp2XgA:10 a=yPCof4ZbAAAA:8 a=V7xkzyaGXGj9tJ5OYwUA:9 cc=ntf awl=host:12069 X-Proofpoint-GUID: IZH-R1vqt2FN-ygYx45DO59_nguYSEGR X-Proofpoint-ORIG-GUID: IZH-R1vqt2FN-ygYx45DO59_nguYSEGR 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.165.32; envelope-from=steven.sistare@oracle.com; helo=mx0a-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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1755191920037124100 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All blockers and notifiers for cpr-transfer mode also apply to cpr-exec. Signed-off-by: Steve Sistare --- hw/vfio/container.c | 3 ++- hw/vfio/cpr-iommufd.c | 3 ++- hw/vfio/cpr-legacy.c | 9 +++++---- hw/vfio/cpr.c | 13 +++++++------ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/hw/vfio/container.c b/hw/vfio/container.c index 3e13fea..735b769 100644 --- a/hw/vfio/container.c +++ b/hw/vfio/container.c @@ -993,7 +993,8 @@ static bool vfio_legacy_attach_device(const char *name,= VFIODevice *vbasedev, error_setg(&vbasedev->cpr.mdev_blocker, "CPR does not support vfio mdev %s", vbasedev->name); if (migrate_add_blocker_modes(&vbasedev->cpr.mdev_blocker, errp, - MIG_MODE_CPR_TRANSFER, -1) < 0) { + MIG_MODE_CPR_TRANSFER, MIG_MODE_CPR_= EXEC, + -1) < 0) { goto hiod_unref_exit; } } diff --git a/hw/vfio/cpr-iommufd.c b/hw/vfio/cpr-iommufd.c index 148a06d..e1f1854 100644 --- a/hw/vfio/cpr-iommufd.c +++ b/hw/vfio/cpr-iommufd.c @@ -159,7 +159,8 @@ bool vfio_iommufd_cpr_register_iommufd(IOMMUFDBackend *= be, Error **errp) =20 if (!vfio_cpr_supported(be, cpr_blocker)) { return migrate_add_blocker_modes(cpr_blocker, errp, - MIG_MODE_CPR_TRANSFER, -1) =3D=3D= 0; + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1) =3D=3D 0; } =20 vmstate_register(NULL, -1, &iommufd_cpr_vmstate, be); diff --git a/hw/vfio/cpr-legacy.c b/hw/vfio/cpr-legacy.c index 553b203..7c73439 100644 --- a/hw/vfio/cpr-legacy.c +++ b/hw/vfio/cpr-legacy.c @@ -176,16 +176,17 @@ bool vfio_legacy_cpr_register_container(VFIOContainer= *container, Error **errp) =20 if (!vfio_cpr_supported(container, cpr_blocker)) { return migrate_add_blocker_modes(cpr_blocker, errp, - MIG_MODE_CPR_TRANSFER, -1) =3D=3D= 0; + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1) =3D=3D 0; } =20 vfio_cpr_add_kvm_notifier(); =20 vmstate_register(NULL, -1, &vfio_container_vmstate, container); =20 - migration_add_notifier_mode(&container->cpr.transfer_notifier, - vfio_cpr_fail_notifier, - MIG_MODE_CPR_TRANSFER); + migration_add_notifier_modes(&container->cpr.transfer_notifier, + vfio_cpr_fail_notifier, + MIG_MODE_CPR_TRANSFER, MIG_MODE_CPR_EXEC,= -1); return true; } =20 diff --git a/hw/vfio/cpr.c b/hw/vfio/cpr.c index a831243..a176971 100644 --- a/hw/vfio/cpr.c +++ b/hw/vfio/cpr.c @@ -195,9 +195,10 @@ static int vfio_cpr_kvm_close_notifier(NotifierWithRet= urn *notifier, void vfio_cpr_add_kvm_notifier(void) { if (!kvm_close_notifier.notify) { - migration_add_notifier_mode(&kvm_close_notifier, - vfio_cpr_kvm_close_notifier, - MIG_MODE_CPR_TRANSFER); + migration_add_notifier_modes(&kvm_close_notifier, + vfio_cpr_kvm_close_notifier, + MIG_MODE_CPR_TRANSFER, MIG_MODE_CPR_E= XEC, + -1); } } =20 @@ -282,9 +283,9 @@ static int vfio_cpr_pci_notifier(NotifierWithReturn *no= tifier, =20 void vfio_cpr_pci_register_device(VFIOPCIDevice *vdev) { - migration_add_notifier_mode(&vdev->cpr.transfer_notifier, - vfio_cpr_pci_notifier, - MIG_MODE_CPR_TRANSFER); + migration_add_notifier_modes(&vdev->cpr.transfer_notifier, + vfio_cpr_pci_notifier, + MIG_MODE_CPR_TRANSFER, MIG_MODE_CPR_EXEC,= -1); } =20 void vfio_cpr_pci_unregister_device(VFIOPCIDevice *vdev) --=20 1.8.3.1