From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306535; cv=none; d=zohomail.com; s=zohoarc; b=hts0J5DPb4P6O6ZMK1jXNfDn4GVgu0JT1BceU3wldmiUws3GMC8XWBp0cVBTMCG7qEdwA0UXgu14IOilpLsvMSCcZeaAJ18LaUAYSPojxhOv2g7Sr42A+07bCO4XFuLHWvfFyUNDrlInBxtH6WyShX63KQ3YCNjoFnvdm5jLWNc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306535; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=oByWwOFjmMXP2lq9nR3vr0EH0cZO0Ixf74XaqBeotJk=; b=CVOTs0fbNzRqWLRnccLI7e+TM7kROGo2YiqEQCb/UJewuEdfOGEl+ofY5satwNmUzn85DbzBeqbhDQMVbLNzqbHv+WRkZzgAPUBAds9y71dfIh6z/O0oKMTum5eJi8Xwfw4+W4LE8QcyZ2CuGKGQ7YNSseSRHIjz8e4W+f91gRk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306535631309.30929954630506; Wed, 15 Jun 2022 08:22:15 -0700 (PDT) Received: from localhost ([::1]:37126 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UqU-0004og-F7 for importer@patchew.org; Wed, 15 Jun 2022 11:22:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47944) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UP6-000834-P6 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:57 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:52262) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UP5-0001Af-58 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:56 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE7fcx002108; Wed, 15 Jun 2022 14:52:31 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsgw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:31 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7Bw023114; Wed, 15 Jun 2022 14:52:30 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpge-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:30 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMj018501; Wed, 15 Jun 2022 14:52:29 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-2; Wed, 15 Jun 2022 14:52:29 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=oByWwOFjmMXP2lq9nR3vr0EH0cZO0Ixf74XaqBeotJk=; b=a3V35jXbALra35HywiujXH+a6TfZ2zCn94hhVT+BnKD3pxqj6NSob2uGwnuqLxm4uDkt ZusD1bmPd+vAsrxc6hTQmReJuCAmAhJTD4yfCVvpN22erOhlOojx7elKgR1vp/HKoTN3 d1DFBB3KVJiPdf2T8UC+1NJTdqbs5Ykrimw5ornLnimJbXGVcuk2b8QNTSnhHd44xSRt 0+26yGbpQ1SeIcUqdp/jRP8xrt02mf7YX8R291B5CQWQeL74PluWo/YgdIKSUCAPhbsc TeXSfNrusI6BkRXfDeEDVtRHUPhrAytttss5UqcVWgWSpB6kyperfn8kekVHAEJO2fNC 8A== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 01/39] migration: fix populate_vfio_info Date: Wed, 15 Jun 2022 07:51:48 -0700 Message-Id: <1655304746-102776-2-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: RIwuHSNm3aEBh6v-LondGMHQWgCoC44R X-Proofpoint-GUID: RIwuHSNm3aEBh6v-LondGMHQWgCoC44R Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306536452100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Include CONFIG_DEVICES so that populate_vfio_info is instantiated for CONFIG_VFIO. Signed-off-by: Steve Sistare Reviewed-by: Marc-Andr=C3=A9 Lureau --- migration/target.c | 1 + 1 file changed, 1 insertion(+) diff --git a/migration/target.c b/migration/target.c index 907ebf0..a0991bc 100644 --- a/migration/target.c +++ b/migration/target.c @@ -8,6 +8,7 @@ #include "qemu/osdep.h" #include "qapi/qapi-types-migration.h" #include "migration.h" +#include CONFIG_DEVICES =20 #ifdef CONFIG_VFIO #include "hw/vfio/vfio-common.h" --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655304889; cv=none; d=zohomail.com; s=zohoarc; b=nN2wFdfMQKjsL7qboIdHrOYegGFzcTb7ZBuaTsRDBPlexYIb9ZtkkpHV3M09JepXQHpsbg7vRq6kX8Jp2AmqO03rXVqrWgA1PjNKql7K9ogF/k5vbbse5XnOjj5536U5PNXA/5Sjc3jc+30WJqAKLsiHufB4Gvmv4geA7J34FHA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655304889; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=0hwhAnCTAsnyp97yEcjJRHIWRLmHxXmp9NPtfA8gELQ=; b=MvigCU9XofMj6UBuusMFSpMopc7y0Qj9P8905vc2aj0nZEFt8Pvl1ul/KphsvFtNMCZiKhMSxFmdwVBQoJEN6cV8MjoCt1H1iWzFw2lLOmZA0eYxKYjcHAm/vsMG7Pc1oTjuIUWq8BHTUD5LocobdeHxqFle+Mlla3Zyczj3bK4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655304889106968.5741189859225; Wed, 15 Jun 2022 07:54:49 -0700 (PDT) Received: from localhost ([::1]:55898 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UPw-0000c2-0g for importer@patchew.org; Wed, 15 Jun 2022 10:54:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47248) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO5-00064C-Kj for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:53 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:58248) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO2-0000yy-9A for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:53 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FEE6kK002105; Wed, 15 Jun 2022 14:52:32 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsh1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:32 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7dv023149; Wed, 15 Jun 2022 14:52:31 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpgq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:31 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMl018501; Wed, 15 Jun 2022 14:52:30 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-3; Wed, 15 Jun 2022 14:52:30 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=0hwhAnCTAsnyp97yEcjJRHIWRLmHxXmp9NPtfA8gELQ=; b=OPq28qa+1bjmw1bauON3Ql0heif7FphvxM/5g7UXGhymjNUMaVekyMK+mjwvxeC4yTbm hb4kdcr0RGZizcu2Kq93nV2Y2Rcb78sTfvh7Zm4qYi9itLE0k0GAZQwfVRj3KmBegw5l rSQAChsYIfQKBjekfuG9wDQ5kgcXil/XIJgZPkKfHpB6GNWaCuxsG4f8Oe2L1aBMET8W bFN3af2yKtoTl7vJxWaqHESY+iIJxMr4jTzHPyf6Ztg0bdB472qseN8T/fAKDVc6vFD6 Bz4FayZciClCLKWsbMyl8Xj9yPfQ9wJjxT3Q1UYt/XXHJltvCvZAz8rgqBZsSHnKoC5V /w== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 02/39] migration: qemu file wrappers Date: Wed, 15 Jun 2022 07:51:49 -0700 Message-Id: <1655304746-102776-3-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: Q-ebxbjF2OLyrkSZvAqNoFt0NR5eX9gI X-Proofpoint-GUID: Q-ebxbjF2OLyrkSZvAqNoFt0NR5eX9gI Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655304890782100003 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add qemu_file_open and qemu_fd_open to create QEMUFile objects for unix files and file descriptors. Signed-off-by: Steve Sistare --- migration/qemu-file-channel.c | 36 ++++++++++++++++++++++++++++++++++++ migration/qemu-file-channel.h | 6 ++++++ 2 files changed, 42 insertions(+) diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c index bb5a575..cc5aebc 100644 --- a/migration/qemu-file-channel.c +++ b/migration/qemu-file-channel.c @@ -27,8 +27,10 @@ #include "qemu-file.h" #include "io/channel-socket.h" #include "io/channel-tls.h" +#include "io/channel-file.h" #include "qemu/iov.h" #include "qemu/yank.h" +#include "qapi/error.h" #include "yank_functions.h" =20 =20 @@ -192,3 +194,37 @@ QEMUFile *qemu_fopen_channel_output(QIOChannel *ioc) object_ref(OBJECT(ioc)); return qemu_fopen_ops(ioc, &channel_output_ops, true); } + +QEMUFile *qemu_fopen_file(const char *path, int flags, int mode, + const char *name, Error **errp) +{ + g_autoptr(QIOChannelFile) fioc =3D NULL; + QIOChannel *ioc; + QEMUFile *f; + + if (flags & O_RDWR) { + error_setg(errp, "qemu_fopen_file %s: O_RDWR not supported", path); + return NULL; + } + + fioc =3D qio_channel_file_new_path(path, flags, mode, errp); + if (!fioc) { + return NULL; + } + + ioc =3D QIO_CHANNEL(fioc); + qio_channel_set_name(ioc, name); + f =3D (flags & O_WRONLY) ? qemu_fopen_channel_output(ioc) : + qemu_fopen_channel_input(ioc); + return f; +} + +QEMUFile *qemu_fopen_fd(int fd, bool writable, const char *name) +{ + g_autoptr(QIOChannelFile) fioc =3D qio_channel_file_new_fd(fd); + QIOChannel *ioc =3D QIO_CHANNEL(fioc); + QEMUFile *f =3D writable ? qemu_fopen_channel_output(ioc) : + qemu_fopen_channel_input(ioc); + qio_channel_set_name(ioc, name); + return f; +} diff --git a/migration/qemu-file-channel.h b/migration/qemu-file-channel.h index 0028a09..75fd0ad 100644 --- a/migration/qemu-file-channel.h +++ b/migration/qemu-file-channel.h @@ -29,4 +29,10 @@ =20 QEMUFile *qemu_fopen_channel_input(QIOChannel *ioc); QEMUFile *qemu_fopen_channel_output(QIOChannel *ioc); + +QEMUFile *qemu_fopen_file(const char *path, int flags, int mode, + const char *name, Error **errp); + +QEMUFile *qemu_fopen_fd(int fd, bool writable, const char *name); + #endif --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305102; cv=none; d=zohomail.com; s=zohoarc; b=n0nIL6Ehu+wOZ/8DUvwreN66QjcEB+6x2yJYuv/34BQF0ksDhhNBVpsSnZZOTMSCBPVZ6B0D8efifjxxf/BwpgHiTtSCOHgw+Qk4PvgqFOr2HxhwzvAsDMwaWXkhXb9HOM3nEDyiUgFPnWd0SM/j4Nlkv52BImgc+KOTexGEn5A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305102; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=cCVw1roIOvT9zJ6xa/6LWdkbmcnt8mrbADvUZWKRJcg=; b=C8pZfd9ceQGI0oL4DF7wELRWq/GTG8iDY7HXsq+3CQbI5wS3LpU+9Ydl1Qr3JIU8Mi7l/wed6uUV29GPZeJhRw7XYtWPLPZ+wNZFBmt5zSA53P8Smtb/JB3E4WbxXB+eclcrdfI8Jc8uvCp6Op+UY0PKF0UBjSJFbrTy16BbHis= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305102161200.76147322384406; Wed, 15 Jun 2022 07:58:22 -0700 (PDT) Received: from localhost ([::1]:40236 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UTN-0000al-4d for importer@patchew.org; Wed, 15 Jun 2022 10:58:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47208) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO4-00061u-DT for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:52 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:53752) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO1-0000yI-PN for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:52 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDvkVW002771; Wed, 15 Jun 2022 14:52:33 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tjn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:33 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6QV023072; Wed, 15 Jun 2022 14:52:32 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vph1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:32 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMn018501; Wed, 15 Jun 2022 14:52:31 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-4; Wed, 15 Jun 2022 14:52:31 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=cCVw1roIOvT9zJ6xa/6LWdkbmcnt8mrbADvUZWKRJcg=; b=Rif0i1sn+vyjJtKJheA6qgTzMNPfwnfbOKf9qOsNgXDsx9P4iooq5ONZiqtIKvfExuxk 3gqfSYC4GwYkUAFMvj2rqRAcbwQTxqRzfcW/8mfeX0At4TuXX+0d/WoA6oXa84Yh3Tds OUcAdtsb//b/2oBgk38DPiXD0OKfhnXm6XmvJmArO0U1180ApLBbbU1rcDTz85NdxTMr iQCfMZlXAtGrNMQBxbMlx7yJolMd+w5bu9gQIv/NVeuh+/R931lF7lf4cSJ773jtfc74 1/t8YnqRNhaWRAOyFTxQqGS13M8cS0VlG0eHosoCDZLIwXS7mdZn2SY54GhvwymAq+aX kA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 03/39] migration: simplify savevm Date: Wed, 15 Jun 2022 07:51:50 -0700 Message-Id: <1655304746-102776-4-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: -FCh_8HyIZ5idAE1WPvHInjPyYdJ4IYp X-Proofpoint-ORIG-GUID: -FCh_8HyIZ5idAE1WPvHInjPyYdJ4IYp Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305102686100003 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use qemu_file_open to simplify a few functions in savevm.c. No functional change. Signed-off-by: Steve Sistare Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Marc-Andr=C3=A9 Lureau --- migration/savevm.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index d907689..0b2c5cd 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2931,7 +2931,6 @@ void qmp_xen_save_devices_state(const char *filename,= bool has_live, bool live, Error **errp) { QEMUFile *f; - QIOChannelFile *ioc; int saved_vm_running; int ret; =20 @@ -2945,14 +2944,11 @@ void qmp_xen_save_devices_state(const char *filenam= e, bool has_live, bool live, vm_stop(RUN_STATE_SAVE_VM); global_state_store_running(); =20 - ioc =3D qio_channel_file_new_path(filename, O_WRONLY | O_CREAT | O_TRU= NC, - 0660, errp); - if (!ioc) { + f =3D qemu_fopen_file(filename, O_WRONLY | O_CREAT | O_TRUNC, 0660, + "migration-xen-save-state", errp); + if (!f) { goto the_end; } - qio_channel_set_name(QIO_CHANNEL(ioc), "migration-xen-save-state"); - f =3D qemu_fopen_channel_output(QIO_CHANNEL(ioc)); - object_unref(OBJECT(ioc)); ret =3D qemu_save_device_state(f); if (ret < 0 || qemu_fclose(f) < 0) { error_setg(errp, QERR_IO_ERROR); @@ -2981,7 +2977,6 @@ void qmp_xen_save_devices_state(const char *filename,= bool has_live, bool live, void qmp_xen_load_devices_state(const char *filename, Error **errp) { QEMUFile *f; - QIOChannelFile *ioc; int ret; =20 /* Guest must be paused before loading the device state; the RAM state @@ -2993,14 +2988,11 @@ void qmp_xen_load_devices_state(const char *filenam= e, Error **errp) } vm_stop(RUN_STATE_RESTORE_VM); =20 - ioc =3D qio_channel_file_new_path(filename, O_RDONLY | O_BINARY, 0, er= rp); - if (!ioc) { + f =3D qemu_fopen_file(filename, O_RDONLY | O_BINARY, 0, + "migration-xen-load-state", errp); + if (!f) { return; } - qio_channel_set_name(QIO_CHANNEL(ioc), "migration-xen-load-state"); - f =3D qemu_fopen_channel_input(QIO_CHANNEL(ioc)); - object_unref(OBJECT(ioc)); - ret =3D qemu_loadvm_state(f); qemu_fclose(f); if (ret < 0) { --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655311645; cv=none; d=zohomail.com; s=zohoarc; b=oGpuH/BfL8rI4w54HMUgMngD3TUBU70oQe5n8x2CiinSIhkVUQTiMSSeoDfPkFMsml7gjZ1jTYBn3RBPQEW4vugH3uQWV0x2/S7u+gJS9yT/nfp/7rsTgkfV+ZTEyKOW5u6HnsFzO1fm3ErgUEkyj0u4ZcaY977qgENPlgB1+Zw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655311645; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=sGF/hoUS2Ixg7lqKUCEQZ8cExPMGnWqsW/teGPcQQ7I=; b=FQv/kzlonoy4YRQ3z2r0Q8y6F5VS9OAalw7irQtEL7JaAP52yjX4WMiiCV27T60eBtex2Nym9Rle4+kEEv8FMjVSWpX2wVIb/S0ODcuszYCPOPNX7XiNX1kOHWFX6hoxSNTwMUqRXwQq2hdXFUyzZqgbi7SuZig/f4imspgTOJE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655311645516384.27371129449443; Wed, 15 Jun 2022 09:47:25 -0700 (PDT) Received: from localhost ([::1]:46362 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1WAt-0002JK-GY for importer@patchew.org; Wed, 15 Jun 2022 12:47:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1Vwe-0003xE-TN for qemu-devel@nongnu.org; Wed, 15 Jun 2022 12:32:42 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:50510) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1Vwb-0002Au-71 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 12:32:40 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gvf025874; Wed, 15 Jun 2022 14:52:34 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxdb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:34 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ733023089; Wed, 15 Jun 2022 14:52:33 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vphf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:33 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMp018501; Wed, 15 Jun 2022 14:52:32 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-5; Wed, 15 Jun 2022 14:52:32 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=sGF/hoUS2Ixg7lqKUCEQZ8cExPMGnWqsW/teGPcQQ7I=; b=ib+rhH9TkCXDfTsXonJPEYWarcmdVxhEJxxWae1Zdg2dKwm69zLaEUAfIT+Z07OV/T1A nalG4gsBTV+xWgq1iJ3walxQ74lPKq/BeRI+/hoJUUTGpGZU2GTZtC7A+MYT+6cOWuVA A1G+/qTLlSXf/GZ/+PUYDN5PZaDlAB4xIkPpOJ62fZ2UX32Y3hcXFVFI5xVk5fHQryq2 /8aIZqLEgBGV0XszMAYVpQXoPaZXiODYQpUvALo0zy8n3pYTocsIVICaZGPCx+QPfeqa 3h9knUW37BMhVOmGRlGXOoQU8zOAHgn3N6inYe3gV2n/+si4HGhp2vbWls1z2Iy3kdTV zA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 04/39] memory: RAM_ANON flag Date: Wed, 15 Jun 2022 07:51:51 -0700 Message-Id: <1655304746-102776-5-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: 7j5n_AbGmqHc4nXvieLNMfYUuNtmkaDO X-Proofpoint-ORIG-GUID: 7j5n_AbGmqHc4nXvieLNMfYUuNtmkaDO Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_FILL_THIS_FORM_SHORT=0.01, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655311648263100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" A memory-backend-ram or a memory-backend-memfd block with the RAM_SHARED flag set is not migrated when migrate_ignore_shared() is true, but this is wrong, because it has no named backing store, and its contents will be lost. Define a new flag RAM_ANON to distinguish this case. Cpr will also test this flag, for similar reasons. Signed-off-by: Steve Sistare --- backends/hostmem-epc.c | 2 +- backends/hostmem-memfd.c | 1 + backends/hostmem-ram.c | 1 + include/exec/memory.h | 3 +++ include/exec/ram_addr.h | 1 + migration/ram.c | 3 ++- softmmu/physmem.c | 12 +++++++++--- 7 files changed, 18 insertions(+), 5 deletions(-) diff --git a/backends/hostmem-epc.c b/backends/hostmem-epc.c index 037292d..cb06255 100644 --- a/backends/hostmem-epc.c +++ b/backends/hostmem-epc.c @@ -37,7 +37,7 @@ sgx_epc_backend_memory_alloc(HostMemoryBackend *backend, = Error **errp) } =20 name =3D object_get_canonical_path(OBJECT(backend)); - ram_flags =3D (backend->share ? RAM_SHARED : 0) | RAM_PROTECTED; + ram_flags =3D (backend->share ? RAM_SHARED : 0) | RAM_PROTECTED | MAP_= ANON; memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name, backend->size, ram_flags, fd, 0, errp); diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index 3fc85c3..c9d8001 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -55,6 +55,7 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Er= ror **errp) name =3D host_memory_backend_get_name(backend); ram_flags =3D backend->share ? RAM_SHARED : 0; ram_flags |=3D backend->reserve ? 0 : RAM_NORESERVE; + ram_flags |=3D RAM_ANON; memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name, backend->size, ram_flags, fd, 0, errp); g_free(name); diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c index b8e55cd..5e80149 100644 --- a/backends/hostmem-ram.c +++ b/backends/hostmem-ram.c @@ -30,6 +30,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Erro= r **errp) name =3D host_memory_backend_get_name(backend); ram_flags =3D backend->share ? RAM_SHARED : 0; ram_flags |=3D backend->reserve ? 0 : RAM_NORESERVE; + ram_flags |=3D RAM_ANON; memory_region_init_ram_flags_nomigrate(&backend->mr, OBJECT(backend), = name, backend->size, ram_flags, errp); g_free(name); diff --git a/include/exec/memory.h b/include/exec/memory.h index f1c1945..0daddd7 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -203,6 +203,9 @@ typedef struct IOMMUTLBEvent { /* RAM that isn't accessible through normal means. */ #define RAM_PROTECTED (1 << 8) =20 +/* RAM has no name outside the qemu process. */ +#define RAM_ANON (1 << 9) + static inline void iommu_notifier_init(IOMMUNotifier *n, IOMMUNotify fn, IOMMUNotifierFlag flags, hwaddr start, hwaddr end, diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index f3e0c78..56188b8 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -94,6 +94,7 @@ static inline unsigned long int ramblock_recv_bitmap_offs= et(void *host_addr, } =20 bool ramblock_is_pmem(RAMBlock *rb); +bool ramblock_is_anon(RAMBlock *rb); =20 long qemu_minrampagesize(void); long qemu_maxrampagesize(void); diff --git a/migration/ram.c b/migration/ram.c index 5f5e37f..5cdb93d 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -164,7 +164,8 @@ out: bool ramblock_is_ignored(RAMBlock *block) { return !qemu_ram_is_migratable(block) || - (migrate_ignore_shared() && qemu_ram_is_shared(block)); + (migrate_ignore_shared() && qemu_ram_is_shared(block) && + !ramblock_is_anon(block)); } =20 #undef RAMBLOCK_FOREACH diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 657841e..0f1ce28 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -1975,6 +1975,7 @@ static void ram_block_add(RAMBlock *new_block, Error = **errp) new_block->offset =3D find_ram_offset(new_block->max_length); =20 if (!new_block->host) { + new_block->flags |=3D RAM_ANON; if (xen_enabled()) { xen_ram_alloc(new_block->offset, new_block->max_length, new_block->mr, &err); @@ -2059,7 +2060,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, Mem= oryRegion *mr, =20 /* Just support these ram flags by now. */ assert((ram_flags & ~(RAM_SHARED | RAM_PMEM | RAM_NORESERVE | - RAM_PROTECTED)) =3D=3D 0); + RAM_PROTECTED | RAM_ANON)) =3D=3D 0); =20 if (xen_enabled()) { error_setg(errp, "-mem-path not supported with Xen"); @@ -2151,7 +2152,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ra= m_addr_t max_size, Error *local_err =3D NULL; =20 assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE | RAM_PREALLOC | - RAM_NORESERVE)) =3D=3D 0); + RAM_NORESERVE | RAM_ANON)) =3D=3D 0); assert(!host ^ (ram_flags & RAM_PREALLOC)); =20 size =3D HOST_PAGE_ALIGN(size); @@ -2185,7 +2186,7 @@ RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, vo= id *host, RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags, MemoryRegion *mr, Error **errp) { - assert((ram_flags & ~(RAM_SHARED | RAM_NORESERVE)) =3D=3D 0); + assert((ram_flags & ~(RAM_SHARED | RAM_NORESERVE | RAM_ANON)) =3D=3D 0= ); return qemu_ram_alloc_internal(size, size, NULL, NULL, ram_flags, mr, = errp); } =20 @@ -3664,6 +3665,11 @@ bool ramblock_is_pmem(RAMBlock *rb) return rb->flags & RAM_PMEM; } =20 +bool ramblock_is_anon(RAMBlock *rb) +{ + return rb->flags & RAM_ANON; +} + static void mtree_print_phys_entries(int start, int end, int skip, int ptr) { if (start =3D=3D end - 1) { --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306910; cv=none; d=zohomail.com; s=zohoarc; b=B52JgK3SVP2xs3+ILes+4Tu19KCWtz5MVerxfyBnzEcbRWYdAKk8/XRkzNwIsyQOZJ38a2CjDxAKRqSalAWRVB9SBZVT5nYoC7eyHqXya+pW4dtEMIgGOPnri4aYENzbMEXWdCr63Azh/L5rctzKik55qgyKzOkxIbiySTZGR4g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306910; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=iie6J0ZOCsbwACDLnLnmBtO4hwdVnQOJIzMSfP4sjjU=; b=ARSOmDPQpMEL4wKdYPyGhYWLKq/6WI3vLEF1PRdTQh5Fz4LyPt2FyEc3qZCOED+l7+LnsK3DnF/Mx5PRlJl1pL+y1c57gFn3KgI9IBgsoxZmezhG705hpoLIrgMQ0T3MM5d0Umoowlwan3jMpd/8aLrefAuKTPdn77zHXDTJzcQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306910606812.0864745980853; Wed, 15 Jun 2022 08:28:30 -0700 (PDT) Received: from localhost ([::1]:51264 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UwX-00066s-Cq for importer@patchew.org; Wed, 15 Jun 2022 11:28:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47974) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPA-0008Cw-4d for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:00 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:59950) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UP8-0001Ay-Ce for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:59 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE3J1x025870; Wed, 15 Jun 2022 14:52:36 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxdc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:35 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6o4023063; Wed, 15 Jun 2022 14:52:34 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpj6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:34 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMr018501; Wed, 15 Jun 2022 14:52:34 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-6; Wed, 15 Jun 2022 14:52:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=iie6J0ZOCsbwACDLnLnmBtO4hwdVnQOJIzMSfP4sjjU=; b=DLnJnjKZ60FioCVwJf9xiTwsT7EWZc0UCa7Rmjnlo3txzYloh+6waGt14g9xQt+XHrzX n5NT9Z0debIaO+IClP+igB+evAZkcWQVeVSpXQPt78S4bvNDvEuiyKXuT6TN1lzpawJP h3xx4AZ8V1hJeSSy9zMZm/I91cPRmLbMR9jwZcKJSiBcX8w5XEjBicP9e6zFbBwQ2iUh Mh2/5Yz+h7hIvayYBeWccCMeBUQmv2THun7zRRuJOEYQaARgftd87UMmbte3su/+2lgv vHQDyxG/E1a7C1lEqe7Ty7z9gA5LxswIR2FgAPdH/aPlVV5/MG4V1xMfm9PqQ2jIPsYN xg== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 05/39] vl: start on wakeup request Date: Wed, 15 Jun 2022 07:51:52 -0700 Message-Id: <1655304746-102776-6-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: 350_X43yS6ry7fmpUwubVeNMpapUcA4f X-Proofpoint-ORIG-GUID: 350_X43yS6ry7fmpUwubVeNMpapUcA4f Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306910915100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If qemu starts and loads a VM in the suspended state, then a later wakeup request will set the state to running, which is not sufficient to initialize the vm, as vm_start was never called during this invocation of qemu. See qemu_system_wakeup_request(). Define the start_on_wakeup_requested() hook to cause vm_start() to be called when processing the wakeup request. Signed-off-by: Steve Sistare --- include/sysemu/runstate.h | 1 + softmmu/runstate.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h index f3ed525..16c1c41 100644 --- a/include/sysemu/runstate.h +++ b/include/sysemu/runstate.h @@ -57,6 +57,7 @@ void qemu_system_reset_request(ShutdownCause reason); void qemu_system_suspend_request(void); void qemu_register_suspend_notifier(Notifier *notifier); bool qemu_wakeup_suspend_enabled(void); +void qemu_system_start_on_wakeup_request(void); void qemu_system_wakeup_request(WakeupReason reason, Error **errp); void qemu_system_wakeup_enable(WakeupReason reason, bool enabled); void qemu_register_wakeup_notifier(Notifier *notifier); diff --git a/softmmu/runstate.c b/softmmu/runstate.c index fac7b63..9b27d74 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -115,6 +115,7 @@ static const RunStateTransition runstate_transitions_de= f[] =3D { { RUN_STATE_PRELAUNCH, RUN_STATE_RUNNING }, { RUN_STATE_PRELAUNCH, RUN_STATE_FINISH_MIGRATE }, { RUN_STATE_PRELAUNCH, RUN_STATE_INMIGRATE }, + { RUN_STATE_PRELAUNCH, RUN_STATE_SUSPENDED }, =20 { RUN_STATE_FINISH_MIGRATE, RUN_STATE_RUNNING }, { RUN_STATE_FINISH_MIGRATE, RUN_STATE_PAUSED }, @@ -335,6 +336,7 @@ void vm_state_notify(bool running, RunState state) } } =20 +static bool start_on_wakeup_requested; static ShutdownCause reset_requested; static ShutdownCause shutdown_requested; static int shutdown_signal; @@ -562,6 +564,11 @@ void qemu_register_suspend_notifier(Notifier *notifier) notifier_list_add(&suspend_notifiers, notifier); } =20 +void qemu_system_start_on_wakeup_request(void) +{ + start_on_wakeup_requested =3D true; +} + void qemu_system_wakeup_request(WakeupReason reason, Error **errp) { trace_system_wakeup_request(reason); @@ -574,7 +581,14 @@ void qemu_system_wakeup_request(WakeupReason reason, E= rror **errp) if (!(wakeup_reason_mask & (1 << reason))) { return; } - runstate_set(RUN_STATE_RUNNING); + + if (start_on_wakeup_requested) { + start_on_wakeup_requested =3D false; + vm_start(); + } else { + runstate_set(RUN_STATE_RUNNING); + } + wakeup_reason =3D reason; qemu_notify_event(); } --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305294; cv=none; d=zohomail.com; s=zohoarc; b=Vb6rUFuyIAlnKKaXtb1ekcAzbXdna8yrdmzp2kkTvs3DYOi0DHtYzxPZUGAQD6lFS3pO1yMHl9o3lvUwVXJech4iuRVj4EQ2FZgS3S7aDjiF5/azlN5iDvD0SCsEynQaa+Exeef9+sOmGoFUXi5QfSZ4+G2HSSW+b6IKtLer2ws= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305294; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=oz2a9kX80ZSmiSS4Jq/4ZECWeEFcQFKs9Vlr5pBDPks=; b=XzAC5hEY7ikrK3NJ/tqEMo673ZQyduj32ko+89oAgyNpU75OTeA+afiQqrWhE9z+T8yJf8gBnxrseekZzmGBOXTSLBhy9TQ9ZbuCRU9KGhNVUuFsDn8jC5fEvBxG4Rr7Ezst1o2HyWwtutWdMlbZ49O3QRw4UuDqCkT2X2jm2e8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305294668421.9177307741721; Wed, 15 Jun 2022 08:01:34 -0700 (PDT) Received: from localhost ([::1]:48782 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UWT-0006IX-IX for importer@patchew.org; Wed, 15 Jun 2022 11:01:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47218) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO4-00062d-RZ for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:52 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:58780) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO2-0000z2-4o for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:52 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gvj025874; Wed, 15 Jun 2022 14:52:37 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxdj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:37 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6A0023069; Wed, 15 Jun 2022 14:52:36 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpjm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:36 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMt018501; Wed, 15 Jun 2022 14:52:35 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-7; Wed, 15 Jun 2022 14:52:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=oz2a9kX80ZSmiSS4Jq/4ZECWeEFcQFKs9Vlr5pBDPks=; b=idf0yA46Ur8+b8k3p6pgKH9qj42BDMpk1xk21rZgRXsv0Rtum3K4JkI42fDjANPiuDLk jaQE0aXsjyuY0zfpjNgZlI6zD6xB3l8rBRWAGSYZBG41wn4NJBpYuLo2zrHjQkAivzli w3Wejilhyo6HApCFgx7jqO2FdQCaEG+UjQ1ffEIJmLSima/zMXYLcPlLevba4ggWbcJL 9nRXZTD1b+O3CzeSAyHP/NgBzA/Kk/DwVCYloNNpTlJxnYbbdUImJkAA7sbAmkHFjCzz SqkMD6cmLH4SkoKCZ7AWFuT+ONQBOnPSUVLTAZX0mApL51s5IDqUSBVUSE26ZktndqGP UA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 06/39] cpr: reboot mode Date: Wed, 15 Jun 2022 07:51:53 -0700 Message-Id: <1655304746-102776-7-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: ALMjSEPnyyLQSsdSsjBH1rwMPfuDGPin X-Proofpoint-ORIG-GUID: ALMjSEPnyyLQSsdSsjBH1rwMPfuDGPin Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305294981100003 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Provide the cpr-save and cpr-load functions for live update. These save and restore VM state, with minimal guest pause time, so that qemu may be updated to a new version in between. cpr-save stops the VM and saves vmstate to an ordinary file. It supports any type of guest image and block device, but the caller must not modify guest block devices between cpr-save and cpr-load. cpr-save supports several modes, the first of which is reboot. In this mode the caller invokes cpr-save and then terminates qemu. The caller may then update the host kernel and system software and reboot. The caller resumes the guest by running qemu with the same arguments as the original process and invoking cpr-load. To use this mode, guest ram must be mapped to a persistent shared memory file such as /dev/dax0.0 or /dev/shm PKRAM. The reboot mode supports vfio devices if the caller first suspends the guest, such as by issuing guest-suspend-ram to the qemu guest agent. The guest drivers' suspend methods flush outstanding requests and re-initialize the devices, and thus there is no device state to save and restore. cpr-load loads state from the file. If the VM was running at cpr-save time then VM execution resumes. If the VM was suspended at cpr-save time, then the caller must issue a system_wakeup command to resume. cpr-save syntax: { 'enum': 'CprMode', 'data': [ 'reboot' ] } { 'command': 'cpr-save', 'data': { 'filename': 'str', 'mode': 'CprMode' }} cpr-load syntax: { 'command': 'cpr-load', 'data': { 'filename': 'str', 'mode': 'CprMode' }} Signed-off-by: Steve Sistare --- MAINTAINERS | 8 ++++ include/migration/cpr.h | 16 +++++++ migration/cpr.c | 116 ++++++++++++++++++++++++++++++++++++++++++++= ++++ migration/meson.build | 1 + qapi/cpr.json | 62 ++++++++++++++++++++++++++ qapi/meson.build | 1 + qapi/qapi-schema.json | 1 + softmmu/runstate.c | 1 + 8 files changed, 206 insertions(+) create mode 100644 include/migration/cpr.h create mode 100644 migration/cpr.c create mode 100644 qapi/cpr.json diff --git a/MAINTAINERS b/MAINTAINERS index 4cf6174..9273891 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3152,6 +3152,14 @@ F: net/filter-rewriter.c F: net/filter-mirror.c F: tests/qtest/test-filter* =20 +CPR +M: Steve Sistare +M: Mark Kanda +S: Maintained +F: include/migration/cpr.h +F: migration/cpr.c +F: qapi/cpr.json + Record/replay M: Pavel Dovgalyuk R: Paolo Bonzini diff --git a/include/migration/cpr.h b/include/migration/cpr.h new file mode 100644 index 0000000..1b6c82f --- /dev/null +++ b/include/migration/cpr.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#ifndef MIGRATION_CPR_H +#define MIGRATION_CPR_H + +#include "qapi/qapi-types-cpr.h" + +void cpr_set_mode(CprMode mode); +CprMode cpr_get_mode(void); + +#endif diff --git a/migration/cpr.c b/migration/cpr.c new file mode 100644 index 0000000..24b0bcc --- /dev/null +++ b/migration/cpr.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "migration/cpr.h" +#include "migration/global_state.h" +#include "qapi/error.h" +#include "qapi/qapi-commands-cpr.h" +#include "qemu-file-channel.h" +#include "qemu-file.h" +#include "savevm.h" +#include "sysemu/cpu-timers.h" +#include "sysemu/runstate.h" +#include "sysemu/sysemu.h" + +static CprMode cpr_mode =3D CPR_MODE_NONE; + +CprMode cpr_get_mode(void) +{ + return cpr_mode; +} + +void cpr_set_mode(CprMode mode) +{ + cpr_mode =3D mode; +} + +void qmp_cpr_save(const char *filename, CprMode mode, Error **errp) +{ + int ret; + QEMUFile *f; + int saved_vm_running =3D runstate_is_running(); + + if (global_state_store()) { + error_setg(errp, "Error saving global state"); + return; + } + + f =3D qemu_fopen_file(filename, O_CREAT | O_WRONLY | O_TRUNC, 0600, + "cpr-save", errp); + if (!f) { + return; + } + + if (runstate_check(RUN_STATE_SUSPENDED)) { + /* Update timers_state before saving. Suspend did not so do. */ + cpu_disable_ticks(); + } + vm_stop(RUN_STATE_SAVE_VM); + + cpr_set_mode(mode); + ret =3D qemu_save_device_state(f); + qemu_fclose(f); + if (ret < 0) { + error_setg(errp, "Error %d while saving VM state", ret); + goto err; + } + + return; + +err: + if (saved_vm_running) { + vm_start(); + } + cpr_set_mode(CPR_MODE_NONE); +} + +void qmp_cpr_load(const char *filename, CprMode mode, Error **errp) +{ + QEMUFile *f; + int ret; + RunState state; + + if (runstate_is_running()) { + error_setg(errp, "cpr-load called for a running VM"); + return; + } + + f =3D qemu_fopen_file(filename, O_RDONLY, 0, "cpr-load", errp); + if (!f) { + return; + } + + if (qemu_get_be32(f) !=3D QEMU_VM_FILE_MAGIC || + qemu_get_be32(f) !=3D QEMU_VM_FILE_VERSION) { + error_setg(errp, "%s is not a vmstate file", filename); + qemu_fclose(f); + return; + } + + cpr_set_mode(mode); + ret =3D qemu_load_device_state(f); + qemu_fclose(f); + if (ret < 0) { + error_setg(errp, "Error %d while loading VM state", ret); + goto out; + } + + state =3D global_state_get_runstate(); + if (state =3D=3D RUN_STATE_RUNNING) { + vm_start(); + } else { + runstate_set(state); + if (runstate_check(RUN_STATE_SUSPENDED)) { + /* Force vm_start to be called later. */ + qemu_system_start_on_wakeup_request(); + } + } + +out: + cpr_set_mode(CPR_MODE_NONE); +} diff --git a/migration/meson.build b/migration/meson.build index 6880b61..76fcfdb 100644 --- a/migration/meson.build +++ b/migration/meson.build @@ -15,6 +15,7 @@ softmmu_ss.add(files( 'channel.c', 'colo-failover.c', 'colo.c', + 'cpr.c', 'exec.c', 'fd.c', 'global_state.c', diff --git a/qapi/cpr.json b/qapi/cpr.json new file mode 100644 index 0000000..bdaabcb --- /dev/null +++ b/qapi/cpr.json @@ -0,0 +1,62 @@ +# -*- Mode: Python -*- +# +# Copyright (c) 2021, 2022 Oracle and/or its affiliates. +# +# This work is licensed under the terms of the GNU GPL, version 2. +# See the COPYING file in the top-level directory. + +## +# =3D CPR - CheckPoint and Restart +## + +{ 'include': 'common.json' } + +## +# @CprMode: +# +# @reboot: checkpoint can be cpr-load'ed after a host reboot. +# +# Since: 7.1 +## +{ 'enum': 'CprMode', + 'data': [ 'none', 'reboot' ] } + +## +# @cpr-save: +# +# Pause the VCPUs, and create a checkpoint of the virtual machine device s= tate +# in @filename. Unlike snapshot-save, this command completes synchronousl= y, +# saves state to an ordinary file, does not save guest block device blocks, +# and does not require that guest RAM be saved in the file. The caller mu= st +# not modify guest block devices between cpr-save and cpr-load. +# +# If @mode is 'reboot', the checkpoint remains valid after a host reboot. +# The guest RAM memory-backend should be shared and non-volatile across +# reboot, else it will be saved to the file. To resume from the checkpoin= t, +# issue the quit command, reboot the system, start qemu using the same +# arguments plus -S, and issue the cpr-load command. +# +# @filename: name of checkpoint file +# @mode: @CprMode mode +# +# Since: 7.1 +## +{ 'command': 'cpr-save', + 'data': { 'filename': 'str', + 'mode': 'CprMode' } } + +## +# @cpr-load: +# +# Load a virtual machine from the checkpoint file @filename that was creat= ed +# earlier by the cpr-save command, and continue the VCPUs. @mode must mat= ch +# the mode specified for cpr-save. +# +# @filename: name of checkpoint file +# @mode: @CprMode mode +# +# Since: 7.1 +## +{ 'command': 'cpr-load', + 'data': { 'filename': 'str', + 'mode': 'CprMode' } } diff --git a/qapi/meson.build b/qapi/meson.build index 656ef0e..d9ab29d 100644 --- a/qapi/meson.build +++ b/qapi/meson.build @@ -30,6 +30,7 @@ qapi_all_modules =3D [ 'common', 'compat', 'control', + 'cpr', 'crypto', 'dump', 'error', diff --git a/qapi/qapi-schema.json b/qapi/qapi-schema.json index 4912b97..001d790 100644 --- a/qapi/qapi-schema.json +++ b/qapi/qapi-schema.json @@ -77,6 +77,7 @@ { 'include': 'ui.json' } { 'include': 'authz.json' } { 'include': 'migration.json' } +{ 'include': 'cpr.json' } { 'include': 'transaction.json' } { 'include': 'trace.json' } { 'include': 'compat.json' } diff --git a/softmmu/runstate.c b/softmmu/runstate.c index 9b27d74..cfd6aa9 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -116,6 +116,7 @@ static const RunStateTransition runstate_transitions_de= f[] =3D { { RUN_STATE_PRELAUNCH, RUN_STATE_FINISH_MIGRATE }, { RUN_STATE_PRELAUNCH, RUN_STATE_INMIGRATE }, { RUN_STATE_PRELAUNCH, RUN_STATE_SUSPENDED }, + { RUN_STATE_PRELAUNCH, RUN_STATE_PAUSED }, =20 { RUN_STATE_FINISH_MIGRATE, RUN_STATE_RUNNING }, { RUN_STATE_FINISH_MIGRATE, RUN_STATE_PAUSED }, --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655307246; cv=none; d=zohomail.com; s=zohoarc; b=KURhTVMS+nsKZCx8H0qeBpjdbeHBr3KevrVHNYQBucfVXUN5MtjByKIdFFvuTzy6bUOt3WbnJyoyahnJD89Xkn2gV2wwfboDLjdbXKTk4qKWrjFwcrTJ0+Ebh/5CufePzsvFguAEGiCK1j2EBc95c/QbjPM+K0X+Uno160sWbYI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655307246; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=wSj/LnBi02Y+yXl7cvW4WLEgJp1j2I3nRgCrUeuhBQ0=; b=adJ+1qUTG8k4M0cUNzv13frKCHsIeF9fwW6T+UVuggYoi7DjkDjVfif0h8eRt3389xfTnp4LOR6yH23RXfqdlWoFSmgZ03FjNxiL2WzOc4aMOQZJjS5Gg83mTxzJORrRbaJX0i5CTok+nTtas4iEgPiu1FMXtdSrLnZZ4pDV0Hc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655307246775166.01868606276878; Wed, 15 Jun 2022 08:34:06 -0700 (PDT) Received: from localhost ([::1]:59944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1V1x-0003gG-LJ for importer@patchew.org; Wed, 15 Jun 2022 11:34:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47994) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPF-0008Q0-Rq for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:06 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:7378) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPE-0001B4-0a for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:05 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE61k5001479; Wed, 15 Jun 2022 14:52:38 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tk0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:38 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ73a023111; Wed, 15 Jun 2022 14:52:37 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpk4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:37 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMv018501; Wed, 15 Jun 2022 14:52:36 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-8; Wed, 15 Jun 2022 14:52:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=wSj/LnBi02Y+yXl7cvW4WLEgJp1j2I3nRgCrUeuhBQ0=; b=crkJR0gdTURf7uMOaPsH2P4eYSQseETly1uyGyOGZUae+jHV/bG26UuGPl3s0reT9iJJ D0MxuapygRkPH0Xz/IkXiEhueLwQcsropUBAZSmQI9APr7wILdxDQvpFQq+jGXfCagby 2qrCnfALwPefSt2gRiJMaVEIbrym0HXuJdvIuNAJInCKEMB3bKbP02iH8JbqZNhDZFQ0 ae682OmP7JnZYakplfABOH2RyUtlXdly/WTQk4qFIvlba+ciOBgsfQt76AlaW916AhN5 CisngPoOCFQ/1EE5/fW1TPdn/o1DpMQ1uOGT3Q2NDG87AVcCG5c6VOrvxcmFL0/gwhQF Qw== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 07/39] cpr: reboot HMP interfaces Date: Wed, 15 Jun 2022 07:51:54 -0700 Message-Id: <1655304746-102776-8-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: izCK8ApXDoGGr9ifq5DsJgRmHIlgTm_R X-Proofpoint-ORIG-GUID: izCK8ApXDoGGr9ifq5DsJgRmHIlgTm_R Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655307247464100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" cpr-save Call qmp_cpr_save(). Arguments: filename : save vmstate to filename mode: must be "reboot" cpr-load Call qmp_cpr_load(). Arguments: filename : load vmstate from filename mode: must be "reboot" Signed-off-by: Mark Kanda Signed-off-by: Steve Sistare --- hmp-commands.hx | 39 +++++++++++++++++++++++++++++++++++++++ include/monitor/hmp.h | 2 ++ monitor/hmp-cmds.c | 27 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/hmp-commands.hx b/hmp-commands.hx index 564f1de..9d9f984 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -355,6 +355,45 @@ SRST ERST =20 { + .name =3D "cpr-save", + .args_type =3D "filename:s,mode:s", + .params =3D "filename 'reboot'", + .help =3D "create a checkpoint of the VM in file", + .cmd =3D hmp_cpr_save, + }, + +SRST +``cpr-save`` *filename* *mode* + Pause the VCPUs, and create a checkpoint of the virtual machine device s= tate + in *filename*. Unlike snapshot-save, this command completes synchronous= ly, + saves state to an ordinary file, does not save guest block device blocks, + and does not require that guest RAM be saved in the file. The caller mu= st + not modify guest block devices between cpr-save and cpr-load. + + If *mode* is 'reboot', the checkpoint remains valid after a host reboot. + The guest RAM memory-backend should be shared and non-volatile across + reboot, else it will be saved to the file. To resume from the checkpoin= t, + issue the quit command, reboot the system, start qemu using the same + arguments plus -S, and issue the cpr-load command. +ERST + + { + .name =3D "cpr-load", + .args_type =3D "filename:s,mode:s", + .params =3D "filename 'reboot'", + + .help =3D "load VM checkpoint from file", + .cmd =3D hmp_cpr_load, + }, + +SRST +``cpr-load`` *filename* *mode* + Load a virtual machine from the checkpoint file *filename* that was crea= ted + earlier by the cpr-save command, and continue the VCPUs. *mode* must ma= tch + the mode specified for cpr-save. +ERST + + { .name =3D "delvm", .args_type =3D "name:s", .params =3D "tag", diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h index 96d0148..b44588e 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -59,6 +59,8 @@ void hmp_balloon(Monitor *mon, const QDict *qdict); void hmp_loadvm(Monitor *mon, const QDict *qdict); void hmp_savevm(Monitor *mon, const QDict *qdict); void hmp_delvm(Monitor *mon, const QDict *qdict); +void hmp_cpr_save(Monitor *mon, const QDict *qdict); +void hmp_cpr_load(Monitor *mon, const QDict *qdict); void hmp_migrate_cancel(Monitor *mon, const QDict *qdict); void hmp_migrate_continue(Monitor *mon, const QDict *qdict); void hmp_migrate_incoming(Monitor *mon, const QDict *qdict); diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 622c783..bb12589 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -33,6 +33,7 @@ #include "qapi/qapi-commands-block.h" #include "qapi/qapi-commands-char.h" #include "qapi/qapi-commands-control.h" +#include "qapi/qapi-commands-cpr.h" #include "qapi/qapi-commands-machine.h" #include "qapi/qapi-commands-migration.h" #include "qapi/qapi-commands-misc.h" @@ -1122,6 +1123,32 @@ void hmp_announce_self(Monitor *mon, const QDict *qd= ict) qapi_free_AnnounceParameters(params); } =20 +void hmp_cpr_save(Monitor *mon, const QDict *qdict) +{ + Error *err =3D NULL; + const char *filename =3D qdict_get_try_str(qdict, "filename"); + const char *str =3D qdict_get_try_str(qdict, "mode"); + CprMode mode =3D qapi_enum_parse(&CprMode_lookup, str, -1, &err); + + if (mode !=3D -1) { + qmp_cpr_save(filename, mode, &err); + } + hmp_handle_error(mon, err); +} + +void hmp_cpr_load(Monitor *mon, const QDict *qdict) +{ + Error *err =3D NULL; + const char *filename =3D qdict_get_try_str(qdict, "filename"); + const char *str =3D qdict_get_try_str(qdict, "mode"); + CprMode mode =3D qapi_enum_parse(&CprMode_lookup, str, -1, &err); + + if (mode !=3D -1) { + qmp_cpr_load(filename, mode, &err); + } + hmp_handle_error(mon, err); +} + void hmp_migrate_cancel(Monitor *mon, const QDict *qdict) { qmp_migrate_cancel(NULL); --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655304892; cv=none; d=zohomail.com; s=zohoarc; b=AvylPggYhWj7rbzV6JySdt1Da8T0LSD2m/aOHGq4qza05sQgk7q498CJNtLQc/0KqgmeBps6ed5FbBHloRNXATrFFXGMxWzBU30LOUIYaOijPudBbXMQ9KGjffIb/HZ38GPuSE5SeQJgx/eLDeGVWSG52oYpeO4DMpk9PT705SY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655304892; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=y1C0ovCma94MwaNzMH0fejgdXb17aj2Xl6bNkPSIkW4=; b=Iw8EDnai1oN5yyrK1NJnubdkyw9+nh3vv+gdX378xarskSbGqaPYwGfUc+f0nAbXICssLk3mto1GNEIv5mWj4wVJrA83+b9YOvHtnFVauPuFZkpGGBfAfUADvjw8S4o0bs0l6GJGeWO82tBT9aHp6Oral4igsSznhXCiZOU8elg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655304892367632.1893028369041; Wed, 15 Jun 2022 07:54:52 -0700 (PDT) Received: from localhost ([::1]:56166 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UPz-0000mx-BG for importer@patchew.org; Wed, 15 Jun 2022 10:54:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47268) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO7-00067t-7O for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:55 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:5382) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO5-000103-0I for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:54 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE61k6001479; Wed, 15 Jun 2022 14:52:40 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tk4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:39 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ79i023087; Wed, 15 Jun 2022 14:52:39 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpkk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:38 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSMx018501; Wed, 15 Jun 2022 14:52:38 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-9; Wed, 15 Jun 2022 14:52:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=y1C0ovCma94MwaNzMH0fejgdXb17aj2Xl6bNkPSIkW4=; b=sAY8GsiLznSyKmZgFEXTbQZfo808YYjtDjxZmj5GAMzrSHGUVGSnyLH56Eqi6zwWZJYn Mc0ttGUjthdGIEcqmlDVFXnT++sCRS0tiTYHOCq+i4ii5j6OSonq2dg08Ux3GFblHT1i d/qISwi7+GEN003Pwy7K/IwEH7Fs73aTEAuwlRUHFusavSpxU9X+xKJEj/jMsmnqxBb6 n7XfNbZ8lFh6bg3VhbMt1CiNVgfgjLTs3Kwz7zaVim14UW2PWQzv1ZWqImugVHV64Z/u LelypeAKTaZzbEBhGiRY7ulvDbRG2+d1GIK68nx29ObBhGlG37frbPok4KlT7qEatkiH 1g== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 08/39] cpr: blockers Date: Wed, 15 Jun 2022 07:51:55 -0700 Message-Id: <1655304746-102776-9-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: dI8tkBbO_SkoO4XW6v7F4nD0nKO6ei5f X-Proofpoint-ORIG-GUID: dI8tkBbO_SkoO4XW6v7F4nD0nKO6ei5f Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655304892905100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add an interface to register a blocker for cpr-save for one or more modes. Devices and options that do not support a cpr mode can register a blocker, and cpr-save will fail with a descriptive error message. Conversely, if such a device is deleted and un-registers its blocker, cpr will be allowed again. Signed-off-by: Steve Sistare --- MAINTAINERS | 1 + include/migration/cpr.h | 6 ++++ migration/cpr.c | 79 +++++++++++++++++++++++++++++++++++++++++++++= ++++ stubs/cpr.c | 23 ++++++++++++++ stubs/meson.build | 1 + 5 files changed, 110 insertions(+) create mode 100644 stubs/cpr.c diff --git a/MAINTAINERS b/MAINTAINERS index 9273891..1e4e72f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3159,6 +3159,7 @@ S: Maintained F: include/migration/cpr.h F: migration/cpr.c F: qapi/cpr.json +F: stubs/cpr.c =20 Record/replay M: Pavel Dovgalyuk diff --git a/include/migration/cpr.h b/include/migration/cpr.h index 1b6c82f..dfe5a1d 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -13,4 +13,10 @@ void cpr_set_mode(CprMode mode); CprMode cpr_get_mode(void); =20 +#define CPR_MODE_ALL CPR_MODE__MAX + +int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...); +int cpr_add_blocker_str(const char *reason, Error **errp, CprMode mode, ..= .); +void cpr_del_blocker(Error **reasonp); + #endif diff --git a/migration/cpr.c b/migration/cpr.c index 24b0bcc..c1da784 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -29,12 +29,91 @@ void cpr_set_mode(CprMode mode) cpr_mode =3D mode; } =20 +static GSList *cpr_blockers[CPR_MODE__MAX]; + +/* + * Add blocker for each mode in varargs list, or for all modes if CPR_MODE= _ALL + * is specified. Caller terminates the list with 0 or CPR_MODE_ALL. This + * function takes ownership of *reasonp, and frees it on error, or in + * cpr_del_blocker. errp is set in a later patch. + */ +int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...) +{ + int modes =3D 0; + va_list ap; + ERRP_GUARD(); + + va_start(ap, mode); + while (mode !=3D CPR_MODE_NONE && mode !=3D CPR_MODE_ALL) { + assert(mode > CPR_MODE_NONE && mode < CPR_MODE__MAX); + modes |=3D BIT(mode); + mode =3D va_arg(ap, CprMode); + } + va_end(ap); + if (mode =3D=3D CPR_MODE_ALL) { + modes =3D BIT(CPR_MODE__MAX) - 1; + } + + for (mode =3D 0; mode < CPR_MODE__MAX; mode++) { + if (modes & BIT(mode)) { + cpr_blockers[mode] =3D g_slist_prepend(cpr_blockers[mode], *re= asonp); + } + } + return 0; +} + +/* + * Delete the blocker from all modes it is associated with. + */ +void cpr_del_blocker(Error **reasonp) +{ + CprMode mode; + + if (*reasonp) { + for (mode =3D 0; mode < CPR_MODE__MAX; mode++) { + cpr_blockers[mode] =3D g_slist_remove(cpr_blockers[mode], *rea= sonp); + } + error_free(*reasonp); + *reasonp =3D NULL; + } +} + +/* + * Add a blocker which will not be deleted. Simpler for some callers. + */ +int cpr_add_blocker_str(const char *msg, Error **errp, CprMode mode, ...) +{ + int ret; + va_list ap; + Error *reason =3D NULL; + + error_setg(&reason, "%s", msg); + va_start(ap, mode); + ret =3D cpr_add_blocker(&reason, errp, mode, ap); + va_end(ap); + return ret; +} + +static bool cpr_is_blocked(Error **errp, CprMode mode) +{ + if (cpr_blockers[mode]) { + error_propagate(errp, error_copy(cpr_blockers[mode]->data)); + return true; + } + + return false; +} + void qmp_cpr_save(const char *filename, CprMode mode, Error **errp) { int ret; QEMUFile *f; int saved_vm_running =3D runstate_is_running(); =20 + if (cpr_is_blocked(errp, mode)) { + return; + } + if (global_state_store()) { error_setg(errp, "Error saving global state"); return; diff --git a/stubs/cpr.c b/stubs/cpr.c new file mode 100644 index 0000000..06a9a1c --- /dev/null +++ b/stubs/cpr.c @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "migration/cpr.h" + +int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...) +{ + return 0; +} + +int cpr_add_blocker_str(const char *reason, Error **errp, CprMode mode, ..= .) +{ + return 0; +} + +void cpr_del_blocker(Error **reasonp) +{ +} diff --git a/stubs/meson.build b/stubs/meson.build index 6f80fec..0d7565b 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -4,6 +4,7 @@ stub_ss.add(files('blk-exp-close-all.c')) stub_ss.add(files('blockdev-close-all-bdrv-states.c')) stub_ss.add(files('change-state-handler.c')) stub_ss.add(files('cmos.c')) +stub_ss.add(files('cpr.c')) stub_ss.add(files('cpu-get-clock.c')) stub_ss.add(files('cpus-get-virtual-clock.c')) stub_ss.add(files('qemu-timer-notify-cb.c')) --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305445; cv=none; d=zohomail.com; s=zohoarc; b=LDd48zqEeH8bW+fWZVmSfw3A7VyN5y1t5cVkSfVJze0tGoXGvWAMGAjGr/+V12Wgoewo5pLy0JPMFNnSvvg0o2jq1OwIKP9LdlHq12SB9FZsc/VoMaJFVNAR06HS76hpKVEnc3JduobMN/R+UNf4DQZ2GyATLx/3stVzRU9v4zc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305445; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=w8JE+eHobR41mMBRVUuuslpIICZ/Us2u5XSkZV3wT04=; b=c9l/35GMiZdPAgA/J0IvEfLjZZq4/vdK4LtMOjie1d8Gx3+Dx1rc2a9+vBfHnWuA3FIGKFUyWHObuQ8MD9lU3paXQ9zN2xdTgkBFNg2peTbAi8JfcVoXfGaLJV55fj56V2wDsroJKyGvFdllHq+Yj4zdKhOnqAX9sNBbbzEEJCc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305445722280.2887169096947; Wed, 15 Jun 2022 08:04:05 -0700 (PDT) Received: from localhost ([::1]:57256 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UYu-0003ij-MA for importer@patchew.org; Wed, 15 Jun 2022 11:04:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47330) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOA-0006Hh-Kw for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:58 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:13080) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO8-00010s-Jt for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:58 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE7fd5002108; Wed, 15 Jun 2022 14:52:41 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrshj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:41 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7UQ023115; Wed, 15 Jun 2022 14:52:40 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpm4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:40 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSN1018501; Wed, 15 Jun 2022 14:52:39 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-10; Wed, 15 Jun 2022 14:52:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=w8JE+eHobR41mMBRVUuuslpIICZ/Us2u5XSkZV3wT04=; b=aGAEa7/9McvA1PjJ8uHLfKreVtC8J0OVMwpBFXZiadjgT6VpH1usZLIfHKxfvz05GBFD imF0nlIN5ATGJhroGp1pzap4oHAtJYqQCHCgQAzmYVWZ5uHeqlbB5qPfJ1tJWwIy2ocT ySkW2d19mjtrg5laUZZHO1q+oB2zAmBx90CynCzBtIDFDKZ/Iw7SP8jA7hPEYvWEfMVV KhgbSIEUEMNZZ1touN7WxfI7AUZVVEhrUAhe7jT8uXsrjQE83ysKH4EDWEcBLq1Usmp2 iEunsp8NKUP6k+W5/xOMneEsGmO8VItEHb/ipW5cxT/V2wvnM4HPn5/5y+DiLWLoc/An Gw== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 09/39] cpr: register blockers Date: Wed, 15 Jun 2022 07:51:56 -0700 Message-Id: <1655304746-102776-10-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: H47cEWaOiEjK015ZDWgSNozFfBbZgOi5 X-Proofpoint-GUID: H47cEWaOiEjK015ZDWgSNozFfBbZgOi5 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305446255100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Register the known cpr blockers. Signed-off-by: Steve Sistare --- accel/xen/xen-all.c | 3 +++ backends/hostmem-epc.c | 6 ++++++ migration/migration.c | 6 ++++++ replay/replay.c | 4 ++++ 4 files changed, 19 insertions(+) diff --git a/accel/xen/xen-all.c b/accel/xen/xen-all.c index 69aa7d0..9dd0dc6 100644 --- a/accel/xen/xen-all.c +++ b/accel/xen/xen-all.c @@ -21,6 +21,7 @@ #include "sysemu/runstate.h" #include "migration/misc.h" #include "migration/global_state.h" +#include "migration/cpr.h" #include "hw/boards.h" =20 //#define DEBUG_XEN @@ -181,6 +182,8 @@ static int xen_init(MachineState *ms) * opt out of system RAM being allocated by generic code */ mc->default_ram_id =3D NULL; + + cpr_add_blocker_str("xen does not support cpr", &error_fatal, CPR_MODE= _ALL); return 0; } =20 diff --git a/backends/hostmem-epc.c b/backends/hostmem-epc.c index cb06255..094fed9 100644 --- a/backends/hostmem-epc.c +++ b/backends/hostmem-epc.c @@ -16,6 +16,7 @@ #include "qapi/error.h" #include "sysemu/hostmem.h" #include "hw/i386/hostmem-epc.h" +#include "migration/cpr.h" =20 static void sgx_epc_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) @@ -23,6 +24,7 @@ sgx_epc_backend_memory_alloc(HostMemoryBackend *backend, = Error **errp) uint32_t ram_flags; char *name; int fd; + Error *blocker =3D NULL; =20 if (!backend->size) { error_setg(errp, "can't create backend with size 0"); @@ -41,6 +43,10 @@ sgx_epc_backend_memory_alloc(HostMemoryBackend *backend,= Error **errp) memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name, backend->size, ram_flags, fd, 0, errp); + + error_setg(&blocker, "RAM_PROTECTED block %s does not support cpr", na= me); + cpr_add_blocker(&blocker, errp, CPR_MODE_ALL); + g_free(name); } =20 diff --git a/migration/migration.c b/migration/migration.c index 31739b2..1451bae 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -32,6 +32,7 @@ #include "savevm.h" #include "qemu-file-channel.h" #include "qemu-file.h" +#include "migration/cpr.h" #include "migration/vmstate.h" #include "block/block.h" #include "qapi/error.h" @@ -1283,6 +1284,11 @@ static bool migrate_caps_check(bool *cap_list, return false; } =20 + if (cap_list[MIGRATION_CAPABILITY_X_COLO]) { + return cpr_add_blocker_str("x-colo is not compatible with cpr", + errp, CPR_MODE_ALL); + } + return true; } =20 diff --git a/replay/replay.c b/replay/replay.c index 4c396bb..eb5456f 100644 --- a/replay/replay.c +++ b/replay/replay.c @@ -19,6 +19,7 @@ #include "qemu/option.h" #include "sysemu/cpus.h" #include "qemu/error-report.h" +#include "migration/cpr.h" =20 /* Current version of the replay mechanism. Increase it when file format changes. */ @@ -232,6 +233,9 @@ static void replay_enable(const char *fname, int mode) const char *fmode =3D NULL; assert(!replay_file); =20 + cpr_add_blocker_str("replay is not compatible with cpr", + &error_fatal, CPR_MODE_ALL); + switch (mode) { case REPLAY_MODE_RECORD: fmode =3D "wb"; --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305047; cv=none; d=zohomail.com; s=zohoarc; b=K1q4z+dTTFu/+nZwtw7zUVsrpO2V+yVGQXPC8xrL8WGZInOSxcJCdOuFulML9/0TquAx+h+hwiYlMvjD/sGVlG7gBvIaaZ1mqLIdevOV6YN7Vm8xr1+LPzMkglbeRo18PLuvL0B088Y4QYRNtz3OS9pofqwQXaC8Z+F+1SaVZ6Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305047; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=+sp4+cpxttCc+An/LgJTFXgwVuA5JVJmj7Xti2hEz1s=; b=BGbDgNncEtHSevEUnNvfcVTNweYFIauZjAB5EetEEobOTucMu7Pf1Pt2rgy9bHN22JxTW0IAGvJzcdooAdDGKp9egBSnhZV6tLG138k9ZjTR/XK0fTPc3U/Pb1fChbIru/7J+ITklI7xDwWlieyOntvXtilGl7stSMu88mhpMv4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305047666115.96181484739554; Wed, 15 Jun 2022 07:57:27 -0700 (PDT) Received: from localhost ([::1]:36738 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1USU-0006h3-KT for importer@patchew.org; Wed, 15 Jun 2022 10:57:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47300) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO9-0006EK-LH for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:57 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:11212) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO7-00010j-Kf for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:57 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gvm025874; Wed, 15 Jun 2022 14:52:42 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxdu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:41 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7UR023115; Wed, 15 Jun 2022 14:52:41 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpmt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:41 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSN3018501; Wed, 15 Jun 2022 14:52:40 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-11; Wed, 15 Jun 2022 14:52:40 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=+sp4+cpxttCc+An/LgJTFXgwVuA5JVJmj7Xti2hEz1s=; b=KB3p2Uajbly1G1ce/7z9BOjJZij9jDxtdOexQx711d85btR2pkDFqbQAYTAgqg82GW4v wpVvDFBkyjaNHBYzJA++UcXJvv0l0lH/mP1wIb0h6b984gU1j2/9UWw7RkUDGIyRLQBg 2pUzLaCUnInD7374fsfj2cxAmMp0gi8sfC3ExzTsPAMfIU1p2Z2ZXJ1eJA0LVwFEvWs6 qBSbN4pwZYPtI4qBF1mqHhFF9fi3gWcmvFFtPHBLkm1KIjUDNx/iJpz62GM3YH6Kss13 G6rJHO3aSEw2mqug6gDCB9z3M7E8uPtWpzHZZ24yqumRus9EunIvtkGzrP+93fbl1Pyx tw== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 10/39] cpr: cpr-enable option Date: Wed, 15 Jun 2022 07:51:57 -0700 Message-Id: <1655304746-102776-11-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: NpcBYuP1vJTfpkibW34CkOEW18gZSrt6 X-Proofpoint-ORIG-GUID: NpcBYuP1vJTfpkibW34CkOEW18gZSrt6 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305048770100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add the '-cpr-enable ' command-line option as a pre-requisite for using cpr-save and cpr-load for the mode. Multiple -cpr-enable options may be specified, one per mode. Requiring -cpr-enable allows qemu to initialize objects differently, if necessary, so that cpr-save is not blocked. Signed-off-by: Steve Sistare --- hmp-commands.hx | 4 ++++ include/migration/cpr.h | 2 ++ migration/cpr.c | 22 ++++++++++++++++++++++ qapi/cpr.json | 4 ++++ qemu-options.hx | 10 ++++++++++ softmmu/vl.c | 8 ++++++++ 6 files changed, 50 insertions(+) diff --git a/hmp-commands.hx b/hmp-commands.hx index 9d9f984..d621968 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -370,6 +370,8 @@ SRST and does not require that guest RAM be saved in the file. The caller mu= st not modify guest block devices between cpr-save and cpr-load. =20 + cpr-save requires that qemu was started with -cpr-enable for *mode*. + If *mode* is 'reboot', the checkpoint remains valid after a host reboot. The guest RAM memory-backend should be shared and non-volatile across reboot, else it will be saved to the file. To resume from the checkpoin= t, @@ -391,6 +393,8 @@ SRST Load a virtual machine from the checkpoint file *filename* that was crea= ted earlier by the cpr-save command, and continue the VCPUs. *mode* must ma= tch the mode specified for cpr-save. + + cpr-load requires that qemu was started with -cpr-enable for *mode*. ERST =20 { diff --git a/include/migration/cpr.h b/include/migration/cpr.h index dfe5a1d..f236cbf 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -10,8 +10,10 @@ =20 #include "qapi/qapi-types-cpr.h" =20 +void cpr_init(int modes); void cpr_set_mode(CprMode mode); CprMode cpr_get_mode(void); +bool cpr_enabled(CprMode mode); =20 #define CPR_MODE_ALL CPR_MODE__MAX =20 diff --git a/migration/cpr.c b/migration/cpr.c index c1da784..76b9225 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -29,6 +29,18 @@ void cpr_set_mode(CprMode mode) cpr_mode =3D mode; } =20 +static int cpr_enabled_modes; + +void cpr_init(int modes) +{ + cpr_enabled_modes =3D modes; +} + +bool cpr_enabled(CprMode mode) +{ + return !!(cpr_enabled_modes & BIT(mode)); +} + static GSList *cpr_blockers[CPR_MODE__MAX]; =20 /* @@ -110,6 +122,11 @@ void qmp_cpr_save(const char *filename, CprMode mode, = Error **errp) QEMUFile *f; int saved_vm_running =3D runstate_is_running(); =20 + if (!(cpr_enabled_modes & BIT(mode))) { + error_setg(errp, "cpr mode is not enabled. Use -cpr-enable."); + return; + } + if (cpr_is_blocked(errp, mode)) { return; } @@ -154,6 +171,11 @@ void qmp_cpr_load(const char *filename, CprMode mode, = Error **errp) int ret; RunState state; =20 + if (!(cpr_enabled_modes & BIT(mode))) { + error_setg(errp, "cpr mode is not enabled. Use -cpr-enable."); + return; + } + if (runstate_is_running()) { error_setg(errp, "cpr-load called for a running VM"); return; diff --git a/qapi/cpr.json b/qapi/cpr.json index bdaabcb..11c6f88 100644 --- a/qapi/cpr.json +++ b/qapi/cpr.json @@ -30,6 +30,8 @@ # and does not require that guest RAM be saved in the file. The caller mu= st # not modify guest block devices between cpr-save and cpr-load. # +# cpr-save requires that qemu was started with -cpr-enable for @mode. +# # If @mode is 'reboot', the checkpoint remains valid after a host reboot. # The guest RAM memory-backend should be shared and non-volatile across # reboot, else it will be saved to the file. To resume from the checkpoin= t, @@ -52,6 +54,8 @@ # earlier by the cpr-save command, and continue the VCPUs. @mode must mat= ch # the mode specified for cpr-save. # +# cpr-load requires that qemu was started with -cpr-enable for @mode. +# # @filename: name of checkpoint file # @mode: @CprMode mode # diff --git a/qemu-options.hx b/qemu-options.hx index 377d22f..6e51c33 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4483,6 +4483,16 @@ SRST an unmigratable state. ERST =20 +DEF("cpr-enable", HAS_ARG, QEMU_OPTION_cpr_enable, \ + "-cpr-enable reboot enable the cpr mode\n", + QEMU_ARCH_ALL) +SRST +``-cpr-enable reboot`` + Enable the specified cpr mode. May be supplied multiple times, once + per mode. This is a pre-requisite for calling the cpr-save and cpr-lo= ad + commands. +ERST + DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \ "-nodefaults don't create default devices\n", QEMU_ARCH_ALL) SRST diff --git a/softmmu/vl.c b/softmmu/vl.c index 54e920a..ce779cf 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -78,6 +78,7 @@ #include "hw/i386/pc.h" #include "migration/misc.h" #include "migration/snapshot.h" +#include "migration/cpr.h" #include "sysemu/tpm.h" #include "sysemu/dma.h" #include "hw/audio/soundhw.h" @@ -2600,6 +2601,7 @@ void qemu_init(int argc, char **argv, char **envp) MachineClass *machine_class; bool userconfig =3D true; FILE *vmstate_dump_file =3D NULL; + int cpr_modes =3D 0; =20 qemu_add_opts(&qemu_drive_opts); qemu_add_drive_opts(&qemu_legacy_drive_opts); @@ -3313,6 +3315,10 @@ void qemu_init(int argc, char **argv, char **envp) case QEMU_OPTION_only_migratable: only_migratable =3D 1; break; + case QEMU_OPTION_cpr_enable: + cpr_modes |=3D BIT(qapi_enum_parse(&CprMode_lookup, optarg= , -1, + &error_fatal)); + break; case QEMU_OPTION_nodefaults: has_defaults =3D 0; break; @@ -3464,6 +3470,8 @@ void qemu_init(int argc, char **argv, char **envp) qemu_validate_options(machine_opts_dict); qemu_process_sugar_options(); =20 + cpr_init(cpr_modes); + /* * These options affect everything else and should be processed * before daemonizing. --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305190; cv=none; d=zohomail.com; s=zohoarc; b=lyWPKA/LPZyR2VcbK7aEu6cW3FxyO53vH1XTs661v9DeKTAyYEEEe5ZNyOi5qwtBa6R0sSZdw1X9FeTUYJspm7wkJ5tWHBEc3CfO/opFB8UQ9Yty/sacV1EnwvwgGchvG5vfOzuWsxg5A0UoFgEMMpjLSnZB1Y6La1zryLSxhZM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305190; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=hPPI5U8n9By6D6CnUyM75BH/3nBeUyxSsGawJZht1hM=; b=adEAmM0SRGhp8DrBg/oF946rgavvPh5piGyFqfgxuzeB/tE30bA3QqqueH1DLH2dN9nFZKevwNuzFUpKcfouNY1ZZxZ8UhrBYVP7QpTTaAVY68Qlh9Piulkmni5VgI3NEqW6qDl687VWFKScSzQu9staWm+iCjDuICtXnJ64s48= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 165530519083237.36166072616891; Wed, 15 Jun 2022 07:59:50 -0700 (PDT) Received: from localhost ([::1]:45316 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UUn-0003vX-J2 for importer@patchew.org; Wed, 15 Jun 2022 10:59:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47354) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOC-0006OC-68 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:00 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:14470) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO9-000110-TO for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:59 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE3J22025870; Wed, 15 Jun 2022 14:52:43 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxdy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:43 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ73b023111; Wed, 15 Jun 2022 14:52:42 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpng-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:42 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSN5018501; Wed, 15 Jun 2022 14:52:41 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-12; Wed, 15 Jun 2022 14:52:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=hPPI5U8n9By6D6CnUyM75BH/3nBeUyxSsGawJZht1hM=; b=HbsH32nBaLmJc32d1IDgdXb4cequX571O6U6A9M7kMPbGPKkgRixBSbiIqvyuSwji5pi hY3NOVjJ6pGbwffQA7yuQ+NHKGIumrgf+UHHXEDzQGPMtOsAykXGQ4XSa74hOAr+iLnr fZoOBIkJzVflI6MKEGrIkGzHmqp+pcoMFcTlftKj2Z2B7eGqoXOH/Xtg2sXjwprXL8Is zFhlU0r2BzOBp/L25A8jee2MC/v7jeTnup5GLUjAeKdnxnqyanKkiTUx0tDq73PGBNtz bHsj2QtO4o2BbiqQYJBMvTQGBQ/K1URhOYGrjOTNu71cF+xCJX/snZ2Y+OLwoudFxErM IA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 11/39] cpr: save ram blocks Date: Wed, 15 Jun 2022 07:51:58 -0700 Message-Id: <1655304746-102776-12-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: klIUTvxRPURiUkMmktsxzhEdmCJO--0E X-Proofpoint-ORIG-GUID: klIUTvxRPURiUkMmktsxzhEdmCJO--0E Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305191416100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add a vmstate handler to save volatile ram blocks in the state file. This is used to preserve secondary guest ram blocks (those that cannot be specified on the command line) such as video ram and roms for cpr reboot, as there is no option to allocate them in shared memory. For efficiency, the user should create a shared memory-backend-file for the VM's main ram, so it is not copied to the state file, but this is not enforced. Signed-off-by: Steve Sistare --- include/exec/memory.h | 6 +++++ migration/savevm.c | 2 ++ softmmu/memory.c | 18 ++++++++++++++ softmmu/physmem.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 93 insertions(+) diff --git a/include/exec/memory.h b/include/exec/memory.h index 0daddd7..a03301d 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -3002,6 +3002,12 @@ bool ram_block_discard_is_disabled(void); */ bool ram_block_discard_is_required(void); =20 +/* + * Register/unregister a ram block for cpr. + */ +void ram_block_register(RAMBlock *rb); +void ram_block_unregister(RAMBlock *rb); + #endif =20 #endif diff --git a/migration/savevm.c b/migration/savevm.c index 0b2c5cd..9d528ed 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -3108,10 +3108,12 @@ void vmstate_register_ram(MemoryRegion *mr, DeviceS= tate *dev) qemu_ram_set_idstr(mr->ram_block, memory_region_name(mr), dev); qemu_ram_set_migratable(mr->ram_block); + ram_block_register(mr->ram_block); } =20 void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev) { + ram_block_unregister(mr->ram_block); qemu_ram_unset_idstr(mr->ram_block); qemu_ram_unset_migratable(mr->ram_block); } diff --git a/softmmu/memory.c b/softmmu/memory.c index 7ba2048..0fe6fac 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -3541,13 +3541,31 @@ void __attribute__((weak)) fuzz_dma_read_cb(size_t = addr, } #endif =20 +static char * +memory_region_vmstate_if_get_id(VMStateIf *obj) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + return strdup(mr->ram_block->idstr); +} + +static void memory_region_class_init(ObjectClass *class, void *data) +{ + VMStateIfClass *vc =3D VMSTATE_IF_CLASS(class); + vc->get_id =3D memory_region_vmstate_if_get_id; +} + static const TypeInfo memory_region_info =3D { .parent =3D TYPE_OBJECT, .name =3D TYPE_MEMORY_REGION, .class_size =3D sizeof(MemoryRegionClass), + .class_init =3D memory_region_class_init, .instance_size =3D sizeof(MemoryRegion), .instance_init =3D memory_region_initfn, .instance_finalize =3D memory_region_finalize, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_VMSTATE_IF }, + { } + } }; =20 static const TypeInfo iommu_memory_region_info =3D { diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 0f1ce28..822c424 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -66,7 +66,9 @@ =20 #include "qemu/pmem.h" =20 +#include "migration/cpr.h" #include "migration/vmstate.h" +#include "migration/qemu-file.h" =20 #include "qemu/range.h" #ifndef _WIN32 @@ -2450,6 +2452,71 @@ ram_addr_t qemu_ram_addr_from_host(void *ptr) return block->offset + offset; } =20 +static int put_ram_block(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, JSONWriter *vmdesc) +{ + RAMBlock *rb =3D pv; + + if (rb->used_length > 1024 * 1024) { + warn_report("Large RAM block %s size %ld saved to state file. " + "Use a shared file memory backend to avoid the copy.", + rb->idstr, rb->used_length); + } + qemu_put_buffer(f, rb->host, rb->used_length); + return 0; +} + +static int get_ram_block(QEMUFile *f, void *pv, size_t size, + const VMStateField *field) +{ + RAMBlock *rb =3D pv; + qemu_get_buffer(f, rb->host, rb->used_length); + return 0; +} + +static const VMStateInfo vmstate_info_ram_block =3D { + .name =3D "ram block host", + .get =3D get_ram_block, + .put =3D put_ram_block, +}; + +#define VMSTATE_RAM_BLOCK() { \ + .name =3D "ram_block_host", \ + .info =3D &vmstate_info_ram_block, \ + .flags =3D VMS_SINGLE, \ +} + +static bool ram_block_needed(void *opaque) +{ + RAMBlock *rb =3D opaque; + + return cpr_get_mode() =3D=3D CPR_MODE_REBOOT && + qemu_ram_is_migratable(rb) && + (!qemu_ram_is_shared(rb) || ramblock_is_anon(rb)); +} + +const VMStateDescription vmstate_ram_block =3D { + .name =3D "RAMBlock", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D ram_block_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(used_length, RAMBlock), + VMSTATE_RAM_BLOCK(), + VMSTATE_END_OF_LIST() + }, +}; + +void ram_block_register(RAMBlock *rb) +{ + vmstate_register(VMSTATE_IF(rb->mr), 0, &vmstate_ram_block, rb); +} + +void ram_block_unregister(RAMBlock *rb) +{ + vmstate_unregister(VMSTATE_IF(rb->mr), &vmstate_ram_block, rb); +} + static MemTxResult flatview_read(FlatView *fv, hwaddr addr, MemTxAttrs attrs, void *buf, hwaddr len); static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs at= trs, --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305041; cv=none; d=zohomail.com; s=zohoarc; b=Dv17GJrpHIdepywffFN2icmby71XU0i3Bfcix31kgKq1s7eE+Pm4nvKldHTDPlxAHV5+/CkrUeB54uPQM9x2zBrguQ1DN5CbFqWy5qxFv+P4bdhQijBLECWXEtTKpOpYVrydR5Hw6cjVcDOGUOClsxV5d/E5dORZ7anXMQrm+i8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305041; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=aFdA3TZzMye7P/K0tucfHBThD91+DafoYxmtCnmqvOo=; b=L5lVKwIB8YdDW82KCUms9O4NadBjA4Is21ktDWTcuQL0pfz1meLV+/KKf7lGq+4Vm/34bVxI4xeuDvoIAUEl133NolcmUw6jVca2wy+v9AK8ngf5B3KbVfTIH1uo/GaF9zZIcy/io1WV2tRnLJvwICRPLiManNvM8cAguELDUI4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305041697809.5372719660544; Wed, 15 Jun 2022 07:57:21 -0700 (PDT) Received: from localhost ([::1]:36102 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1USO-0006I2-Bm for importer@patchew.org; Wed, 15 Jun 2022 10:57:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47348) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOB-0006Kr-El for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:59 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:15186) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UO9-000117-Km for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:59 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDsU6d025877; Wed, 15 Jun 2022 14:52:44 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxe3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:44 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ79o023097; Wed, 15 Jun 2022 14:52:43 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpnw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:43 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSN7018501; Wed, 15 Jun 2022 14:52:42 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-13; Wed, 15 Jun 2022 14:52:42 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2021-07-09; bh=aFdA3TZzMye7P/K0tucfHBThD91+DafoYxmtCnmqvOo=; b=kdDmWRe/nrEjJZIyQWfQZ9O+CzADDY+mrjIIm/N66DrBsyEp8P+teo6H4evVoGGzfed6 NoDmrQIOvGAw9mYi94OTi6V1IPN2Q1rBUecfAAkLroK4YbaeN075dsGXZwg6nkEnJO+1 9nrIxJrnTnrCm4zZRdsmMj27WOTh0HP0wyyiaZme070+NQuBoOvZ6xujXIPpSYvjhMBZ p+epvh/+Qf0Lwt4vR9qXiLwPBouOThz4oK/IU+AExMjAgr+Nqz9Eo0RxL0c4ozkcIFbo SMipkzCGkzPb3Eglo/g/XlbBqXxVnVwvtETP95GrTKoGJLhRk0qYMKJBvk6gzbP4WYXw hQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 12/39] memory: flat section iterator Date: Wed, 15 Jun 2022 07:51:59 -0700 Message-Id: <1655304746-102776-13-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: jsmPdR8G6BVs0DHEOuv7IlnhL7bw4p-V X-Proofpoint-ORIG-GUID: jsmPdR8G6BVs0DHEOuv7IlnhL7bw4p-V Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305043093100001 Add an iterator over the sections of a flattened address space. Signed-off-by: Steve Sistare Reviewed-by: Marc-Andr=C3=A9 Lureau --- include/exec/memory.h | 31 +++++++++++++++++++++++++++++++ softmmu/memory.c | 20 ++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/include/exec/memory.h b/include/exec/memory.h index a03301d..6a257a4 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -2343,6 +2343,37 @@ void memory_region_set_ram_discard_manager(MemoryReg= ion *mr, RamDiscardManager *rdm); =20 /** + * memory_region_section_cb: callback for address_space_flat_for_each_sect= ion() + * + * @mrs: MemoryRegionSection of the range + * @opaque: data pointer passed to address_space_flat_for_each_section() + * @errp: error message, returned to the address_space_flat_for_each_secti= on + * caller. + * + * Returns: non-zero to stop the iteration, and 0 to continue. The same + * non-zero value is returned to the address_space_flat_for_each_section c= aller. + */ + +typedef int (*memory_region_section_cb)(MemoryRegionSection *mrs, + void *opaque, + Error **errp); + +/** + * address_space_flat_for_each_section: walk the ranges in the address spa= ce + * flat view and call @func for each. Return 0 on success, else return no= n-zero + * with a message in @errp. + * + * @as: target address space + * @func: callback function + * @opaque: passed to @func + * @errp: passed to @func + */ +int address_space_flat_for_each_section(AddressSpace *as, + memory_region_section_cb func, + void *opaque, + Error **errp); + +/** * memory_region_find: translate an address/size relative to a * MemoryRegion into a #MemoryRegionSection. * diff --git a/softmmu/memory.c b/softmmu/memory.c index 0fe6fac..e5aefdd 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -2683,6 +2683,26 @@ bool memory_region_is_mapped(MemoryRegion *mr) return !!mr->container || mr->mapped_via_alias; } =20 +int address_space_flat_for_each_section(AddressSpace *as, + memory_region_section_cb func, + void *opaque, + Error **errp) +{ + FlatView *view =3D address_space_get_flatview(as); + FlatRange *fr; + int ret; + + FOR_EACH_FLAT_RANGE(fr, view) { + MemoryRegionSection mrs =3D section_from_flat_range(fr, view); + ret =3D func(&mrs, opaque, errp); + if (ret) { + return ret; + } + } + + return 0; +} + /* Same as memory_region_find, but it does not add a reference to the * returned region. It must be called from an RCU critical section. */ --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305400; cv=none; d=zohomail.com; s=zohoarc; b=MXoOFTu+18yD3X/+S5bSwGlmP9MA07hnY1dKDEuShU1RU/Iihc4ka0nI888T84H15v0iaUWya8zV0GA50D9ML2eVWerbxd7PX3kkf+tQQ0uuG/hLno3ezXhxXzJJFZEKdbV4jl0r8kfG5f2wV2dDgofynIwYJYQobhDeE+ROJKI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305400; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=1Q1OaXrRnzhNw022Ip2BRaKyW3Kz9Y+ZwhEGKiRXevU=; b=TJJw8q468VTAf0zuauKbedFbJLEOkC8lEvS+a8psiE9nABvXk3W4ER5ci+8SPGuS/N8/D5WB1iUSkLpue29IXkOn8ZBnIOWz6+tmhm+HOknGCRohRmx5TnZQtv1excuOrbyOfA4wBBQ0xoqmUuCrxR046NF8OSs0zJoGr876Ggs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305400037824.629754460302; Wed, 15 Jun 2022 08:03:20 -0700 (PDT) Received: from localhost ([::1]:53732 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UYA-0001Jq-Eb for importer@patchew.org; Wed, 15 Jun 2022 11:03:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47356) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOC-0006ON-7q for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:00 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:16832) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOA-00011K-EI for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:52:59 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE7fd8002108; Wed, 15 Jun 2022 14:52:46 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrshy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:45 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ79q023097; Wed, 15 Jun 2022 14:52:44 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vppg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:44 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSN9018501; Wed, 15 Jun 2022 14:52:43 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-14; Wed, 15 Jun 2022 14:52:43 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=1Q1OaXrRnzhNw022Ip2BRaKyW3Kz9Y+ZwhEGKiRXevU=; b=lYDCm9+ZXdpMV49TWQ45KIjeUgpJCoibR755msO+/yeSLTRbLubHf10JlO7CLZENN3Md zIQEAfQ2VeXTaVRRaKU3vKN18zM5VQHjjK/Wbj8yfddGVIvSCr0ILPIgXQun+3xpvCVx 9tJxe5Y75Rkx0/0cfpLvKS4YWE6Ri4kllZeDcUrKU6Z0e2EX9Ne1v0otsnOMfs8YNvZy USQcKieSFs9OqlUglxSSKkiMLuM/k6zSMBmMcVs1gZBgIQGnUTUoInIznOEPo4Fywg1b TIXLb9atEibqkKRGl7N+ed1nhbmQlK5hIr6VvboAkJD4URwfThpqsoM3/NlV3p1dGZZ3 og== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 13/39] oslib: qemu_clear_cloexec Date: Wed, 15 Jun 2022 07:52:00 -0700 Message-Id: <1655304746-102776-14-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: cXJL-FWt6oBP4rkwi9fV771zRDQyJNi- X-Proofpoint-GUID: cXJL-FWt6oBP4rkwi9fV771zRDQyJNi- Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305401891100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Define qemu_clear_cloexec, analogous to qemu_set_cloexec. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Steve Sistare Reviewed-by: Marc-Andr=C3=A9 Lureau --- include/qemu/osdep.h | 1 + util/oslib-posix.c | 9 +++++++++ util/oslib-win32.c | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index b1c161c..e916f3b 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -548,6 +548,7 @@ ssize_t qemu_write_full(int fd, const void *buf, size_t= count) G_GNUC_WARN_UNUSED_RESULT; =20 void qemu_set_cloexec(int fd); +void qemu_clear_cloexec(int fd); =20 /* 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 7a34c16..421e987 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -261,6 +261,15 @@ void qemu_set_cloexec(int fd) assert(f !=3D -1); } =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 5723d3e..5bed148 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -226,6 +226,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 Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305561; cv=none; d=zohomail.com; s=zohoarc; b=aD6bB+JFG5+ZhM+oIwYBLnIw3ImlbfJwURGn0BpjO5wKsJt78Ma7yBnUXeJOubFiGfuvdOXD1unY5gJqQYGO635Zgz/GY4YjrvUInfeXPVc0ubO8pBdm1vmt4Lm5UNtFsXIZnUEVuSO8fwTikEa/eMXoAt+3gjr9P1ISD10E55U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305561; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=Y1n/wUcVnApfT4IN9wrfbLROcnTW1p/Y5mVukBGaUbs=; b=hax5NKVudg/2pise0aMeKCCx8cfZEa+14y2vadEMoWC3Dy+jp7lljd7Bsbf27gyWpqebSqBMtsbAwA6TxT7+FptdPmoxDs2rM6ccikmSoC82s/NOauDojG8W4CibhcQzj5cru8VYBRfouUA7ps9SdTmS8yTwMkpmkv8TZMNsLp4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 165530556119529.3592076768756; Wed, 15 Jun 2022 08:06:01 -0700 (PDT) Received: from localhost ([::1]:33690 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Ual-0006tI-JI for importer@patchew.org; Wed, 15 Jun 2022 11:05:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47486) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOP-00072U-OU for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:13 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:23632) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UON-00012I-Uu for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:13 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FEE6kU002105; Wed, 15 Jun 2022 14:52:47 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsj2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:46 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6CT023059; Wed, 15 Jun 2022 14:52:45 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpq6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:45 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNB018501; Wed, 15 Jun 2022 14:52:45 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-15; Wed, 15 Jun 2022 14:52:45 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=Y1n/wUcVnApfT4IN9wrfbLROcnTW1p/Y5mVukBGaUbs=; b=swwAaaLknFk/ZeDxijsbjUP/mU3u5RihPx2TsEDGPrYyu4bz0KZuPxWQu8pTLkhzCQSO 7+MGSySSBu1IbD0Q1gaOXJnZB0t2l8+fPnWhhUvxIhu0ionp0n6zO8g27IjFXVdL6V26 xmO8OLJ9nF3LaE4tAkpC2tPVU6WiVA1Fmp6kKLvTgFHlZYpT6O7HPaKtt/Srk9mQ6xwM S8n3cB77mfIR8/8JUplhhkPqX4sqKqi3mft/UXXCFHRXgl/OEq0p2R1yVE8G8TnlnCPq w72+RproFFdiyR/LiRIkImriRrKvO3PvDYICGSPb6xBx7UCCt8sRmfu+R0PF1U+WAKfd UQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 14/39] qapi: strList_from_string Date: Wed, 15 Jun 2022 07:52:01 -0700 Message-Id: <1655304746-102776-15-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: lyWcHQTNEw7V_r7NbTVs8TyD0hcCU8X3 X-Proofpoint-GUID: lyWcHQTNEw7V_r7NbTVs8TyD0hcCU8X3 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305562320100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Generalize strList_from_comma_list() to take any delimiter character, rename as strList_from_string(), and move it to qapi/util.c. No functional change. Signed-off-by: Steve Sistare --- include/qapi/util.h | 9 +++++++++ monitor/hmp-cmds.c | 29 ++--------------------------- qapi/qapi-util.c | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/include/qapi/util.h b/include/qapi/util.h index 81a2b13..7d88b09 100644 --- a/include/qapi/util.h +++ b/include/qapi/util.h @@ -22,6 +22,8 @@ typedef struct QEnumLookup { const int size; } QEnumLookup; =20 +struct strList; + const char *qapi_enum_lookup(const QEnumLookup *lookup, int val); int qapi_enum_parse(const QEnumLookup *lookup, const char *buf, int def, Error **errp); @@ -31,6 +33,13 @@ bool qapi_bool_parse(const char *name, const char *value= , bool *obj, int parse_qapi_name(const char *name, bool complete); =20 /* + * Produce a strList from the character delimited string @in. + * All strings are g_strdup'd. + * A NULL or empty input string returns NULL. + */ +struct strList *strList_from_string(const char *in, char delim); + +/* * For any GenericList @list, insert @element at the front. * * Note that this macro evaluates @element exactly once, so it is safe diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index bb12589..9f58b1f 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -43,6 +43,7 @@ #include "qapi/qapi-commands-run-state.h" #include "qapi/qapi-commands-tpm.h" #include "qapi/qapi-commands-ui.h" +#include "qapi/util.h" #include "qapi/qapi-visit-net.h" #include "qapi/qapi-visit-migration.h" #include "qapi/qmp/qdict.h" @@ -70,32 +71,6 @@ bool hmp_handle_error(Monitor *mon, Error *err) return false; } =20 -/* - * Produce a strList from a comma separated list. - * A NULL or empty input string return NULL. - */ -static strList *strList_from_comma_list(const char *in) -{ - strList *res =3D NULL; - strList **tail =3D &res; - - while (in && in[0]) { - char *comma =3D strchr(in, ','); - char *value; - - if (comma) { - value =3D g_strndup(in, comma - in); - in =3D comma + 1; /* skip the , */ - } else { - value =3D g_strdup(in); - in =3D NULL; - } - QAPI_LIST_APPEND(tail, value); - } - - return res; -} - void hmp_info_name(Monitor *mon, const QDict *qdict) { NameInfo *info; @@ -1115,7 +1090,7 @@ void hmp_announce_self(Monitor *mon, const QDict *qdi= ct) migrate_announce_params()); =20 qapi_free_strList(params->interfaces); - params->interfaces =3D strList_from_comma_list(interfaces_str); + params->interfaces =3D strList_from_string(interfaces_str, ','); params->has_interfaces =3D params->interfaces !=3D NULL; params->id =3D g_strdup(id); params->has_id =3D !!params->id; diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c index 63596e1..b61c73c 100644 --- a/qapi/qapi-util.c +++ b/qapi/qapi-util.c @@ -15,6 +15,7 @@ #include "qapi/error.h" #include "qemu/ctype.h" #include "qapi/qmp/qerror.h" +#include "qapi/qapi-builtin-types.h" =20 CompatPolicy compat_policy; =20 @@ -152,3 +153,25 @@ int parse_qapi_name(const char *str, bool complete) } return p - str; } + +strList *strList_from_string(const char *in, char delim) +{ + strList *res =3D NULL; + strList **tail =3D &res; + + while (in && in[0]) { + char *next =3D strchr(in, delim); + char *value; + + if (next) { + value =3D g_strndup(in, next - in); + in =3D next + 1; /* skip the delim */ + } else { + value =3D g_strdup(in); + in =3D NULL; + } + QAPI_LIST_APPEND(tail, value); + } + + return res; +} --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655307593; cv=none; d=zohomail.com; s=zohoarc; b=Kqu+bkRMoa5jq7rZL1rf3x+IO3iJlR7lhImLm5qM15ZJ9n7gk0RjLUnCxMguX6bg/MHY4JUYsr/mj2fTR/i5hLzB1mtt5BDfvmbWTZOi1VEGj+rjuPiIlTO9q2iMX1johWHpMcEXXeHex+9Gs9VYFrdGjmfMqaQ6zhj02V91U+A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655307593; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=6lCGXjI3tvu5Eh6CVGp/Ue+ESSsqoTyRpeyxBVbA3VY=; b=MfGxkT5i3qI0BLSD0YuOq5yy3aszynMfDODrkyurmg0hifRjlsBAokuU7MAJO+wJb3h6NDhClGVwS3ha5ygDNwh7PirWwOIpLgDRGleTkVsGNv4N4HQDiX1e0FDc5LEXkuACSGLs0W5AqRJhpRktWRrqMDfYWdO9iU3klho43fs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655307593191323.40390761548895; Wed, 15 Jun 2022 08:39:53 -0700 (PDT) Received: from localhost ([::1]:40456 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1V7W-0001IU-UZ for importer@patchew.org; Wed, 15 Jun 2022 11:39:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48070) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPM-00005h-Bi for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:12 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:19306) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPK-0001Bl-Ou for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:12 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0c2D001492; Wed, 15 Jun 2022 14:52:48 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tkp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:47 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ73e023111; Wed, 15 Jun 2022 14:52:46 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpqp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:46 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSND018501; Wed, 15 Jun 2022 14:52:46 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-16; Wed, 15 Jun 2022 14:52:46 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=6lCGXjI3tvu5Eh6CVGp/Ue+ESSsqoTyRpeyxBVbA3VY=; b=uSlkv5/1R1EpmZmUcjWJ3MbrLAK6IRvBea0qUGkzbanOWlgAKbuXoHbobUfz82v80XtF Fv/hLkjU1mmN24YpH+MKWxE04yLbXf/B9zDkZZfOGdRCZq4MTOykiJG+uoI95yCIXfEB MNmatJwwMqaettyxX7r4fuJ5PFh3RjKlu7BJYgk/4tMUCg1CLc1DpoEfTEe2o0RRmHA9 KH5Aa3N/ixzMeWmswMjqaUj82u7mX4adxwloFyDTPDbYAJs45ZyGXWR5dOAQLrJhpv+J 4szQrUf/9A7OFRaIeWX1WgqksXZyw+Ixdb0JUUN9MqGVZGcJcBVPikmeXgIE/rwS7xb9 oQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 15/39] qapi: QAPI_LIST_LENGTH Date: Wed, 15 Jun 2022 07:52:02 -0700 Message-Id: <1655304746-102776-16-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: IjBTIjaneRhh71UYMDnnYwgqYrVHHt05 X-Proofpoint-ORIG-GUID: IjBTIjaneRhh71UYMDnnYwgqYrVHHt05 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655307593806100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Steve Sistare Reviewed-by: Marc-Andr=C3=A9 Lureau --- include/qapi/util.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/qapi/util.h b/include/qapi/util.h index 7d88b09..75dddca 100644 --- a/include/qapi/util.h +++ b/include/qapi/util.h @@ -65,4 +65,17 @@ struct strList *strList_from_string(const char *in, char= delim); (tail) =3D &(*(tail))->next; \ } while (0) =20 +/* + * For any GenericList @list, return its length. + */ +#define QAPI_LIST_LENGTH(list) \ + ({ \ + int len =3D 0; \ + typeof(list) elem; \ + for (elem =3D list; elem !=3D NULL; elem =3D elem->next) { \ + len++; \ + } \ + len; \ + }) + #endif --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655307154; cv=none; d=zohomail.com; s=zohoarc; b=nmpqNFbqgOgU9d8vrjNeoQRV4h5NgzrK1hdonS5dg5KnTUcfLKlM3eKBY/V0K2PS+bw1Ws6f0JI3lMR5wlXp9ZEjzepbniEbF0Cq5wR77U5BwntLOhyQrFX6Yqn5h4EJHZjy310BtgIGdmcb577a7CL+Ht71hPTRWrJrOmL350c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655307154; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=GzI0gWvg80PtLp0f8GJXyhVdypXfBgAxwNMpPMIJU2k=; b=VEDQ6WDo8iHhZRoI0Ntnq4WKQvVHWGOtA5jdyuiz0qPjEFjqxfWTnZiOec97+86l0iJe4ZDQRhiiwih7FAm5d8t6oTt7xJCU900pIzSwN3B4qDDmZdiLO73FFmrM8F5qmgLoxXC/C3DhHwQkAr0ValY2LhNd2cTLXgiFHDYob40= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655307154869519.745213951121; Wed, 15 Jun 2022 08:32:34 -0700 (PDT) Received: from localhost ([::1]:56294 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1V0T-00016l-44 for importer@patchew.org; Wed, 15 Jun 2022 11:32:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48036) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPK-0008Ut-Ca for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:10 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:17332) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UPI-0001Bc-OJ for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:54:10 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDwp4J026591; Wed, 15 Jun 2022 14:52:49 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxeg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:49 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7C8023114; Wed, 15 Jun 2022 14:52:48 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vprk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:48 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNF018501; Wed, 15 Jun 2022 14:52:47 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-17; Wed, 15 Jun 2022 14:52:47 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=GzI0gWvg80PtLp0f8GJXyhVdypXfBgAxwNMpPMIJU2k=; b=n0Yk5OFlsCiZY6MxPNK7bsoiMdBZt0Jr/2icPiJRGAxv/K036fL20KHvN5+Nk8XtJeGx jsieDsw9o8d2vWeY7E4eLRb4/KkzfT2kSv2tzdlBatoeofR2NFvQpKdunw+lYbSAsTNd lEKb01p22KgW8f6bvx8mgAEylnMJDpKwFfv2dJ1wid0/bVQ0eOFrzZsqN4f52m3Hv4ZQ UHhz6nO8DxjmRNFTAALgWWeyOn7IhoCuGPVK0zU7kVoLimH9nbbcctjOcXPRZA7WUG9y U0HGNGK5vSx55Mjh828wV7YKrfNyku6Li2MZOkRsNS1AtLZeppQTLohVaAw4QA314Qp0 +g== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 16/39] qapi: strv_from_strList Date: Wed, 15 Jun 2022 07:52:03 -0700 Message-Id: <1655304746-102776-17-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: Mo-oSzF980FiQAMKkT4EyarIbTN5tlIR X-Proofpoint-ORIG-GUID: Mo-oSzF980FiQAMKkT4EyarIbTN5tlIR Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655307157231100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Steve Sistare Reviewed-by: Marc-Andr=C3=A9 Lureau --- include/qapi/util.h | 6 ++++++ qapi/qapi-util.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/qapi/util.h b/include/qapi/util.h index 75dddca..51ff64e 100644 --- a/include/qapi/util.h +++ b/include/qapi/util.h @@ -33,6 +33,12 @@ bool qapi_bool_parse(const char *name, const char *value= , bool *obj, int parse_qapi_name(const char *name, bool complete); =20 /* + * Produce and return a NULL-terminated array of strings from @args. + * All strings are g_strdup'd. + */ +GStrv strv_from_strList(const struct strList *args); + +/* * Produce a strList from the character delimited string @in. * All strings are g_strdup'd. * A NULL or empty input string returns NULL. diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c index b61c73c..8c96cab 100644 --- a/qapi/qapi-util.c +++ b/qapi/qapi-util.c @@ -154,6 +154,20 @@ int parse_qapi_name(const char *str, bool complete) return p - str; } =20 +GStrv strv_from_strList(const strList *args) +{ + const strList *arg; + int i =3D 0; + GStrv argv =3D g_malloc((QAPI_LIST_LENGTH(args) + 1) * sizeof(char *)); + + for (arg =3D args; arg !=3D NULL; arg =3D arg->next) { + argv[i++] =3D g_strdup(arg->value); + } + argv[i] =3D NULL; + + return argv; +} + strList *strList_from_string(const char *in, char delim) { strList *res =3D NULL; --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305177; cv=none; d=zohomail.com; s=zohoarc; b=Tjq6JgxujU6eUdEp5Kqud+yN4x0ZkyBXbKOL/YBkoujJG9moIeIJlX/H0XDmgltIFSJ4AKXfhc5f4o2agcJEk95EThWYymmEhcZZDbJYfvbsxTa2j8o/gwAh6yTrf9FsRJXYXu1M0vQHJB9pwbY2L8//tNk6ajQPyJ6J3hwmb70= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305177; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=mwvu5VidlD01bWZ76R6Trk/yA9U4TDrvGDi+OFgCAiA=; b=fRnrpuRrFEvzkh6v8tlhKUtIT3s3SSffwFY/b7ohC7U/hSkac6okslQVQLGf+nAtoCA3k2u8hJ+c25s66CoQyr3npOmlu5JTfy9NuGquTJ/vy3b23a642EjJawbYsk6dg8MSPNs853e455C7r2+/z6fu+XfTlp5wke5Ftt7sXdo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305177990742.4720712102451; Wed, 15 Jun 2022 07:59:37 -0700 (PDT) Received: from localhost ([::1]:44640 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UUa-0003UG-Tt for importer@patchew.org; Wed, 15 Jun 2022 10:59:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47480) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOP-000726-7q for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:13 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:22692) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UON-00011x-9S for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:12 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE7fdB002108; Wed, 15 Jun 2022 14:52:50 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsjb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:50 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6AB023069; Wed, 15 Jun 2022 14:52:49 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vps5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:49 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNH018501; Wed, 15 Jun 2022 14:52:48 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-18; Wed, 15 Jun 2022 14:52:48 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=mwvu5VidlD01bWZ76R6Trk/yA9U4TDrvGDi+OFgCAiA=; b=vhpvVYp4vE13yYdtDFuhvYJ6z30V7Z9x2tIS/YbIyiuB58y15VdcQcOPqIKwmPpqPgx7 s6AEXB8IZHfUeL9HNZHGbQLRNc63Idu0emWwZf9AIMn8BbiVGDu7muabSsYqW0LxsllD FqToAX2PQlOczXYQky/KJ3Up2hLNZYmdZ9L1z2KEqDa2mcj1rvHKsLnQxPDb1tpl45v4 Kxttcg5i7jhycwvmpb9h4Op8RAAQWV7KoIUevikrrsmxiDwlcWWajt4RkNBz29QwuQuT kePwSHWgd7jj1v6lCCf790HmYnaxqbxcfUUT4+9naas/35yzGVp2+P7BqU+qMtA8t1lm ew== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 17/39] qapi: strList unit tests Date: Wed, 15 Jun 2022 07:52:04 -0700 Message-Id: <1655304746-102776-18-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: CdeNd0DK1BBRnKBtGxIsuSUTkqcobYDp X-Proofpoint-GUID: CdeNd0DK1BBRnKBtGxIsuSUTkqcobYDp Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305179265100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Steve Sistare Reviewed-by: Marc-Andr=C3=A9 Lureau --- MAINTAINERS | 1 + tests/unit/meson.build | 1 + tests/unit/test-strlist.c | 81 +++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 83 insertions(+) create mode 100644 tests/unit/test-strlist.c diff --git a/MAINTAINERS b/MAINTAINERS index 1e4e72f..f9a6362 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3160,6 +3160,7 @@ F: include/migration/cpr.h F: migration/cpr.c F: qapi/cpr.json F: stubs/cpr.c +F: tests/unit/test-strlist.c =20 Record/replay M: Pavel Dovgalyuk diff --git a/tests/unit/meson.build b/tests/unit/meson.build index 287b367..57d48d5 100644 --- a/tests/unit/meson.build +++ b/tests/unit/meson.build @@ -17,6 +17,7 @@ tests =3D { 'test-forward-visitor': [testqapi], 'test-string-input-visitor': [testqapi], 'test-string-output-visitor': [testqapi], + 'test-strlist': [testqapi], 'test-opts-visitor': [testqapi], 'test-visitor-serialization': [testqapi], 'test-bitmap': [], diff --git a/tests/unit/test-strlist.c b/tests/unit/test-strlist.c new file mode 100644 index 0000000..ef740dc --- /dev/null +++ b/tests/unit/test-strlist.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qapi/util.h" +#include "qapi/qapi-builtin-types.h" + +static strList *make_list(int length) +{ + strList *head =3D 0, *list, **prev =3D &head; + + while (length--) { + list =3D *prev =3D g_new0(strList, 1); + list->value =3D g_strdup("aaa"); + prev =3D &list->next; + } + return head; +} + +static void test_length(void) +{ + strList *list; + int i; + + for (i =3D 0; i < 5; i++) { + list =3D make_list(i); + g_assert_cmpint(i, =3D=3D, QAPI_LIST_LENGTH(list)); + qapi_free_strList(list); + } +} + +struct { + const char *string; + char delim; + const char *args[5]; +} list_data[] =3D { + { 0, ',', { 0 } }, + { "", ',', { 0 } }, + { "a", ',', { "a", 0 } }, + { "a,b", ',', { "a", "b", 0 } }, + { "a,b,c", ',', { "a", "b", "c", 0 } }, + { "first last", ' ', { "first", "last", 0 } }, + { "a:", ':', { "a", 0 } }, + { "a::b", ':', { "a", "", "b", 0 } }, + { ":", ':', { "", 0 } }, + { ":a", ':', { "", "a", 0 } }, + { "::a", ':', { "", "", "a", 0 } }, +}; + +static void test_strv(void) +{ + int i, j; + const char **expect; + strList *list; + GStrv args; + + for (i =3D 0; i < ARRAY_SIZE(list_data); i++) { + expect =3D list_data[i].args; + list =3D strList_from_string(list_data[i].string, list_data[i].del= im); + args =3D strv_from_strList(list); + qapi_free_strList(list); + for (j =3D 0; expect[j] && args[j]; j++) { + g_assert_cmpstr(expect[j], =3D=3D, args[j]); + } + g_assert_null(expect[j]); + g_assert_null(args[j]); + g_strfreev(args); + } +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_add_func("/test-string/length", test_length); + g_test_add_func("/test-string/strv", test_strv); + return g_test_run(); +} --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305393; cv=none; d=zohomail.com; s=zohoarc; b=UqzADvkQiVHlKqgI2RNrDKg3dJl+H/GBdT3gEJA8yQFSvEoHqI7gMQjMaP/jwhOjr6n9ylk2ce/LQL8+94dh/lSmbW5lRlTaEONJ6wNs7xG2dEgJQwG8cd15+DFMqpzMpWoglFEZfCb5ug4mw6FdPwFrLxvrd41UTjKhwnoAWEI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305393; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=A08uDRz32w84CgdUyaoFktFRTfiigyvbP/EByqmYtaI=; b=RWBcHL/+M6VjJHN8Dn8EPsxE4kqTgLqv3MWbiXF1a4XVvpv0b5KmkJfy9JB+8H59uKg/ECpkJ7y6EOkE8R2iz+oZpia0hPTzdnX1xIkmggCqtcZ3Ur/2WwOR86q/DH4DbeawszmnQfANt+4ODH2129F+RGmKSn9ZofgymdZGdvs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305393429255.2434911986012; Wed, 15 Jun 2022 08:03:13 -0700 (PDT) Received: from localhost ([::1]:53088 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UY3-0000tl-Av for importer@patchew.org; Wed, 15 Jun 2022 11:03:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47492) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOQ-00074B-KN for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:16 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:21726) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOO-00011p-11 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:14 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE6ttH002488; Wed, 15 Jun 2022 14:52:51 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsjg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:51 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7uU023102; Wed, 15 Jun 2022 14:52:50 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpss-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:50 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNJ018501; Wed, 15 Jun 2022 14:52:49 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-19; Wed, 15 Jun 2022 14:52:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=A08uDRz32w84CgdUyaoFktFRTfiigyvbP/EByqmYtaI=; b=xmCBB6rRRpcQtSyVugeEdkyhpWZ35b0F12r1tvsZ8axIymI6Zy6pRJsIKVz/uAVqWLZ7 IJTTUoUI5ZmC9QDdkbShVSWXf6Q/i8L5MxFPAt54DsJzPg52gQF3S3aFeeJqMiP+zB2p +L0wdR1UgwqskzH43tzVd/qhHWVghClxSJIhBziy/01bXkN2pE2mQI3PAyoEiVIcXHEq WliJQbBa70AeiX2d851r/9sbDQehuZ+GBj3+rKh5UtIbZg4LWym3kguRXneeJDzkMejx cGdq7qzeqWxrVC6esA+JKXc5K953FDo1QRU9U1C6vrG3ZWMv4t/ItIamVFGn+T4Cr1+s yQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 18/39] vl: helper to request re-exec Date: Wed, 15 Jun 2022 07:52:05 -0700 Message-Id: <1655304746-102776-19-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: cjOrKPVHRIXCIluDjnUCYMoQae6NvcFj X-Proofpoint-GUID: cjOrKPVHRIXCIluDjnUCYMoQae6NvcFj Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305396167100001 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 re-exec qemu using the specified arguments. Signed-off-by: Steve Sistare --- include/sysemu/runstate.h | 1 + softmmu/runstate.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h index 16c1c41..6b0b4f1 100644 --- a/include/sysemu/runstate.h +++ b/include/sysemu/runstate.h @@ -63,6 +63,7 @@ void qemu_system_wakeup_enable(WakeupReason reason, bool = enabled); void qemu_register_wakeup_notifier(Notifier *notifier); void qemu_register_wakeup_support(void); void qemu_system_shutdown_request(ShutdownCause reason); +int qemu_system_exec_request(const strList *args, Error **errp); void qemu_system_powerdown_request(void); void qemu_register_powerdown_notifier(Notifier *notifier); void qemu_register_shutdown_notifier(Notifier *notifier); diff --git a/softmmu/runstate.c b/softmmu/runstate.c index cfd6aa9..c35ab09 100644 --- a/softmmu/runstate.c +++ b/softmmu/runstate.c @@ -37,6 +37,7 @@ #include "monitor/monitor.h" #include "net/net.h" #include "net/vhost_net.h" +#include "qapi/util.h" #include "qapi/error.h" #include "qapi/qapi-commands-run-state.h" #include "qapi/qapi-events-run-state.h" @@ -355,6 +356,7 @@ 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); +static GStrv exec_argv; =20 ShutdownCause qemu_shutdown_requested_get(void) { @@ -371,6 +373,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) { @@ -641,6 +648,18 @@ void qemu_system_shutdown_request(ShutdownCause reason) qemu_notify_event(); } =20 +int qemu_system_exec_request(const strList *args, Error **errp) +{ + exec_argv =3D strv_from_strList(args); + if (!exec_argv[0]) { + error_setg(errp, "qemu_system_exec_request: argv[0] is NULL"); + return 1; + } + shutdown_requested =3D 1; + qemu_notify_event(); + return 0; +} + static void qemu_system_powerdown(void) { qapi_event_send_powerdown(); @@ -689,6 +708,13 @@ static bool main_loop_should_exit(void) } request =3D qemu_shutdown_requested(); if (request) { + + if (qemu_exec_requested()) { + execvp(exec_argv[0], exec_argv); + error_report("execvp %s failed: %s", exec_argv[0], strerror(er= rno)); + g_strfreev(exec_argv); + exec_argv =3D NULL; + } qemu_kill_report(); qemu_system_shutdown(request); if (shutdown_action =3D=3D SHUTDOWN_ACTION_PAUSE) { --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305272; cv=none; d=zohomail.com; s=zohoarc; b=J8vXA3zLIh+rU0ZWZvV6tLwXrGzWCLrkQHiynyYxiMnm3/gOMawgUlwRZX8LCs+7SO3P2TwUZ7bgK0gNETVLbiBRomU9kABgIjj2a/teYYhaEN5MPiwKVyNZbWKs2c0dtzTRoNEcaqWAcLUfsfZt7mpsKRKOUYuzp7E2iKuJIRE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305272; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=wgOgQ2fKkp2nz73gI3RaCuUh5lP4MvzBJD8B11cmTjQ=; b=E6CbQp7rcrHo5cS2w+l1ITJDJkns8iQPVQJ/C7XeMrp63/l2dmO1bMoMDIchBmwoqkChHPoPkWI+PnhfhfdfKo2fC/uf4w4fixtOFv7JX3usr2OZoUOec7VYYMhiezVBgqIl1mgM7vPRfSmdqJoOHPMgO029yxC7rYvQOuSyCO4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305272467650.1068618484155; Wed, 15 Jun 2022 08:01:12 -0700 (PDT) Received: from localhost ([::1]:47708 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UW6-0005YO-Pe for importer@patchew.org; Wed, 15 Jun 2022 11:01:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47592) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOW-0007Db-F1 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:20 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:37232) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOT-00012z-QM for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:20 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE7fdE002108; Wed, 15 Jun 2022 14:52:53 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsjj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:52 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ737023089; Wed, 15 Jun 2022 14:52:51 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpth-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:51 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNL018501; Wed, 15 Jun 2022 14:52:51 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-20; Wed, 15 Jun 2022 14:52:51 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=wgOgQ2fKkp2nz73gI3RaCuUh5lP4MvzBJD8B11cmTjQ=; b=niQYA2C9bJP7GG94eyPpwvFufVjPsc9ZP/O9ozR24LtK3yyTbXMuaZwhlFGNjVmktO3h 1ZaS4IB8DQRpvPquYrV9/pkJwt+XoL9ZNmCANm2RxVsYiN+LsJYBN/irwAJhTXU2HJAV fHOJNSpTOqV5LR7JCD7eTU7mZpl6LUqB8Vl676n04oThXOzp9Fcx8QOh5T+QIanDVEXO zGGiL6emI4rDsBPpqeDQWgi33BuiF2Ei72P+/HwqDgpLkOpNHExKflcnYCFYrXLewL1z bRX336sSylPYwGi0IkqFvHqLw9oi//cJfKCa2V49ygBVdi7Kydogp9GGUE3+mnQ+CzBQ IQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 19/39] cpr: preserve extra state Date: Wed, 15 Jun 2022 07:52:06 -0700 Message-Id: <1655304746-102776-20-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: fjNeTMlFeq3jgD_RjOzKvIIKCGPEu_ax X-Proofpoint-GUID: fjNeTMlFeq3jgD_RjOzKvIIKCGPEu_ax Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305272828100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" cpr must save state that is needed after qemu is restarted, when devices are realized. Thus the extra state cannot be saved in the cpr-load vmstate fil= e, as objects must already exist before that file can be loaded. Instead, define auxilliary state structures and vmstate descriptions, not associated with any registered object, and serialize the aux state to a memfd file. Deserialize after qemu restarts, before devices are realized. The following state is saved: * cpr mode * file descriptor names and values * memfd values and properties for anonymous ram blocks Signed-off-by: Steve Sistare --- MAINTAINERS | 2 + include/migration/cpr.h | 16 +++ migration/cpr-state.c | 330 ++++++++++++++++++++++++++++++++++++++++++++= ++++ migration/cpr.c | 12 -- migration/meson.build | 1 + migration/trace-events | 8 ++ stubs/cpr-state.c | 27 ++++ stubs/meson.build | 1 + 8 files changed, 385 insertions(+), 12 deletions(-) create mode 100644 migration/cpr-state.c create mode 100644 stubs/cpr-state.c diff --git a/MAINTAINERS b/MAINTAINERS index f9a6362..74a43e6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3161,6 +3161,8 @@ F: migration/cpr.c F: qapi/cpr.json F: stubs/cpr.c F: tests/unit/test-strlist.c +F: migration/cpr-state.c +F: stubs/cpr-state.c =20 Record/replay M: Pavel Dovgalyuk diff --git a/include/migration/cpr.h b/include/migration/cpr.h index f236cbf..b75dec4 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -15,6 +15,22 @@ void cpr_set_mode(CprMode mode); CprMode cpr_get_mode(void); bool cpr_enabled(CprMode mode); =20 +typedef int (*cpr_walk_fd_cb)(const char *name, int id, int fd, void *opaq= ue); + +void cpr_save_fd(const char *name, int id, int fd); +void cpr_delete_fd(const char *name, int id); +int cpr_find_fd(const char *name, int id); +int cpr_walk_fd(cpr_walk_fd_cb cb, void *handle); +void cpr_save_memfd(const char *name, int fd, size_t len, size_t maxlen, + uint64_t align); +int cpr_find_memfd(const char *name, size_t *lenp, size_t *maxlenp, + uint64_t *alignp); +void cpr_delete_memfd(const char *name); +int cpr_resave_fd(const char *name, int id, int fd, Error **errp); +int cpr_state_save(Error **errp); +int cpr_state_load(Error **errp); +void cpr_state_print(void); + #define CPR_MODE_ALL CPR_MODE__MAX =20 int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...); diff --git a/migration/cpr-state.c b/migration/cpr-state.c new file mode 100644 index 0000000..ff1e122 --- /dev/null +++ b/migration/cpr-state.c @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/cutils.h" +#include "qemu/queue.h" +#include "qemu/memfd.h" +#include "qapi/error.h" +#include "migration/vmstate.h" +#include "migration/cpr.h" +#include "migration/qemu-file.h" +#include "migration/qemu-file-channel.h" +#include "trace.h" + +/*************************************************************************/ +/* cpr state container for all information to be saved. */ + +typedef QLIST_HEAD(CprNameList, CprName) CprNameList; + +typedef struct CprState { + CprMode mode; + CprNameList fds; /* list of CprFd */ + CprNameList memfd; /* list of CprMemfd */ +} CprState; + +static CprState cpr_state =3D { + .mode =3D CPR_MODE_NONE, +}; + +/*************************************************************************/ +/* Misc accessors. */ + +CprMode cpr_get_mode(void) +{ + return cpr_state.mode; +} + +void cpr_set_mode(CprMode mode) +{ + cpr_state.mode =3D mode; +} + +/*************************************************************************/ +/* Generic list of names. */ + +typedef struct CprName { + char *name; + unsigned int namelen; + int id; + QLIST_ENTRY(CprName) next; +} CprName; + +static const VMStateDescription vmstate_cpr_name =3D { + .name =3D "cpr name", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(namelen, CprName), + VMSTATE_VBUFFER_ALLOC_UINT32(name, CprName, 0, NULL, namelen), + VMSTATE_INT32(id, CprName), + VMSTATE_END_OF_LIST() + } +}; + +static void +add_name(CprNameList *head, const char *name, int id, CprName *elem) +{ + elem->name =3D g_strdup(name); + elem->namelen =3D strlen(name) + 1; + elem->id =3D id; + QLIST_INSERT_HEAD(head, elem, next); +} + +static CprName *find_name(CprNameList *head, const char *name, int id) +{ + CprName *elem; + + QLIST_FOREACH(elem, head, next) { + if (!strcmp(elem->name, name) && elem->id =3D=3D id) { + return elem; + } + } + return NULL; +} + +static void delete_name(CprNameList *head, const char *name, int id) +{ + CprName *elem =3D find_name(head, name, id); + + if (elem) { + QLIST_REMOVE(elem, next); + g_free(elem->name); + g_free(elem); + } +} + +/*************************************************************************= ***/ +/* Lists of named things. The first field of each entry must be a CprName= . */ + +typedef struct CprFd { + CprName name; /* must be first */ + int fd; +} CprFd; + +static const VMStateDescription vmstate_cpr_fd =3D { + .name =3D "cpr fd", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT(name, CprFd, 1, vmstate_cpr_name, CprName), + VMSTATE_INT32(fd, CprFd), + VMSTATE_END_OF_LIST() + } +}; + +#define CPR_FD(elem) ((CprFd *)(elem)) +#define CPR_FD_FD(elem) (CPR_FD(elem)->fd) + +void cpr_save_fd(const char *name, int id, int fd) +{ + CprFd *elem =3D g_new0(CprFd, 1); + + trace_cpr_save_fd(name, id, fd); + elem->fd =3D fd; + add_name(&cpr_state.fds, name, id, &elem->name); +} + +void cpr_delete_fd(const char *name, int id) +{ + trace_cpr_delete_fd(name, id); + delete_name(&cpr_state.fds, name, id); +} + +int cpr_find_fd(const char *name, int id) +{ + CprName *elem =3D find_name(&cpr_state.fds, name, id); + int fd =3D elem ? CPR_FD_FD(elem) : -1; + + trace_cpr_find_fd(name, id, fd); + return fd; +} + +int cpr_walk_fd(cpr_walk_fd_cb cb, void *opaque) +{ + CprName *elem; + + QLIST_FOREACH(elem, &cpr_state.fds, next) { + if (cb(elem->name, elem->id, CPR_FD_FD(elem), opaque)) { + return 1; + } + } + return 0; +} + +int cpr_resave_fd(const char *name, int id, int fd, Error **errp) +{ + int old_fd =3D cpr_find_fd(name, id); + + if (old_fd < 0) { + cpr_save_fd(name, id, fd); + return 0; + } else if (old_fd =3D=3D fd) { + return 0; + } else { + error_setg(errp, "fd %s %d already saved with a different value %d= ", + name, fd, old_fd); + return 1; + } +} + +/*************************************************************************/ +/* A memfd ram block. */ + +typedef struct CprMemfd { + CprName name; /* must be first */ + size_t len; + size_t maxlen; + uint64_t align; +} CprMemfd; + +static const VMStateDescription vmstate_cpr_memfd =3D { + .name =3D "cpr memfd", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT(name, CprMemfd, 1, vmstate_cpr_name, CprName), + VMSTATE_UINT64(len, CprMemfd), + VMSTATE_UINT64(maxlen, CprMemfd), + VMSTATE_UINT64(align, CprMemfd), + VMSTATE_END_OF_LIST() + } +}; + +#define CPR_MEMFD(elem) ((CprMemfd *)(elem)) +#define CPR_MEMFD_LEN(elem) (CPR_MEMFD(elem)->len) +#define CPR_MEMFD_MAXLEN(elem) (CPR_MEMFD(elem)->maxlen) +#define CPR_MEMFD_ALIGN(elem) (CPR_MEMFD(elem)->align) + +void cpr_save_memfd(const char *name, int fd, size_t len, size_t maxlen, + uint64_t align) +{ + CprMemfd *elem =3D g_new0(CprMemfd, 1); + + trace_cpr_save_memfd(name, len, maxlen, align); + elem->len =3D len; + elem->maxlen =3D maxlen; + elem->align =3D align; + add_name(&cpr_state.memfd, name, 0, &elem->name); + cpr_save_fd(name, 0, fd); +} + +void cpr_delete_memfd(const char *name) +{ + trace_cpr_delete_memfd(name); + delete_name(&cpr_state.memfd, name, 0); + cpr_delete_fd(name, 0); +} + +int cpr_find_memfd(const char *name, size_t *lenp, size_t *maxlenp, + uint64_t *alignp) +{ + int fd =3D cpr_find_fd(name, 0); + CprName *elem =3D find_name(&cpr_state.memfd, name, 0); + + if (elem) { + *lenp =3D CPR_MEMFD_LEN(elem); + *maxlenp =3D CPR_MEMFD_MAXLEN(elem); + *alignp =3D CPR_MEMFD_ALIGN(elem); + } else { + *lenp =3D 0; + *maxlenp =3D 0; + *alignp =3D 0; + } + + trace_cpr_find_memfd(name, *lenp, *maxlenp, *alignp); + return fd; +} + +/*************************************************************************/ +/* cpr state container interface and implementation. */ + +#define CPR_STATE_NAME "QEMU_CPR_STATE" + +static const VMStateDescription vmstate_cpr_state =3D { + .name =3D CPR_STATE_NAME, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(mode, CprState), + VMSTATE_QLIST_V(fds, CprState, 1, vmstate_cpr_fd, CprFd, name.next= ), + VMSTATE_QLIST_V(memfd, CprState, 1, vmstate_cpr_memfd, CprMemfd, + name.next), + VMSTATE_END_OF_LIST() + } +}; + +int cpr_state_save(Error **errp) +{ + int ret, mfd; + QEMUFile *f; + char val[16]; + + mfd =3D memfd_create(CPR_STATE_NAME, 0); + if (mfd < 0) { + error_setg_errno(errp, errno, "memfd_create failed"); + return -1; + } + qemu_clear_cloexec(mfd); + f =3D qemu_fopen_fd(mfd, true, CPR_STATE_NAME); + if (!f) { + error_setg(errp, "qemu_fopen_fd %d failed", mfd); + return -1; + } + + ret =3D vmstate_save_state(f, &vmstate_cpr_state, &cpr_state, 0); + if (ret) { + error_setg(errp, "vmstate_save_state error %d", ret); + return ret; + } + + /* Do not close f, as mfd must remain open. */ + qemu_fflush(f); + lseek(mfd, 0, SEEK_SET); + + /* Remember mfd for post-exec cpr_state_load */ + snprintf(val, sizeof(val), "%d", mfd); + g_setenv(CPR_STATE_NAME, val, 1); + + return 0; +} + +int cpr_state_load(Error **errp) +{ + int ret, mfd; + QEMUFile *f; + const char *val =3D g_getenv(CPR_STATE_NAME); + + if (!val) { + return 0; + } + g_unsetenv(CPR_STATE_NAME); + if (qemu_strtoi(val, NULL, 10, &mfd)) { + error_setg(errp, "Bad %s env value %s", CPR_STATE_NAME, val); + return 1; + } + f =3D qemu_fopen_fd(mfd, false, CPR_STATE_NAME); + ret =3D vmstate_load_state(f, &vmstate_cpr_state, &cpr_state, 1); + qemu_fclose(f); + return ret; +} + +void cpr_state_print(void) +{ + CprName *elem; + + printf("cpr_state:\n"); + printf("- mode =3D %d\n", cpr_state.mode); + QLIST_FOREACH(elem, &cpr_state.fds, next) { + printf("- %s %d : fd=3D%d\n", elem->name, elem->id, CPR_FD_FD(elem= )); + } + QLIST_FOREACH(elem, &cpr_state.memfd, next) { + printf("- %s : len=3D%lu, maxlen=3D%lu, align=3D%lu\n", elem->name, + CPR_MEMFD_LEN(elem), CPR_MEMFD_MAXLEN(elem), + CPR_MEMFD_ALIGN(elem)); + } +} diff --git a/migration/cpr.c b/migration/cpr.c index 76b9225..1cc8738 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -17,18 +17,6 @@ #include "sysemu/runstate.h" #include "sysemu/sysemu.h" =20 -static CprMode cpr_mode =3D CPR_MODE_NONE; - -CprMode cpr_get_mode(void) -{ - return cpr_mode; -} - -void cpr_set_mode(CprMode mode) -{ - cpr_mode =3D mode; -} - static int cpr_enabled_modes; =20 void cpr_init(int modes) diff --git a/migration/meson.build b/migration/meson.build index 76fcfdb..6bb502d 100644 --- a/migration/meson.build +++ b/migration/meson.build @@ -16,6 +16,7 @@ softmmu_ss.add(files( 'colo-failover.c', 'colo.c', 'cpr.c', + 'cpr-state.c', 'exec.c', 'fd.c', 'global_state.c', diff --git a/migration/trace-events b/migration/trace-events index 1aec580..bfde1ac 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -310,6 +310,14 @@ colo_receive_message(const char *msg) "Receive '%s' me= ssage" # colo-failover.c colo_failover_set_state(const char *new_state) "new state %s" =20 +# cpr-state.c +cpr_save_fd(const char *name, int id, int fd) "%s, id %d, fd %d" +cpr_delete_fd(const char *name, int id) "%s, id %d" +cpr_find_fd(const char *name, int id, int fd) "%s, id %d returns %d" +cpr_save_memfd(const char *name, size_t len, size_t maxlen, uint64_t align= ) "%s, len %lu, maxlen %lu, align %lu" +cpr_delete_memfd(const char *name) "%s" +cpr_find_memfd(const char *name, size_t len, size_t maxlen, uint64_t align= ) "%s, len %lu, maxlen %lu, align %lu" + # block-dirty-bitmap.c send_bitmap_header_enter(void) "" send_bitmap_bits(uint32_t flags, uint64_t start_sector, uint32_t nr_sector= s, uint64_t data_size) "flags: 0x%x, start_sector: %" PRIu64 ", nr_sectors:= %" PRIu32 ", data_size: %" PRIu64 diff --git a/stubs/cpr-state.c b/stubs/cpr-state.c new file mode 100644 index 0000000..cdd32aa --- /dev/null +++ b/stubs/cpr-state.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "migration/cpr.h" + +void cpr_save_fd(const char *name, int id, int fd) +{ +} + +void cpr_delete_fd(const char *name, int id) +{ +} + +int cpr_find_fd(const char *name, int id) +{ + return -1; +} + +int cpr_resave_fd(const char *name, int id, int fd, Error **errp) +{ + return 0; +} diff --git a/stubs/meson.build b/stubs/meson.build index 0d7565b..8186834 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -5,6 +5,7 @@ stub_ss.add(files('blockdev-close-all-bdrv-states.c')) stub_ss.add(files('change-state-handler.c')) stub_ss.add(files('cmos.c')) stub_ss.add(files('cpr.c')) +stub_ss.add(files('cpr-state.c')) stub_ss.add(files('cpu-get-clock.c')) stub_ss.add(files('cpus-get-virtual-clock.c')) stub_ss.add(files('qemu-timer-notify-cb.c')) --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305734; cv=none; d=zohomail.com; s=zohoarc; b=bOBxq+uv1xVBTUc1YsQTyM2BO9zQY6mWMkJuQB6F7I68/wEUWeSKMzzXw1/AUA6FO1q2kOJQ9WWYukuJCtW6mOQaACLh8IkRz4K08Ce3X2Pfa0BRuFp3qlI8jIYhQxnBGxya6TtdQKaXI/aNDoXz43UQQs7qyzbsR5kvy38lkX0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305734; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=xcRVb5A5sUPmhFgH94z2dKmOmv04moZKedIBiTOb5jo=; b=BCCPSfJayQdzFMG+yNHdXmH9Vq+KUwnhOR6GqK44b+fS+mLHEy+du3ynM0ztHLSBPEZdFBU/OYktEQtOHYUtMVCk6m6J0jBLKrLJK2sGQ7rXaznABhIU4eez7q1fAXylSVv41J1CsAxPSUCLs0UMqayDLpx0sVlzlGKAA9lCwvs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305734676604.605277319101; Wed, 15 Jun 2022 08:08:54 -0700 (PDT) Received: from localhost ([::1]:42158 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UdZ-0004a4-GG for importer@patchew.org; Wed, 15 Jun 2022 11:08:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47542) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOU-00078L-6J for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:18 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:33416) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOS-00012o-3q for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:17 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gvv025874; Wed, 15 Jun 2022 14:52:54 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxey-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:54 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7e7023149; Wed, 15 Jun 2022 14:52:53 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpu9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:53 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNN018501; Wed, 15 Jun 2022 14:52:52 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-21; Wed, 15 Jun 2022 14:52:52 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=xcRVb5A5sUPmhFgH94z2dKmOmv04moZKedIBiTOb5jo=; b=DQq6fso63aVQCHQ9YVvoc+Ky9x6KEfvYo0z+Kd8/tn+Bdl1H/re/Hzbqw7uMtE9COevj detnonp4q/XaClONvRjLnb1919A5Gmkw31Tn3XJ5u4om0XlgW/da+c/UMFlF1xWbEKB1 Um6aDD9UYZqoCl5cmbUURNblIhGLrdO3Bg64ErbmqSgez2pcWqOohdcWcX8xtHNZTeG2 nPqWrrW+NowCNBwWzokm/twtn8M53u6VMuE+qaPLW0elbiEBmVWO6rckwomIuNrccIOx ZMAowsLgOjbKHfZkuLC/h06mG99zkijySmEzN8FpeRQ4n1IQU4K95YVmF7iqkd/jhgB3 LQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 20/39] cpr: restart mode Date: Wed, 15 Jun 2022 07:52:07 -0700 Message-Id: <1655304746-102776-21-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: PwKJ-eDFHjP9uBMLXfG1Av_QST63dNXx X-Proofpoint-ORIG-GUID: PwKJ-eDFHjP9uBMLXfG1Av_QST63dNXx Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305735684100002 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Provide the cpr-save restart mode, which preserves the guest VM across a restart of the qemu process. After cpr-save, the caller passes qemu command-line arguments to cpr-exec, which directly exec's the new qemu binary. The arguments must include -S so new qemu starts in a paused state. The caller resumes the guest by calling cpr-load. To use the restart mode, guest RAM must be backed by a memory-backend-file with share=3Don. The '-cpr-enable restart' option causes secondary guest ram blocks (those not specified on the command line) to be allocated by mmap'ing a memfd. The memfd values are saved in special cpr state which is retrieved after exec, and are kept open across exec, after which they are retrieved and re-mmap'd. Hence guest RAM is preserved in place, albeit with new virtual addresses in the qemu process. The restart mode supports vfio devices and memory-backend-memfd in subsequent patches. cpr-exec syntax: { 'command': 'cpr-exec', 'data': { 'argv': [ 'str' ] } } Add the restart mode: { 'enum': 'CprMode', 'data': [ 'reboot', 'restart' ] } Signed-off-by: Steve Sistare --- migration/cpr.c | 35 +++++++++++++++++++++++++++++++++++ qapi/cpr.json | 26 +++++++++++++++++++++++++- qemu-options.hx | 2 +- softmmu/physmem.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- trace-events | 1 + 5 files changed, 107 insertions(+), 3 deletions(-) diff --git a/migration/cpr.c b/migration/cpr.c index 1cc8738..8b3fffd 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -22,6 +22,7 @@ static int cpr_enabled_modes; void cpr_init(int modes) { cpr_enabled_modes =3D modes; + cpr_state_load(&error_fatal); } =20 bool cpr_enabled(CprMode mode) @@ -153,6 +154,37 @@ err: cpr_set_mode(CPR_MODE_NONE); } =20 +static int preserve_fd(const char *name, int id, int fd, void *opaque) +{ + qemu_clear_cloexec(fd); + return 0; +} + +static int unpreserve_fd(const char *name, int id, int fd, void *opaque) +{ + qemu_set_cloexec(fd); + return 0; +} + +void qmp_cpr_exec(strList *args, Error **errp) +{ + if (!runstate_check(RUN_STATE_SAVE_VM)) { + error_setg(errp, "runstate is not save-vm"); + return; + } + if (cpr_get_mode() !=3D CPR_MODE_RESTART) { + error_setg(errp, "cpr-exec requires cpr-save with restart mode"); + return; + } + + cpr_walk_fd(preserve_fd, 0); + if (cpr_state_save(errp)) { + return; + } + + assert(qemu_system_exec_request(args, errp) =3D=3D 0); +} + void qmp_cpr_load(const char *filename, CprMode mode, Error **errp) { QEMUFile *f; @@ -189,6 +221,9 @@ void qmp_cpr_load(const char *filename, CprMode mode, E= rror **errp) goto out; } =20 + /* Clear cloexec to prevent fd leaks until the next cpr-save */ + cpr_walk_fd(unpreserve_fd, 0); + state =3D global_state_get_runstate(); if (state =3D=3D RUN_STATE_RUNNING) { vm_start(); diff --git a/qapi/cpr.json b/qapi/cpr.json index 11c6f88..47ee4ff 100644 --- a/qapi/cpr.json +++ b/qapi/cpr.json @@ -15,11 +15,12 @@ # @CprMode: # # @reboot: checkpoint can be cpr-load'ed after a host reboot. +# @restart: checkpoint can be cpr-load'ed after restarting qemu. # # Since: 7.1 ## { 'enum': 'CprMode', - 'data': [ 'none', 'reboot' ] } + 'data': [ 'none', 'reboot', 'restart' ] } =20 ## # @cpr-save: @@ -38,6 +39,11 @@ # issue the quit command, reboot the system, start qemu using the same # arguments plus -S, and issue the cpr-load command. # +# If @mode is 'restart', the checkpoint remains valid after restarting +# qemu using a subsequent cpr-exec. Guest RAM must be backed by a +# memory-backend-file with share=3Don. +# To resume from the checkpoint, issue the cpr-load command. +# # @filename: name of checkpoint file # @mode: @CprMode mode # @@ -48,6 +54,24 @@ 'mode': 'CprMode' } } =20 ## +# @cpr-exec: +# +# Restart qemu by directly exec'ing @argv[0], replacing the qemu process. +# The PID remains the same. Must be called after cpr-save restart. +# +# @argv[0] should be the path of a new qemu binary, or a prefix command th= at +# in turn exec's the new qemu binary. The arguments must match those used +# to initially start qemu, plus the -S option so new qemu starts in a paus= ed +# state. +# +# @argv: arguments to be passed to exec(). +# +# Since: 7.1 +## +{ 'command': 'cpr-exec', + 'data': { 'argv': [ 'str' ] } } + +## # @cpr-load: # # Load a virtual machine from the checkpoint file @filename that was creat= ed diff --git a/qemu-options.hx b/qemu-options.hx index 6e51c33..1b49360 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4484,7 +4484,7 @@ SRST ERST =20 DEF("cpr-enable", HAS_ARG, QEMU_OPTION_cpr_enable, \ - "-cpr-enable reboot enable the cpr mode\n", + "-cpr-enable reboot|restart enable the cpr mode\n", QEMU_ARCH_ALL) SRST ``-cpr-enable reboot`` diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 822c424..412cc80 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -44,6 +44,7 @@ #include "qemu/qemu-print.h" #include "qemu/log.h" #include "qemu/memalign.h" +#include "qemu/memfd.h" #include "exec/memory.h" #include "exec/ioport.h" #include "sysemu/dma.h" @@ -1962,6 +1963,40 @@ static void dirty_memory_extend(ram_addr_t old_ram_s= ize, } } =20 +static bool memory_region_is_backend(MemoryRegion *mr) +{ + return !!object_dynamic_cast(mr->parent_obj.parent, TYPE_MEMORY_BACKEN= D); +} + +static void *qemu_anon_memfd_alloc(RAMBlock *rb, size_t maxlen, Error **er= rp) +{ + size_t len, align; + void *addr; + struct MemoryRegion *mr =3D rb->mr; + const char *name =3D memory_region_name(mr); + int mfd =3D cpr_find_memfd(name, &len, &maxlen, &align); + + if (mfd >=3D 0) { + rb->used_length =3D len; + rb->max_length =3D maxlen; + mr->align =3D align; + } else { + len =3D rb->used_length; + maxlen =3D rb->max_length; + mr->align =3D QEMU_VMALLOC_ALIGN; + mfd =3D qemu_memfd_create(name, maxlen + mr->align, 0, 0, 0, errp); + if (mfd < 0) { + return NULL; + } + cpr_save_memfd(name, mfd, len, maxlen, mr->align); + } + rb->flags |=3D RAM_SHARED; + qemu_set_cloexec(mfd); + addr =3D file_ram_alloc(rb, maxlen, mfd, false, false, 0, errp); + trace_anon_memfd_alloc(name, maxlen, addr, mfd); + return addr; +} + static void ram_block_add(RAMBlock *new_block, Error **errp) { const bool noreserve =3D qemu_ram_is_noreserve(new_block); @@ -1986,6 +2021,14 @@ static void ram_block_add(RAMBlock *new_block, Error= **errp) qemu_mutex_unlock_ramlist(); return; } + } else if (cpr_enabled(CPR_MODE_RESTART) && + !memory_region_is_backend(new_block->mr)) { + new_block->host =3D qemu_anon_memfd_alloc(new_block, + new_block->max_length, + errp); + if (!new_block->host) { + return; + } } else { new_block->host =3D qemu_anon_ram_alloc(new_block->max_length, &new_block->mr->align, @@ -1997,8 +2040,8 @@ static void ram_block_add(RAMBlock *new_block, Error = **errp) qemu_mutex_unlock_ramlist(); return; } - memory_try_enable_merging(new_block->host, new_block->max_leng= th); } + memory_try_enable_merging(new_block->host, new_block->max_length); } =20 new_ram_size =3D MAX(old_ram_size, @@ -2231,6 +2274,7 @@ void qemu_ram_free(RAMBlock *block) } =20 qemu_mutex_lock_ramlist(); + cpr_delete_memfd(memory_region_name(block->mr)); QLIST_REMOVE_RCU(block, next); ram_list.mru_block =3D NULL; /* Write list before version */ diff --git a/trace-events b/trace-events index bc71006..07369bb 100644 --- a/trace-events +++ b/trace-events @@ -45,6 +45,7 @@ ram_block_discard_range(const char *rbname, void *hva, si= ze_t length, bool need_ # accel/tcg/cputlb.c memory_notdirty_write_access(uint64_t vaddr, uint64_t ram_addr, unsigned s= ize) "0x%" PRIx64 " ram_addr 0x%" PRIx64 " size %u" memory_notdirty_set_dirty(uint64_t vaddr) "0x%" PRIx64 +anon_memfd_alloc(const char *name, size_t size, void *ptr, int fd) "%s siz= e %zu ptr %p fd %d" =20 # gdbstub.c gdbstub_op_start(const char *device) "Starting gdbstub using device %s" --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305878; cv=none; d=zohomail.com; s=zohoarc; b=NJQDcs9Z6fAhCPF22omuawfbPqcfWoR3Xoq2sudh74gX+wBEnlDxT/9hqi9fU3dLuo8pz94r7YInoYLEAH/k2o8esXtaCWAjNuv6OWOthai3Tv3fCPjbBsSFKVWxOc9ihcITAu8ykhz1kjob+OP4q5GOwLeFdLNUxIMWBXHcf6I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305878; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=7fQ8mX2bxDzL5/L5Z29ea6DP6SR9ke9Ex3jEnkpp7Fk=; b=bTWa372QP39WyfAgNSt9BpPA/xHKCZg/AR806uRt8dFbykEbYruS+O/bHpW0hu8PrvFjKGJF7wsPlOfPQifZVlsiWiRLDZNyf++BLpQF6R8SDTyzTMUwee/zzzila8VRPW96dmPvQYGtXuWDRV5HBtDBo4tRhKEooXsJyqZQuIc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305878028312.47745531198245; Wed, 15 Jun 2022 08:11:18 -0700 (PDT) Received: from localhost ([::1]:45832 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Ufs-00077b-Sp for importer@patchew.org; Wed, 15 Jun 2022 11:11:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47630) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOX-0007Gv-PC for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:21 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:41940) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOV-00013H-RC for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:21 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDx9Fs001483; Wed, 15 Jun 2022 14:52:55 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tm4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:55 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ73i023111; Wed, 15 Jun 2022 14:52:54 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpv0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:54 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNP018501; Wed, 15 Jun 2022 14:52:53 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-22; Wed, 15 Jun 2022 14:52:53 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=7fQ8mX2bxDzL5/L5Z29ea6DP6SR9ke9Ex3jEnkpp7Fk=; b=0LeIY8lj5Sx9/PDED3ho4AE/1ZYtb17sd2s6t1Lbkv+Llrlt2acaAngjLRKCBohBSbZr PGaZk1CBPWEjksvWFvX/Y5J0BxiSTDKjsVYnIlOlp2hFIH9sRvo1mew5QbcX0gRM5WWh ZaKsfPoQECPouylXGVSyGXKPysQTotkKP4ma3FpW/SFB8Vh5OU9XL+wKYPv7zf1TvURZ lZcZaciMdVnYD8y9fnyB9oHSCLUJdueMaEt8t+SM6jro+dxO4Lxet/qkdlGJSKraSCks 5lgOcBMHVIYY3wYJ8KkfWwDEr3FTJ4Q40i+Mijhfxl9AQSO07aJhUOzDRDxOLd+SuQSm 2Q== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 21/39] cpr: restart HMP interfaces Date: Wed, 15 Jun 2022 07:52:08 -0700 Message-Id: <1655304746-102776-22-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: sFRCTpa7WWoXm_eswmgKI2zQX-bvYawi X-Proofpoint-ORIG-GUID: sFRCTpa7WWoXm_eswmgKI2zQX-bvYawi Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305879139100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" cpr-save mode may be "restart" cpr-exec Call qmp_cpr_exec(). Arguments: command : command line to execute, with space-separated arguments Signed-off-by: Steve Sistare --- hmp-commands.hx | 29 ++++++++++++++++++++++++++--- include/monitor/hmp.h | 1 + monitor/hmp-cmds.c | 11 +++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/hmp-commands.hx b/hmp-commands.hx index d621968..da5dd60 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -357,7 +357,7 @@ ERST { .name =3D "cpr-save", .args_type =3D "filename:s,mode:s", - .params =3D "filename 'reboot'", + .params =3D "filename 'reboot'|'restart'", .help =3D "create a checkpoint of the VM in file", .cmd =3D hmp_cpr_save, }, @@ -377,13 +377,36 @@ SRST reboot, else it will be saved to the file. To resume from the checkpoin= t, issue the quit command, reboot the system, start qemu using the same arguments plus -S, and issue the cpr-load command. + + If *mode* is 'restart', the checkpoint remains valid after restarting + qemu using a subsequent cpr-exec. Guest RAM must be backed by a + memory-backend-file with share=3Don. + To resume from the checkpoint, issue the cpr-load command. +ERST + + { + .name =3D "cpr-exec", + .args_type =3D "command:S", + .params =3D "command", + .help =3D "Restart qemu by directly exec'ing command", + .cmd =3D hmp_cpr_exec, + }, + +SRST +``cpr-exec`` *command* + Restart qemu by directly exec'ing *command*, replacing the qemu process. + The PID remains the same. Must be called after cpr-save restart. + + *command*[0] should be the path of a new qemu binary, or a prefix comman= d that + in turn exec's the new qemu binary. The arguments must match those used + to initially start qemu, plus the -S option so new qemu starts in a paus= ed + state. ERST =20 { .name =3D "cpr-load", .args_type =3D "filename:s,mode:s", - .params =3D "filename 'reboot'", - + .params =3D "filename 'reboot'|'restart'", .help =3D "load VM checkpoint from file", .cmd =3D hmp_cpr_load, }, diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h index b44588e..ec4fa44 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -60,6 +60,7 @@ void hmp_loadvm(Monitor *mon, const QDict *qdict); void hmp_savevm(Monitor *mon, const QDict *qdict); void hmp_delvm(Monitor *mon, const QDict *qdict); void hmp_cpr_save(Monitor *mon, const QDict *qdict); +void hmp_cpr_exec(Monitor *mon, const QDict *qdict); void hmp_cpr_load(Monitor *mon, const QDict *qdict); void hmp_migrate_cancel(Monitor *mon, const QDict *qdict); void hmp_migrate_continue(Monitor *mon, const QDict *qdict); diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 9f58b1f..b866c7f 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1111,6 +1111,17 @@ void hmp_cpr_save(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, err); } =20 +void hmp_cpr_exec(Monitor *mon, const QDict *qdict) +{ + Error *err =3D NULL; + const char *command =3D qdict_get_try_str(qdict, "command"); + strList *args =3D strList_from_string(command, ' '); + + qmp_cpr_exec(args, &err); + qapi_free_strList(args); + hmp_handle_error(mon, err); +} + void hmp_cpr_load(Monitor *mon, const QDict *qdict) { Error *err =3D NULL; --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305556; cv=none; d=zohomail.com; s=zohoarc; b=c0ZrLJDcoVx1GZF/7+PPQnyBeNnx2CWczLxKval56z1Ev5MVJkvhAWU6sbZ9BXvgyrOFjb784n3EAdm62TCQzh+D/TEH3DkmalOS3t3aNU9or34wV/2lzHhSjUydg0eec2pmnIHw4Q0Uratw4gPZU0gVvg9drLGWEyVOR7IfcBc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305556; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=rZBR0a1ztLqfou4cV1wfBrsD2ASxK5jsh8y8PeRXV78=; b=UbyaERokSRevxHF4dkdqo+sYshpWpnpxmTNqN0oSHm0RKE4LBm8K24J8qYt8/ApQaBrv1fV/uw6z5/YoAw9iE8PUGjCdU787j/GzYWQwYao6mScXNma84KyJhHVrbONmCn53cg70/lW9wOsHGz25oci6+JDFgP/OzOEc3j8rOPc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 165530555605453.49194774084174; Wed, 15 Jun 2022 08:05:56 -0700 (PDT) Received: from localhost ([::1]:33292 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uag-0006bu-DT for importer@patchew.org; Wed, 15 Jun 2022 11:05:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47566) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOV-0007BC-Fd for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:19 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:36462) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOT-00012v-G6 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:19 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0c2I001492; Wed, 15 Jun 2022 14:52:57 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tm7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:56 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7MN023113; Wed, 15 Jun 2022 14:52:56 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpvd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:55 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNR018501; Wed, 15 Jun 2022 14:52:54 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-23; Wed, 15 Jun 2022 14:52:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=rZBR0a1ztLqfou4cV1wfBrsD2ASxK5jsh8y8PeRXV78=; b=U9o6vry/6ADJt2ohlOxoczG2NcqBYyetrRENOjVpTVNtbgN2nzmveBi0bx31gE01aMyG 6uKWOtWXRLHQ3fBVQRXhyChJIOIU+4PdTrKRa4ij6pRrSf06eGMzGQ5AV5VK0ferPLhr 3mwsh0cqtTRKecasn2uiFsEGvUsfor9fu5dyFp5tqpFAtPOewXRbeqilwytpJlwBfc9R 0vq1n1d5bNTJfVWM2oNP/TuEg7B+zhj4LQ+6ar8t7o5rd3UtzplGooUpsxl51hwga9ab Ec2d756eOlTXGIrSxlJAs2rSFdsZ58OQ9aIFx5S+icBV9J9aZRMzztsF2Wq+XyhopiuN sQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 22/39] cpr: ram block blockers Date: Wed, 15 Jun 2022 07:52:09 -0700 Message-Id: <1655304746-102776-23-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: 2EmgyVf4s3howsLwf2Qmg0DAyQ3W8UMk X-Proofpoint-ORIG-GUID: 2EmgyVf4s3howsLwf2Qmg0DAyQ3W8UMk Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305558197100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Unlike reboot mode, restart mode cannot save volatile ram blocks in the vmstate file and recreate them later, because the physical memory for the blocks is pinned and registered for vfio. Add a restart-mode blocker for volatile ram blocks. Signed-off-by: Steve Sistare --- include/exec/memory.h | 2 ++ include/exec/ramblock.h | 1 + softmmu/physmem.c | 48 +++++++++++++++++++++++++++++++++++++++++++++= +++ softmmu/vl.c | 2 ++ 4 files changed, 53 insertions(+) diff --git a/include/exec/memory.h b/include/exec/memory.h index 6a257a4..812226f 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -3039,6 +3039,8 @@ bool ram_block_discard_is_required(void); void ram_block_register(RAMBlock *rb); void ram_block_unregister(RAMBlock *rb); =20 +void ram_block_add_cpr_blockers(Error **errp); + #endif =20 #endif diff --git a/include/exec/ramblock.h b/include/exec/ramblock.h index 6cbedf9..a5cbd9e 100644 --- a/include/exec/ramblock.h +++ b/include/exec/ramblock.h @@ -39,6 +39,7 @@ struct RAMBlock { /* RCU-enabled, writes protected by the ramlist lock */ QLIST_ENTRY(RAMBlock) next; QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers; + Error *cpr_blocker; int fd; size_t page_size; /* dirty bitmap used during migration */ diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 412cc80..b90ab4e 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -1968,6 +1968,53 @@ static bool memory_region_is_backend(MemoryRegion *m= r) return !!object_dynamic_cast(mr->parent_obj.parent, TYPE_MEMORY_BACKEN= D); } =20 +/* + * Return true if ram contents would be lost during cpr for CPR_MODE_RESTA= RT. + * Return false for ram_device because it is remapped after restart. Do n= ot + * exclude rom, even though it is readonly, because the rom file could cha= nge + * in the new qemu. Return false for non-migratable blocks. They are eit= her + * re-created after restart, or are handled specially, or are covered by a + * device-level cpr blocker. Return false for an fd, because it is visibl= e and + * can be remapped in the new process. + */ +static bool ram_is_volatile(RAMBlock *rb) +{ + MemoryRegion *mr =3D rb->mr; + + return mr && + memory_region_is_ram(mr) && + !memory_region_is_ram_device(mr) && + (!qemu_ram_is_shared(rb) || ramblock_is_anon(rb)) && + qemu_ram_is_migratable(rb) && + rb->fd < 0; +} + +/* + * Add a CPR_MODE_RESTART blocker for each volatile ram block. This canno= t be + * performed in ram_block_add because the migratable flag has not been set= yet. + */ +void ram_block_add_cpr_blockers(Error **errp) +{ + RAMBlock *rb; + + RAMBLOCK_FOREACH(rb) { + if (ram_is_volatile(rb)) { + const char *name =3D memory_region_name(rb->mr); + rb->cpr_blocker =3D NULL; + if (memory_region_is_backend(rb->mr)) { + error_setg(&rb->cpr_blocker, + "Memory region %s is volatile. A memory-backend-memfd = or" + " memory-backend-file with share=3Don is required.", n= ame); + } else { + error_setg(&rb->cpr_blocker, + "Memory region %s is volatile. " + "-cpr-enable restart is required.", name); + } + cpr_add_blocker(&rb->cpr_blocker, errp, CPR_MODE_RESTART, 0); + } + } +} + static void *qemu_anon_memfd_alloc(RAMBlock *rb, size_t maxlen, Error **er= rp) { size_t len, align; @@ -2275,6 +2322,7 @@ void qemu_ram_free(RAMBlock *block) =20 qemu_mutex_lock_ramlist(); cpr_delete_memfd(memory_region_name(block->mr)); + cpr_del_blocker(&block->cpr_blocker); QLIST_REMOVE_RCU(block, next); ram_list.mru_block =3D NULL; /* Write list before version */ diff --git a/softmmu/vl.c b/softmmu/vl.c index ce779cf..3e19c74 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -28,6 +28,7 @@ #include "qemu/units.h" #include "exec/cpu-common.h" #include "exec/page-vary.h" +#include "exec/memory.h" #include "hw/qdev-properties.h" #include "qapi/compat-policy.h" #include "qapi/error.h" @@ -2569,6 +2570,7 @@ void qmp_x_exit_preconfig(Error **errp) qemu_init_board(); qemu_create_cli_devices(); qemu_machine_creation_done(); + ram_block_add_cpr_blockers(&error_fatal); =20 if (loadvm) { load_snapshot(loadvm, NULL, false, NULL, &error_fatal); --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305733; cv=none; d=zohomail.com; s=zohoarc; b=cWFTX479LVvKHiC0O1vc96bb7X0b8JsAu256WNorbxnmYA0C/FHGRueD/eeb8LOJlDFCBoBJB640dmeiKraErS5Plk0L2RcQYK747ncGf+GANk5lBwC5lwvMxV0HheI+iUFfNwry/zDIpJ3cyhtxYtqQJ8spPPVUrlTe/NojGzs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305733; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=MmGDNuzn/lafDdcgChrTVv7tX1ybusyPVai0h9kiOHs=; b=PTvFsqmF5pP9lJUgBllJBxfuafnZ3KVK2VqJqMu+VzrD9kbGhKK/VhYlDh+krVLdiBz+65FxKCzAwIZPoBSxpFrExWpIBTovk2jrvUTbtxeGOxJBmeOysQxpXwSKV24vXANmqCn5dudrQwwaKureHjpdWmHtUwdwyIhL/yFvkwo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16553057332981014.6859225281498; Wed, 15 Jun 2022 08:08:53 -0700 (PDT) Received: from localhost ([::1]:41838 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UdX-0004LH-63 for importer@patchew.org; Wed, 15 Jun 2022 11:08:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47596) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOW-0007Dd-HZ for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:20 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:39250) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOU-000137-L1 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:20 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0c2J001492; Wed, 15 Jun 2022 14:52:57 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tm9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:57 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7CD023114; Wed, 15 Jun 2022 14:52:56 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpw2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:56 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNT018501; Wed, 15 Jun 2022 14:52:55 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-24; Wed, 15 Jun 2022 14:52:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=MmGDNuzn/lafDdcgChrTVv7tX1ybusyPVai0h9kiOHs=; b=nCCIiMZyzbJsZMaXUvpkV1Md3UQsV4jENS6q8MUOmVcgN9Bs+uzdkh7Ctnb8DuFv2XOZ 52IMDsAwhSFGx1nwCFS4u1TToMJ7/jlan0ac4yXKiiCDjnRtq2V5pckbgpZzOdumYiuQ akBh0KvAoG2kBVwPBljFTQqQdPIJ7KjmktCaSQbQgp0OOLuJORweBcRXV2SGLcx76fkT K0+8zUmIdPzT8ZsTcL6aHBfXEAA66ndaaq2QAuZOC5kLbuLVC87adtolk7NkhoZzgNaa c2MqaUZgrYlI0PNDoYl1Osti58oWN2pt1DtvPCXUEacMniCVkMxbQ7Vlc970HQC9ekP+ qw== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 23/39] hostmem-memfd: cpr for memory-backend-memfd Date: Wed, 15 Jun 2022 07:52:10 -0700 Message-Id: <1655304746-102776-24-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: EeSY2QL8Ud6SpNlmGFASwxRR7RZmnE-R X-Proofpoint-ORIG-GUID: EeSY2QL8Ud6SpNlmGFASwxRR7RZmnE-R Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305735656100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Preserve memory-backend-memfd memory objects during cpr. Signed-off-by: Steve Sistare --- backends/hostmem-memfd.c | 21 ++++++++++++--------- hmp-commands.hx | 2 +- qapi/cpr.json | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index c9d8001..2aeb5d1 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -14,6 +14,7 @@ #include "sysemu/hostmem.h" #include "qom/object_interfaces.h" #include "qemu/memfd.h" +#include "migration/cpr.h" #include "qemu/module.h" #include "qapi/error.h" #include "qom/object.h" @@ -36,23 +37,25 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, = Error **errp) { HostMemoryBackendMemfd *m =3D MEMORY_BACKEND_MEMFD(backend); uint32_t ram_flags; - char *name; - int fd; + char *name =3D host_memory_backend_get_name(backend); + int fd =3D cpr_find_fd(name, 0); =20 if (!backend->size) { error_setg(errp, "can't create backend with size 0"); return; } =20 - fd =3D qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, - m->hugetlb, m->hugetlbsize, m->seal ? - F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0, - errp); - if (fd =3D=3D -1) { - return; + if (fd < 0) { + fd =3D qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, + m->hugetlb, m->hugetlbsize, m->seal ? + F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL := 0, + errp); + if (fd =3D=3D -1) { + return; + } + cpr_save_fd(name, 0, fd); } =20 - name =3D host_memory_backend_get_name(backend); ram_flags =3D backend->share ? RAM_SHARED : 0; ram_flags |=3D backend->reserve ? 0 : RAM_NORESERVE; ram_flags |=3D RAM_ANON; diff --git a/hmp-commands.hx b/hmp-commands.hx index da5dd60..540f9be 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -380,7 +380,7 @@ SRST =20 If *mode* is 'restart', the checkpoint remains valid after restarting qemu using a subsequent cpr-exec. Guest RAM must be backed by a - memory-backend-file with share=3Don. + memory-backend-memfd or memory-backend-file object with share=3Don. To resume from the checkpoint, issue the cpr-load command. ERST =20 diff --git a/qapi/cpr.json b/qapi/cpr.json index 47ee4ff..1ec5aae 100644 --- a/qapi/cpr.json +++ b/qapi/cpr.json @@ -41,7 +41,7 @@ # # If @mode is 'restart', the checkpoint remains valid after restarting # qemu using a subsequent cpr-exec. Guest RAM must be backed by a -# memory-backend-file with share=3Don. +# memory-backend-memfd or memory-backend-file object with share=3Don. # To resume from the checkpoint, issue the cpr-load command. # # @filename: name of checkpoint file --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306000; cv=none; d=zohomail.com; s=zohoarc; b=W4P1hMZDjTHY1l2waMYS6cKDyKpnprKk7p5JzdTUmHDMbIxHelMZpnjW+yZad9iBktrX5YHwRXO89PL8O4VcPtq1y0EvRv0UGHns5dWSmCLwszc5mZU0qoO5rb0kgg1+FiGttId7zv3UjqKEE19w2vvuwHLVPb69gt2N60NZ/gQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306000; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=xHkvHEipDJ5d9aid8thw4P4U+q++R/wD7aoWuop3g+c=; b=gDU996ZMq6N50YBjDre5VYV5IqiHsqT1sGwkcVm3uG4EhkHj1zWk689gcb4ym7gQMyVhk+1CpI4A6GxUL4kzDbp3GybgUoR2zUFoKbRxA/xLz7g4UZ68VETzq9nK3b1wfqdYYIKyM/zZRguzNhaRjW55+WuK9Jmbdk2W5vugBe8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 165530600066439.120120239704534; Wed, 15 Jun 2022 08:13:20 -0700 (PDT) Received: from localhost ([::1]:50568 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uhr-00024S-Bc for importer@patchew.org; Wed, 15 Jun 2022 11:13:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47636) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOY-0007IA-Eo for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:24 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:44196) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOW-00013a-Rr for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:22 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE6ttO002488; Wed, 15 Jun 2022 14:52:59 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrsk4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:58 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7CF023114; Wed, 15 Jun 2022 14:52:57 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpx4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:57 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNV018501; Wed, 15 Jun 2022 14:52:57 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-25; Wed, 15 Jun 2022 14:52:56 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=xHkvHEipDJ5d9aid8thw4P4U+q++R/wD7aoWuop3g+c=; b=bylSyhrVfTRf09gJgSp71pcYrSdUtT18Nqs1YBsId/rS7UuVzcZYS3Hh4jzx16rqTR3f PZd7wLymbMxiVKdi4mPOqJ+d4LW/Sx+ew4Yg+CsaiavNHUt/ZvCNVHfIj2bWYry3if/O roq0JfG4/pHOXfueerTrG1jbFg9b2Ph8cSpkZTAZX+IuPmaYhyDHGFxu8wl/MGkmbuGr +MD+INVItxj5AgWaQxOXO35sSRlCsI23ZU1ojwTRrgi97ZaXPUOAzZt94x5BSapdYAvb xQ9zgUWJDAQnoKy2vdd50GoWaJeM/aUA2oLqAHMXgI7lcwN1wc4E3KnboADb6uax8Cjh Vg== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 24/39] pci: export export msix_is_pending Date: Wed, 15 Jun 2022 07:52:11 -0700 Message-Id: <1655304746-102776-25-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: 3ONCUe6pdFv0v4Eku8NcLI-QjS-xYkJy X-Proofpoint-GUID: 3ONCUe6pdFv0v4Eku8NcLI-QjS-xYkJy Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306002031100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Export msix_is_pending for use by cpr. No functional change. Signed-off-by: Steve Sistare Acked-by: Michael S. Tsirkin --- hw/pci/msix.c | 2 +- include/hw/pci/msix.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/pci/msix.c b/hw/pci/msix.c index ae9331c..e492ce0 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -64,7 +64,7 @@ static uint8_t *msix_pending_byte(PCIDevice *dev, int vec= tor) return dev->msix_pba + vector / 8; } =20 -static int msix_is_pending(PCIDevice *dev, int vector) +int msix_is_pending(PCIDevice *dev, unsigned int vector) { return *msix_pending_byte(dev, vector) & msix_pending_mask(vector); } diff --git a/include/hw/pci/msix.h b/include/hw/pci/msix.h index 4c4a60c..0065354 100644 --- a/include/hw/pci/msix.h +++ b/include/hw/pci/msix.h @@ -32,6 +32,7 @@ int msix_present(PCIDevice *dev); bool msix_is_masked(PCIDevice *dev, unsigned vector); void msix_set_pending(PCIDevice *dev, unsigned vector); void msix_clr_pending(PCIDevice *dev, int vector); +int msix_is_pending(PCIDevice *dev, unsigned vector); =20 int msix_vector_use(PCIDevice *dev, unsigned vector); void msix_vector_unuse(PCIDevice *dev, unsigned vector); --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305089; cv=none; d=zohomail.com; s=zohoarc; b=XIHgYY8xlTKqmS4aeGx4DY1qPEoBy29gFcGZmg7EqVn3rfFFXA4EUBX6DzF88Xf12GSJAlrUWU3J1nSXAMNnp4BRco81oFyHXSepMx+/iTEcdY8goahHsavFyzC8LCQAEkbx3WfPjJx4OIGeA0E6m/ZneGDxklz4V8sC8sstlyQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305089; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=EVAD4RFjpdDcmnkuVWmYBBgoufB9nCDpxPYM8mbku8w=; b=h1MRNM5L+/hqnaeWcT+GRqnmeSIhbw+zTyJ2Vv9Dor+fBOYYwZnPj1KdsYXn+wPWpZZUY/qB3ojulHg1eTrtGJpk21EnefhxKO/hD7C54UrRf77ejuOumVFqPjV6PGpCG1OzIxj4wSf6fFQolkjgbNnKAzIcUPod6kTeesoHY3Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305089985666.5989854843606; Wed, 15 Jun 2022 07:58:09 -0700 (PDT) Received: from localhost ([::1]:39156 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UTA-0008JF-Dk for importer@patchew.org; Wed, 15 Jun 2022 10:58:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47460) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOO-00070p-5I for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:12 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:14558) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOM-00013C-6E for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:11 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDbQTs015213; Wed, 15 Jun 2022 14:52:59 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhn0gvfm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:59 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6AH023069; Wed, 15 Jun 2022 14:52:59 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpxv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:52:59 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNX018501; Wed, 15 Jun 2022 14:52:58 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-26; Wed, 15 Jun 2022 14:52:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=EVAD4RFjpdDcmnkuVWmYBBgoufB9nCDpxPYM8mbku8w=; b=TtCcHiSJv0DMYG+SSHcqVnjjELPJrPte3Fzdro+1ItjRkzPkfZPFldWVrYIw3zk7kgyi mIN9Ff9Woscb7BgbqGo25bYNBlt/PHPTtE0r3X/6g6lGec6N6hATbZ0kA7f6/Tv2D3ry ZUBt/9+2bdeGcUF0kNUZ37furMlES/vbUuzdaIVP7v3ZHyI4o9vYPjGHCxgaapVXa6Pv tYOIMElNCD47oUPZp79fc9YSsvEljtzUWMdBLw6l8JzYIDQTjs/ICi9f8JKw0V3Munf4 TReyVJR/zIN7dEH5AkiVDvHT69dHp6n4g/2b9l8wX3HRS61nJfHgLBJNpdxTe3JYep4M EA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 25/39] cpr: notifiers Date: Wed, 15 Jun 2022 07:52:12 -0700 Message-Id: <1655304746-102776-26-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: HXos4WmOqK0tj2MCP7zfYQZG9z_T3sVD X-Proofpoint-ORIG-GUID: HXos4WmOqK0tj2MCP7zfYQZG9z_T3sVD 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_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305090527100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add an interface to register notifiers for cpr transitions. It is used to support vfio cpr in a subsequent patch. Signed-off-by: Steve Sistare --- include/migration/cpr.h | 13 +++++++++++++ migration/cpr.c | 25 +++++++++++++++++++++++++ stubs/cpr.c | 10 ++++++++++ 3 files changed, 48 insertions(+) diff --git a/include/migration/cpr.h b/include/migration/cpr.h index b75dec4..ab5f53e 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -9,6 +9,7 @@ #define MIGRATION_CPR_H =20 #include "qapi/qapi-types-cpr.h" +#include "qemu/notify.h" =20 void cpr_init(int modes); void cpr_set_mode(CprMode mode); @@ -37,4 +38,16 @@ int cpr_add_blocker(Error **reasonp, Error **errp, CprMo= de mode, ...); int cpr_add_blocker_str(const char *reason, Error **errp, CprMode mode, ..= .); void cpr_del_blocker(Error **reasonp); =20 +typedef enum CprNotifyState { + CPR_NOTIFY_EXEC, + CPR_NOTIFY_SAVE_FAILED, + CPR_NOTIFY_LOAD_FAILED, + CPR_NOTIFY_NUM +} CprNotifyState; + +void cpr_add_notifier(Notifier *notify, + void (*cb)(Notifier *notifier, void *data), + CprNotifyState state); +void cpr_remove_notifier(Notifier *notify); + #endif diff --git a/migration/cpr.c b/migration/cpr.c index 8b3fffd..9d6bca4 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -105,6 +105,28 @@ static bool cpr_is_blocked(Error **errp, CprMode mode) return false; } =20 +static NotifierList cpr_notifiers[CPR_NOTIFY_NUM]; + +void cpr_add_notifier(Notifier *notify, + void (*cb)(Notifier *notifier, void *data), + CprNotifyState state) +{ + assert(state >=3D 0 && state < CPR_NOTIFY_NUM); + notify->notify =3D cb; + notifier_list_add(&cpr_notifiers[state], notify); +} + +void cpr_remove_notifier(Notifier *notify) +{ + notifier_remove(notify); + notify->notify =3D NULL; +} + +static void cpr_call_notifiers(CprNotifyState state) +{ + notifier_list_notify(&cpr_notifiers[state], 0); +} + void qmp_cpr_save(const char *filename, CprMode mode, Error **errp) { int ret; @@ -142,6 +164,7 @@ void qmp_cpr_save(const char *filename, CprMode mode, E= rror **errp) qemu_fclose(f); if (ret < 0) { error_setg(errp, "Error %d while saving VM state", ret); + cpr_call_notifiers(CPR_NOTIFY_SAVE_FAILED); goto err; } =20 @@ -182,6 +205,7 @@ void qmp_cpr_exec(strList *args, Error **errp) return; } =20 + cpr_call_notifiers(CPR_NOTIFY_EXEC); assert(qemu_system_exec_request(args, errp) =3D=3D 0); } =20 @@ -218,6 +242,7 @@ void qmp_cpr_load(const char *filename, CprMode mode, E= rror **errp) qemu_fclose(f); if (ret < 0) { error_setg(errp, "Error %d while loading VM state", ret); + cpr_call_notifiers(CPR_NOTIFY_LOAD_FAILED); goto out; } =20 diff --git a/stubs/cpr.c b/stubs/cpr.c index 06a9a1c..9262e78 100644 --- a/stubs/cpr.c +++ b/stubs/cpr.c @@ -21,3 +21,13 @@ int cpr_add_blocker_str(const char *reason, Error **errp= , CprMode mode, ...) void cpr_del_blocker(Error **reasonp) { } + +void cpr_add_notifier(Notifier *notify, + void (*cb)(Notifier *notifier, void *data), + CprNotifyState state) +{ +} + +void cpr_remove_notifier(Notifier *notify) +{ +} --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306284; cv=none; d=zohomail.com; s=zohoarc; b=SfOcWKM0GXXsJz2T/6k/L3YeRAU5gZ0u00m7TGc6cEhAbplf2fozvidradWnAVIk4yJa7VlaN/N1MeYTLWtxX5jtLzrWxgi8x3QjsoBfZQko3fEmmffv6KrzKHNxPT6ju2sEthZdnk5R11E3Cda8jyqX2FbMhI133V7qU1yGLbE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306284; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=PSJWekmjFYoSMJvI8bg2b39oWZpHq6LD9ykDjH4iW9k=; b=OmOFn1Yg/RmzDT3hMeWgcAlj0krdhrCih3CZWxsabr+oqMfOmJ0ck74YtLdROYvwPxaSJaxFDUQcOeprv9oIR13vjzhscge2z3b2QF6grdYNLiycNsZddZKmcOXIloXNTnpNGBlCMDEHqxANh8dga2IfyQp6nvlkf9EtiuKHgaM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306284216961.7821487027448; Wed, 15 Jun 2022 08:18:04 -0700 (PDT) Received: from localhost ([::1]:58910 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UmR-0008KM-1w for importer@patchew.org; Wed, 15 Jun 2022 11:18:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47710) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOg-0007Vn-4T for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:30 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:56142) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOc-000156-Uf for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:28 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDwp4T026591; Wed, 15 Jun 2022 14:53:01 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxfj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:01 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7pm023118; Wed, 15 Jun 2022 14:53:00 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpyj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:00 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNZ018501; Wed, 15 Jun 2022 14:52:59 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-27; Wed, 15 Jun 2022 14:52:59 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=PSJWekmjFYoSMJvI8bg2b39oWZpHq6LD9ykDjH4iW9k=; b=VhYJnadYUQS9kgn6DgXrwKMsTggTvnXRoKguX856g3rrxkwFicewj8HIM3ZHj47x+sLn Cd28ED8BDijU78gbr0fKreNaPoug15qtDZDZkufMiHybco3oYKycsBHSWGYtuel2kvNy K/u5RGgOZkb4gf8I9I4AbF21HFUNEjCZ+nzxWYxHntzUWo4F8jlMchLQI24uAxrNzzKr 0v/AOFjPN+iy8MnPwRh0nwQ8o5SKFluDYBd6eZvj9wMQBem8qVyu02s4uRkI82ebQuMB T+fWNxJETBtHR6LCu2+0EMZ0h6EjFRxxuibnguX8xUZ9vL20BEO1dnUMDrOgBjAMNpRx Lg== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 26/39] vfio-pci: refactor for cpr Date: Wed, 15 Jun 2022 07:52:13 -0700 Message-Id: <1655304746-102776-27-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: NbEBZYCb09Pxm1-ATdw51DjTknIaqfYg X-Proofpoint-ORIG-GUID: NbEBZYCb09Pxm1-ATdw51DjTknIaqfYg Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306285679100002 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Refactor vector use into a helper vfio_vector_init. Add vfio_notifier_init and vfio_notifier_cleanup for named notifiers, and pass additional arguments to vfio_remove_kvm_msi_virq. All for use by cpr in a subsequent patch. No functional change. Signed-off-by: Steve Sistare --- hw/vfio/pci.c | 99 +++++++++++++++++++++++++++++++++++++++----------------= ---- 1 file changed, 66 insertions(+), 33 deletions(-) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 939dcc3..0143c9a 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -52,6 +52,27 @@ static void vfio_disable_interrupts(VFIOPCIDevice *vdev); static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled); static void vfio_msi_disable_common(VFIOPCIDevice *vdev); =20 +/* Create new or reuse existing eventfd */ +static int vfio_notifier_init(VFIOPCIDevice *vdev, EventNotifier *e, + const char *name, int nr) +{ + int fd =3D -1; /* placeholder until a subsequent patch */ + int ret =3D 0; + + if (fd >=3D 0) { + event_notifier_init_fd(e, fd); + } else { + ret =3D event_notifier_init(e, 0); + } + return ret; +} + +static void vfio_notifier_cleanup(VFIOPCIDevice *vdev, EventNotifier *e, + const char *name, int nr) +{ + event_notifier_cleanup(e); +} + /* * Disabling BAR mmaping can be slow, but toggling it around INTx can * also be a huge overhead. We try to get the best of both worlds by @@ -132,8 +153,8 @@ static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, E= rror **errp) pci_irq_deassert(&vdev->pdev); =20 /* Get an eventfd for resample/unmask */ - if (event_notifier_init(&vdev->intx.unmask, 0)) { - error_setg(errp, "event_notifier_init failed eoi"); + if (vfio_notifier_init(vdev, &vdev->intx.unmask, "intx-unmask", 0)) { + error_setg(errp, "vfio_notifier_init intx-unmask failed"); goto fail; } =20 @@ -165,7 +186,7 @@ fail_vfio: kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, &vdev->intx.interrupt, vdev->intx.route.irq); fail_irqfd: - event_notifier_cleanup(&vdev->intx.unmask); + vfio_notifier_cleanup(vdev, &vdev->intx.unmask, "intx-unmask", 0); fail: qemu_set_fd_handler(irq_fd, vfio_intx_interrupt, NULL, vdev); vfio_unmask_single_irqindex(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX); @@ -194,7 +215,7 @@ static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev) } =20 /* We only need to close the eventfd for VFIO to cleanup the kernel si= de */ - event_notifier_cleanup(&vdev->intx.unmask); + vfio_notifier_cleanup(vdev, &vdev->intx.unmask, "intx-unmask", 0); =20 /* QEMU starts listening for interrupt events. */ qemu_set_fd_handler(event_notifier_get_fd(&vdev->intx.interrupt), @@ -285,9 +306,10 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error= **errp) } #endif =20 - ret =3D event_notifier_init(&vdev->intx.interrupt, 0); + ret =3D vfio_notifier_init(vdev, &vdev->intx.interrupt, "intx-interrup= t", 0); if (ret) { - error_setg_errno(errp, -ret, "event_notifier_init failed"); + error_setg_errno(errp, -ret, + "vfio_notifier_init intx-interrupt failed"); return ret; } fd =3D event_notifier_get_fd(&vdev->intx.interrupt); @@ -296,7 +318,7 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error = **errp) if (vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, fd, errp)) { qemu_set_fd_handler(fd, NULL, NULL, vdev); - event_notifier_cleanup(&vdev->intx.interrupt); + vfio_notifier_cleanup(vdev, &vdev->intx.interrupt, "intx-interrupt= ", 0); return -errno; } =20 @@ -324,7 +346,7 @@ static void vfio_intx_disable(VFIOPCIDevice *vdev) =20 fd =3D event_notifier_get_fd(&vdev->intx.interrupt); qemu_set_fd_handler(fd, NULL, NULL, vdev); - event_notifier_cleanup(&vdev->intx.interrupt); + vfio_notifier_cleanup(vdev, &vdev->intx.interrupt, "intx-interrupt", 0= ); =20 vdev->interrupt =3D VFIO_INT_NONE; =20 @@ -424,13 +446,15 @@ static void vfio_add_kvm_msi_virq(VFIOPCIDevice *vdev= , VFIOMSIVector *vector, vector_n, &vdev->pdev); } =20 -static void vfio_connect_kvm_msi_virq(VFIOMSIVector *vector) +static void vfio_connect_kvm_msi_virq(VFIOMSIVector *vector, int nr) { + const char *name =3D "kvm_interrupt"; + if (vector->virq < 0) { return; } =20 - if (event_notifier_init(&vector->kvm_interrupt, 0)) { + if (vfio_notifier_init(vector->vdev, &vector->kvm_interrupt, name, nr)= ) { goto fail_notifier; } =20 @@ -442,19 +466,20 @@ static void vfio_connect_kvm_msi_virq(VFIOMSIVector *= vector) return; =20 fail_kvm: - event_notifier_cleanup(&vector->kvm_interrupt); + vfio_notifier_cleanup(vector->vdev, &vector->kvm_interrupt, name, nr); fail_notifier: kvm_irqchip_release_virq(kvm_state, vector->virq); vector->virq =3D -1; } =20 -static void vfio_remove_kvm_msi_virq(VFIOMSIVector *vector) +static void vfio_remove_kvm_msi_virq(VFIOPCIDevice *vdev, VFIOMSIVector *v= ector, + int nr) { kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, &vector->kvm_interrup= t, vector->virq); kvm_irqchip_release_virq(kvm_state, vector->virq); vector->virq =3D -1; - event_notifier_cleanup(&vector->kvm_interrupt); + vfio_notifier_cleanup(vdev, &vector->kvm_interrupt, "kvm_interrupt", n= r); } =20 static void vfio_update_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage msg, @@ -464,6 +489,20 @@ static void vfio_update_kvm_msi_virq(VFIOMSIVector *ve= ctor, MSIMessage msg, kvm_irqchip_commit_routes(kvm_state); } =20 +static void vfio_vector_init(VFIOPCIDevice *vdev, int nr) +{ + VFIOMSIVector *vector =3D &vdev->msi_vectors[nr]; + PCIDevice *pdev =3D &vdev->pdev; + + vector->vdev =3D vdev; + vector->virq =3D -1; + if (vfio_notifier_init(vdev, &vector->interrupt, "interrupt", nr)) { + error_report("vfio: vfio_notifier_init interrupt failed"); + } + vector->use =3D true; + msix_vector_use(pdev, nr); +} + static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr, MSIMessage *msg, IOHandler *handler) { @@ -476,13 +515,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, un= signed int nr, vector =3D &vdev->msi_vectors[nr]; =20 if (!vector->use) { - vector->vdev =3D vdev; - vector->virq =3D -1; - if (event_notifier_init(&vector->interrupt, 0)) { - error_report("vfio: Error: event_notifier_init failed"); - } - vector->use =3D true; - msix_vector_use(pdev, nr); + vfio_vector_init(vdev, nr); } =20 qemu_set_fd_handler(event_notifier_get_fd(&vector->interrupt), @@ -494,7 +527,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, uns= igned int nr, */ if (vector->virq >=3D 0) { if (!msg) { - vfio_remove_kvm_msi_virq(vector); + vfio_remove_kvm_msi_virq(vdev, vector, nr); } else { vfio_update_kvm_msi_virq(vector, *msg, pdev); } @@ -506,7 +539,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, uns= igned int nr, vfio_route_change =3D kvm_irqchip_begin_route_changes(kvm_= state); vfio_add_kvm_msi_virq(vdev, vector, nr, true); kvm_irqchip_commit_route_changes(&vfio_route_change); - vfio_connect_kvm_msi_virq(vector); + vfio_connect_kvm_msi_virq(vector, nr); } } } @@ -602,7 +635,7 @@ static void vfio_commit_kvm_msi_virq_batch(VFIOPCIDevic= e *vdev) kvm_irqchip_commit_route_changes(&vfio_route_change); =20 for (i =3D 0; i < vdev->nr_vectors; i++) { - vfio_connect_kvm_msi_virq(&vdev->msi_vectors[i]); + vfio_connect_kvm_msi_virq(&vdev->msi_vectors[i], i); } } =20 @@ -681,8 +714,8 @@ retry: vector->virq =3D -1; vector->use =3D true; =20 - if (event_notifier_init(&vector->interrupt, 0)) { - error_report("vfio: Error: event_notifier_init failed"); + if (vfio_notifier_init(vdev, &vector->interrupt, "interrupt", i)) { + error_report("vfio: Error: vfio_notifier_init failed"); } =20 qemu_set_fd_handler(event_notifier_get_fd(&vector->interrupt), @@ -737,11 +770,11 @@ static void vfio_msi_disable_common(VFIOPCIDevice *vd= ev) VFIOMSIVector *vector =3D &vdev->msi_vectors[i]; if (vdev->msi_vectors[i].use) { if (vector->virq >=3D 0) { - vfio_remove_kvm_msi_virq(vector); + vfio_remove_kvm_msi_virq(vdev, vector, i); } qemu_set_fd_handler(event_notifier_get_fd(&vector->interrupt), NULL, NULL, NULL); - event_notifier_cleanup(&vector->interrupt); + vfio_notifier_cleanup(vdev, &vector->interrupt, "interrupt", i= ); } } =20 @@ -2740,7 +2773,7 @@ static void vfio_register_err_notifier(VFIOPCIDevice = *vdev) return; } =20 - if (event_notifier_init(&vdev->err_notifier, 0)) { + if (vfio_notifier_init(vdev, &vdev->err_notifier, "err_notifier", 0)) { error_report("vfio: Unable to init event notifier for error detect= ion"); vdev->pci_aer =3D false; return; @@ -2753,7 +2786,7 @@ static void vfio_register_err_notifier(VFIOPCIDevice = *vdev) VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); qemu_set_fd_handler(fd, NULL, NULL, vdev); - event_notifier_cleanup(&vdev->err_notifier); + vfio_notifier_cleanup(vdev, &vdev->err_notifier, "err_notifier", 0= ); vdev->pci_aer =3D false; } } @@ -2772,7 +2805,7 @@ static void vfio_unregister_err_notifier(VFIOPCIDevic= e *vdev) } qemu_set_fd_handler(event_notifier_get_fd(&vdev->err_notifier), NULL, NULL, vdev); - event_notifier_cleanup(&vdev->err_notifier); + vfio_notifier_cleanup(vdev, &vdev->err_notifier, "err_notifier", 0); } =20 static void vfio_req_notifier_handler(void *opaque) @@ -2806,7 +2839,7 @@ static void vfio_register_req_notifier(VFIOPCIDevice = *vdev) return; } =20 - if (event_notifier_init(&vdev->req_notifier, 0)) { + if (vfio_notifier_init(vdev, &vdev->req_notifier, "req_notifier", 0)) { error_report("vfio: Unable to init event notifier for device reque= st"); return; } @@ -2818,7 +2851,7 @@ static void vfio_register_req_notifier(VFIOPCIDevice = *vdev) VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); qemu_set_fd_handler(fd, NULL, NULL, vdev); - event_notifier_cleanup(&vdev->req_notifier); + vfio_notifier_cleanup(vdev, &vdev->req_notifier, "req_notifier", 0= ); } else { vdev->req_enabled =3D true; } @@ -2838,7 +2871,7 @@ static void vfio_unregister_req_notifier(VFIOPCIDevic= e *vdev) } qemu_set_fd_handler(event_notifier_get_fd(&vdev->req_notifier), NULL, NULL, vdev); - event_notifier_cleanup(&vdev->req_notifier); + vfio_notifier_cleanup(vdev, &vdev->req_notifier, "req_notifier", 0); =20 vdev->req_enabled =3D false; } --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305949; cv=none; d=zohomail.com; s=zohoarc; b=cbM438lT4A/FY82aOLnNB6szHmy9S0g0BPPubLUlOw7TaKvw44g7CnrEG0afZfts0wzvehh+1VJhK7aaUDQBr4+dyy4QdTcXvP4kqS5INgByk4HlcoSXxj4E05icawOZO58QmBor2qrbnh3A0Rt+kcFKvHypZ6RI+/9GyUE2Uzs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305949; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=aDby7CAiXypZ4R7hIBbF9zwQEAmWYCb6ok4J3j3LVzE=; b=BD038gTgLnUb21PeKZawxPRN0/PyScOga9O+h3v9SyKIWc+TftbLi5snPmp+Uhn0Xvo6+GNr2qa9u2BAORkcs3FeSuDeRKRj5LRVMPt6q2YatxDtgGOokYqC/MaFowU3YcVbgYbg4H6XLHOdP2wtVcnaCuIISrjD6FqCNzLEec8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305949599663.1091436574084; Wed, 15 Jun 2022 08:12:29 -0700 (PDT) Received: from localhost ([::1]:48316 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uh1-0000Ve-Tt for importer@patchew.org; Wed, 15 Jun 2022 11:12:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOq-0007ol-2y for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:40 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:14032) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOm-00016f-V4 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:39 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FEE6kf002105; Wed, 15 Jun 2022 14:53:02 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrskd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:02 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ72S023081; Wed, 15 Jun 2022 14:53:01 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq0d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:01 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNb018501; Wed, 15 Jun 2022 14:53:00 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-28; Wed, 15 Jun 2022 14:53:00 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=aDby7CAiXypZ4R7hIBbF9zwQEAmWYCb6ok4J3j3LVzE=; b=RsYgqW9S3Yi8o4KXcSmxx35/debNmVucbLPuOm4p4z0FinGtM/oFG+xnjscKTtBO1KzU FFH6CaxKiRCy8i5ABm5H2kPn/h7UwetaC53L+JsfqLya/qfN/SYTizy9Za/tqaQTz8c/ zafqdEaXWQgcVRqTgwG4oVY/hfyucL/HzQtdP88dDIyt1z04ssWE7jJfjhDGcyGR9thH CryY96D+Dq30COG0qf61qvvplRf7a+eXvNVH+61TYhUzXPD/IzQt/rDO75EHKW2ldPb7 /RHHoLgZvo71KQGewmq6nnwg3YZLXkzhA20yObMJH5O16933/enlx8Feih+r+S/2Wgcj lA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 27/39] vfio-pci: cpr part 1 (fd and dma) Date: Wed, 15 Jun 2022 07:52:14 -0700 Message-Id: <1655304746-102776-28-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: 5hfGy1A1AQFrl6v4dSOI5d8W3PS6fIrR X-Proofpoint-GUID: 5hfGy1A1AQFrl6v4dSOI5d8W3PS6fIrR Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305951640100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Enable vfio-pci devices to be saved and restored across an exec restart of qemu. At vfio creation time, save the value of vfio container, group, and device descriptors in cpr state. In the container pre_save handler, suspend the use of virtual addresses in DMA mappings with VFIO_DMA_UNMAP_FLAG_VADDR, because guest ram will be remapped at a different VA after exec. DMA to already-mapped pages continues. Save the msi message area as part of vfio-pci vmstate, save the interrupt and notifier eventfd's in cpr state, and clear the close-on-exec flag for the vfio descriptors. The flag is not cleared earlier because the descriptors should not persist across miscellaneous fork and exec calls that may be performed during normal operation. On qemu restart, vfio_realize() finds the saved descriptors, uses the descriptors, and notes that the device is being reused. Device and iommu state is already configured, so operations in vfio_realize that would modify the configuration are skipped for a reused device, including vfio ioctl's and writes to PCI configuration space. Vfio PCI device reset is also suppressed. The result is that vfio_realize constructs qemu data structures that reflect the current state of the device. However, the reconstruction is not complete until cpr-load is called. cpr-load loads the msi data. The vfio post_load handler finds eventfds in cpr state, rebuilds vector data structures, and attaches the interrupts to the new KVM instance. The container post_load handler then invokes the main vfio listener callback, which walks the flattened ranges of the vfio address space and calls VFIO_DMA_MAP_FLAG_VADDR to inform the kernel of the new VA's. Lastly, cpr-load starts the VM. This functionality is delivered by 3 patches for clarity. Part 1 handles device file descriptors and DMA. Part 2 adds eventfd and MSI/MSI-X vector support. Part 3 adds INTX support. Signed-off-by: Steve Sistare --- MAINTAINERS | 1 + hw/pci/pci.c | 12 ++++ hw/vfio/common.c | 151 +++++++++++++++++++++++++++++++++++---= ---- hw/vfio/cpr.c | 119 +++++++++++++++++++++++++++++++++ hw/vfio/meson.build | 1 + hw/vfio/pci.c | 44 ++++++++++++ hw/vfio/trace-events | 1 + include/hw/vfio/vfio-common.h | 11 +++ include/migration/vmstate.h | 1 + 9 files changed, 317 insertions(+), 24 deletions(-) create mode 100644 hw/vfio/cpr.c diff --git a/MAINTAINERS b/MAINTAINERS index 74a43e6..864aec6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3156,6 +3156,7 @@ CPR M: Steve Sistare M: Mark Kanda S: Maintained +F: hw/vfio/cpr.c F: include/migration/cpr.h F: migration/cpr.c F: qapi/cpr.json diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 6e70153..a3b19eb 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -32,6 +32,7 @@ #include "hw/pci/pci_host.h" #include "hw/qdev-properties.h" #include "hw/qdev-properties-system.h" +#include "migration/cpr.h" #include "migration/qemu-file-types.h" #include "migration/vmstate.h" #include "monitor/monitor.h" @@ -341,6 +342,17 @@ static void pci_reset_regions(PCIDevice *dev) =20 static void pci_do_device_reset(PCIDevice *dev) { + /* + * A PCI device that is resuming for cpr is already configured, so do + * not reset it here when we are called from qemu_system_reset prior to + * cpr-load, else interrupts may be lost for vfio-pci devices. It is + * safe to skip this reset for all PCI devices, because cpr-load will = set + * all fields that would have been set here. + */ + if (cpr_get_mode() =3D=3D CPR_MODE_RESTART) { + return; + } + pci_device_deassert_intx(dev); assert(dev->irq_state =3D=3D 0); =20 diff --git a/hw/vfio/common.c b/hw/vfio/common.c index ace9562..c7d73b6 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -31,6 +31,7 @@ #include "exec/memory.h" #include "exec/ram_addr.h" #include "hw/hw.h" +#include "migration/cpr.h" #include "qemu/error-report.h" #include "qemu/main-loop.h" #include "qemu/range.h" @@ -460,6 +461,8 @@ static int vfio_dma_unmap(VFIOContainer *container, .size =3D size, }; =20 + assert(!container->reused); + if (iotlb && container->dirty_pages_supported && vfio_devices_all_running_and_saving(container)) { return vfio_dma_unmap_bitmap(container, iova, size, iotlb); @@ -496,12 +499,24 @@ static int vfio_dma_map(VFIOContainer *container, hwa= ddr iova, { struct vfio_iommu_type1_dma_map map =3D { .argsz =3D sizeof(map), - .flags =3D VFIO_DMA_MAP_FLAG_READ, .vaddr =3D (__u64)(uintptr_t)vaddr, .iova =3D iova, .size =3D size, }; =20 + /* + * Set the new vaddr for any mappings registered during cpr-load. + * Reused is cleared thereafter. + */ + if (container->reused) { + map.flags =3D VFIO_DMA_MAP_FLAG_VADDR; + if (ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map)) { + goto fail; + } + return 0; + } + + map.flags =3D VFIO_DMA_MAP_FLAG_READ; if (!readonly) { map.flags |=3D VFIO_DMA_MAP_FLAG_WRITE; } @@ -517,7 +532,9 @@ static int vfio_dma_map(VFIOContainer *container, hwadd= r iova, return 0; } =20 - error_report("VFIO_MAP_DMA failed: %s", strerror(errno)); +fail: + error_report("vfio_dma_map %s (iova %lu, size %ld, va %p): %s", + (container->reused ? "VADDR" : ""), iova, size, vaddr, strerror(er= rno)); return -errno; } =20 @@ -882,6 +899,12 @@ static void vfio_listener_region_add(MemoryListener *l= istener, MemoryRegionSection *section) { VFIOContainer *container =3D container_of(listener, VFIOContainer, lis= tener); + vfio_container_region_add(container, section); +} + +void vfio_container_region_add(VFIOContainer *container, + MemoryRegionSection *section) +{ hwaddr iova, end; Int128 llend, llsize; void *vaddr; @@ -1492,6 +1515,12 @@ static void vfio_listener_release(VFIOContainer *con= tainer) } } =20 +void vfio_listener_register(VFIOContainer *container) +{ + container->listener =3D vfio_memory_listener; + memory_listener_register(&container->listener, container->space->as); +} + static struct vfio_info_cap_header * vfio_get_cap(void *ptr, uint32_t cap_offset, uint16_t id) { @@ -1910,6 +1939,22 @@ static int vfio_init_container(VFIOContainer *contai= ner, int group_fd, { int iommu_type, ret; =20 + /* + * If container is reused, just set its type and skip the ioctls, as t= he + * container and group are already configured in the kernel. + * VFIO_TYPE1v2_IOMMU is the only type that supports reuse/cpr. + */ + if (container->reused) { + if (ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_TYPE1v2_IOMMU)= ) { + container->iommu_type =3D VFIO_TYPE1v2_IOMMU; + return 0; + } else { + error_setg(errp, "container was reused but VFIO_TYPE1v2_IOMMU " + "is not supported"); + return -errno; + } + } + iommu_type =3D vfio_get_iommu_type(container, errp); if (iommu_type < 0) { return iommu_type; @@ -2014,9 +2059,12 @@ static int vfio_connect_container(VFIOGroup *group, = AddressSpace *as, { VFIOContainer *container; int ret, fd; + bool reused; VFIOAddressSpace *space; =20 space =3D vfio_get_address_space(as); + fd =3D cpr_find_fd("vfio_container_for_group", group->groupid); + reused =3D (fd > 0); =20 /* * VFIO is currently incompatible with discarding of RAM insofar as the @@ -2049,27 +2097,47 @@ static int vfio_connect_container(VFIOGroup *group,= AddressSpace *as, * details once we know which type of IOMMU we are using. */ =20 + /* + * If the container is reused, then the group is already attached in t= he + * kernel. If a container with matching fd is found, then update the + * userland group list and return. If not, then after the loop, create + * the container struct and group list. + */ + QLIST_FOREACH(container, &space->containers, next) { - if (!ioctl(group->fd, VFIO_GROUP_SET_CONTAINER, &container->fd)) { - ret =3D vfio_ram_block_discard_disable(container, true); - if (ret) { - error_setg_errno(errp, -ret, - "Cannot set discarding of RAM broken"); - if (ioctl(group->fd, VFIO_GROUP_UNSET_CONTAINER, - &container->fd)) { - error_report("vfio: error disconnecting group %d from" - " container", group->groupid); - } - return ret; + if (reused) { + if (container->fd !=3D fd) { + continue; } - group->container =3D container; - QLIST_INSERT_HEAD(&container->group_list, group, container_nex= t); + } else if (ioctl(group->fd, VFIO_GROUP_SET_CONTAINER, &container->= fd)) { + continue; + } + + ret =3D vfio_ram_block_discard_disable(container, true); + if (ret) { + error_setg_errno(errp, -ret, + "Cannot set discarding of RAM broken"); + if (ioctl(group->fd, VFIO_GROUP_UNSET_CONTAINER, + &container->fd)) { + error_report("vfio: error disconnecting group %d from" + " container", group->groupid); + } + return ret; + } + group->container =3D container; + QLIST_INSERT_HEAD(&container->group_list, group, container_next); + if (!reused) { vfio_kvm_device_add_group(group); - return 0; + cpr_save_fd("vfio_container_for_group", group->groupid, + container->fd); } + return 0; + } + + if (!reused) { + fd =3D qemu_open_old("/dev/vfio/vfio", O_RDWR); } =20 - fd =3D qemu_open_old("/dev/vfio/vfio", O_RDWR); if (fd < 0) { error_setg_errno(errp, errno, "failed to open /dev/vfio/vfio"); ret =3D -errno; @@ -2087,6 +2155,7 @@ static int vfio_connect_container(VFIOGroup *group, A= ddressSpace *as, container =3D g_malloc0(sizeof(*container)); container->space =3D space; container->fd =3D fd; + container->reused =3D reused; container->error =3D NULL; container->dirty_pages_supported =3D false; container->dma_max_mappings =3D 0; @@ -2099,6 +2168,11 @@ static int vfio_connect_container(VFIOGroup *group, = AddressSpace *as, goto free_container_exit; } =20 + ret =3D vfio_cpr_register_container(container, errp); + if (ret) { + goto free_container_exit; + } + ret =3D vfio_ram_block_discard_disable(container, true); if (ret) { error_setg_errno(errp, -ret, "Cannot set discarding of RAM broken"= ); @@ -2213,9 +2287,16 @@ static int vfio_connect_container(VFIOGroup *group, = AddressSpace *as, group->container =3D container; QLIST_INSERT_HEAD(&container->group_list, group, container_next); =20 - container->listener =3D vfio_memory_listener; - - memory_listener_register(&container->listener, container->space->as); + /* + * If reused, register the listener later, after all state that may + * affect regions and mapping boundaries has been cpr-load'ed. Later, + * the listener will invoke its callback on each flat section and call + * vfio_dma_map to supply the new vaddr, and the calls will match the + * mappings remembered by the kernel. + */ + if (!reused) { + vfio_listener_register(container); + } =20 if (container->error) { ret =3D -1; @@ -2225,8 +2306,9 @@ static int vfio_connect_container(VFIOGroup *group, A= ddressSpace *as, } =20 container->initialized =3D true; + ret =3D cpr_resave_fd("vfio_container_for_group", group->groupid, fd, = errp); =20 - return 0; + return ret; listener_release_exit: QLIST_REMOVE(group, container_next); QLIST_REMOVE(container, next); @@ -2254,6 +2336,7 @@ static void vfio_disconnect_container(VFIOGroup *grou= p) =20 QLIST_REMOVE(group, container_next); group->container =3D NULL; + cpr_delete_fd("vfio_container_for_group", group->groupid); =20 /* * Explicitly release the listener first before unset container, @@ -2290,6 +2373,7 @@ static void vfio_disconnect_container(VFIOGroup *grou= p) } =20 trace_vfio_disconnect_container(container->fd); + vfio_cpr_unregister_container(container); close(container->fd); g_free(container); =20 @@ -2319,7 +2403,12 @@ VFIOGroup *vfio_get_group(int groupid, AddressSpace = *as, Error **errp) group =3D g_malloc0(sizeof(*group)); =20 snprintf(path, sizeof(path), "/dev/vfio/%d", groupid); - group->fd =3D qemu_open_old(path, O_RDWR); + + group->fd =3D cpr_find_fd("vfio_group", groupid); + if (group->fd < 0) { + group->fd =3D qemu_open_old(path, O_RDWR); + } + if (group->fd < 0) { error_setg_errno(errp, errno, "failed to open %s", path); goto free_group_exit; @@ -2353,6 +2442,10 @@ VFIOGroup *vfio_get_group(int groupid, AddressSpace = *as, Error **errp) =20 QLIST_INSERT_HEAD(&vfio_group_list, group, next); =20 + if (cpr_resave_fd("vfio_group", groupid, group->fd, errp)) { + goto close_fd_exit; + } + return group; =20 close_fd_exit: @@ -2377,6 +2470,7 @@ void vfio_put_group(VFIOGroup *group) vfio_disconnect_container(group); QLIST_REMOVE(group, next); trace_vfio_put_group(group->fd); + cpr_delete_fd("vfio_group", group->groupid); close(group->fd); g_free(group); =20 @@ -2390,8 +2484,14 @@ int vfio_get_device(VFIOGroup *group, const char *na= me, { struct vfio_device_info dev_info =3D { .argsz =3D sizeof(dev_info) }; int ret, fd; + bool reused; + + fd =3D cpr_find_fd(name, 0); + reused =3D (fd >=3D 0); + if (!reused) { + fd =3D ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, name); + } =20 - fd =3D ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, name); if (fd < 0) { error_setg_errno(errp, errno, "error getting device from group %d", group->groupid); @@ -2436,12 +2536,14 @@ int vfio_get_device(VFIOGroup *group, const char *n= ame, vbasedev->num_irqs =3D dev_info.num_irqs; vbasedev->num_regions =3D dev_info.num_regions; vbasedev->flags =3D dev_info.flags; + vbasedev->reused =3D reused; =20 trace_vfio_get_device(name, dev_info.flags, dev_info.num_regions, dev_info.num_irqs); =20 vbasedev->reset_works =3D !!(dev_info.flags & VFIO_DEVICE_FLAGS_RESET); - return 0; + ret =3D cpr_resave_fd(name, 0, fd, errp); + return ret; } =20 void vfio_put_base_device(VFIODevice *vbasedev) @@ -2452,6 +2554,7 @@ void vfio_put_base_device(VFIODevice *vbasedev) QLIST_REMOVE(vbasedev, next); vbasedev->group =3D NULL; trace_vfio_put_base_device(vbasedev->fd); + cpr_delete_fd(vbasedev->name, 0); close(vbasedev->fd); } =20 diff --git a/hw/vfio/cpr.c b/hw/vfio/cpr.c new file mode 100644 index 0000000..a227d5e --- /dev/null +++ b/hw/vfio/cpr.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include +#include +#include "hw/vfio/vfio-common.h" +#include "sysemu/kvm.h" +#include "qapi/error.h" +#include "migration/cpr.h" +#include "migration/vmstate.h" +#include "trace.h" + +static int +vfio_dma_unmap_vaddr_all(VFIOContainer *container, Error **errp) +{ + struct vfio_iommu_type1_dma_unmap unmap =3D { + .argsz =3D sizeof(unmap), + .flags =3D VFIO_DMA_UNMAP_FLAG_VADDR | VFIO_DMA_UNMAP_FLAG_ALL, + .iova =3D 0, + .size =3D 0, + }; + if (ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, &unmap)) { + error_setg_errno(errp, errno, "vfio_dma_unmap_vaddr_all"); + return -errno; + } + container->vaddr_unmapped =3D true; + return 0; +} + +static bool vfio_is_cpr_capable(VFIOContainer *container, Error **errp) +{ + if (!ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UPDATE_VADDR) || + !ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL)) { + error_setg(errp, "VFIO container does not support VFIO_UPDATE_VADD= R " + "or VFIO_UNMAP_ALL"); + return false; + } else { + return true; + } +} + +static bool vfio_vmstate_needed(void *opaque) +{ + return cpr_get_mode() =3D=3D CPR_MODE_RESTART; +} + +static int vfio_container_pre_save(void *opaque) +{ + VFIOContainer *container =3D (VFIOContainer *)opaque; + Error *err; + + if (!vfio_is_cpr_capable(container, &err) || + vfio_dma_unmap_vaddr_all(container, &err)) { + error_report_err(err); + return -1; + } + return 0; +} + +static int vfio_container_post_load(void *opaque, int version_id) +{ + VFIOContainer *container =3D (VFIOContainer *)opaque; + VFIOGroup *group; + Error *err; + VFIODevice *vbasedev; + + if (!vfio_is_cpr_capable(container, &err)) { + error_report_err(err); + return -1; + } + + vfio_listener_register(container); + container->reused =3D false; + + QLIST_FOREACH(group, &container->group_list, container_next) { + QLIST_FOREACH(vbasedev, &group->device_list, next) { + vbasedev->reused =3D false; + } + } + return 0; +} + +static const VMStateDescription vfio_container_vmstate =3D { + .name =3D "vfio-container", + .unmigratable =3D 1, + .version_id =3D 0, + .minimum_version_id =3D 0, + .pre_save =3D vfio_container_pre_save, + .post_load =3D vfio_container_post_load, + .needed =3D vfio_vmstate_needed, + .fields =3D (VMStateField[]) { + VMSTATE_END_OF_LIST() + } +}; + +int vfio_cpr_register_container(VFIOContainer *container, Error **errp) +{ + container->cpr_blocker =3D NULL; + if (!vfio_is_cpr_capable(container, &container->cpr_blocker)) { + return cpr_add_blocker(&container->cpr_blocker, errp, + CPR_MODE_RESTART, 0); + } + + vmstate_register(NULL, -1, &vfio_container_vmstate, container); + + return 0; +} + +void vfio_cpr_unregister_container(VFIOContainer *container) +{ + cpr_del_blocker(&container->cpr_blocker); + + vmstate_unregister(NULL, &vfio_container_vmstate, container); +} diff --git a/hw/vfio/meson.build b/hw/vfio/meson.build index da9af29..e247b2b 100644 --- a/hw/vfio/meson.build +++ b/hw/vfio/meson.build @@ -5,6 +5,7 @@ vfio_ss.add(files( 'migration.c', )) vfio_ss.add(when: 'CONFIG_VFIO_PCI', if_true: files( + 'cpr.c', 'display.c', 'pci-quirks.c', 'pci.c', diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 0143c9a..237231b 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -30,6 +30,7 @@ #include "hw/qdev-properties-system.h" #include "migration/vmstate.h" #include "qapi/qmp/qdict.h" +#include "migration/cpr.h" #include "qemu/error-report.h" #include "qemu/main-loop.h" #include "qemu/module.h" @@ -2514,6 +2515,7 @@ const VMStateDescription vmstate_vfio_pci_config =3D { .name =3D "VFIOPCIDevice", .version_id =3D 1, .minimum_version_id =3D 1, + .priority =3D MIG_PRI_VFIO_PCI, /* * must load before container */ .fields =3D (VMStateField[]) { VMSTATE_PCI_DEVICE(pdev, VFIOPCIDevice), VMSTATE_MSIX_TEST(pdev, VFIOPCIDevice, vfio_msix_present), @@ -3243,6 +3245,11 @@ static void vfio_pci_reset(DeviceState *dev) { VFIOPCIDevice *vdev =3D VFIO_PCI(dev); =20 + /* Do not reset the device during qemu_system_reset prior to cpr-load = */ + if (vdev->vbasedev.reused) { + return; + } + trace_vfio_pci_reset(vdev->vbasedev.name); =20 vfio_pci_pre_reset(vdev); @@ -3350,6 +3357,42 @@ static Property vfio_pci_dev_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +/* + * The kernel may change non-emulated config bits. Exclude them from the + * changed-bits check in get_pci_config_device. + */ +static int vfio_pci_pre_load(void *opaque) +{ + VFIOPCIDevice *vdev =3D opaque; + PCIDevice *pdev =3D &vdev->pdev; + int size =3D MIN(pci_config_size(pdev), vdev->config_size); + int i; + + for (i =3D 0; i < size; i++) { + pdev->cmask[i] &=3D vdev->emulated_config_bits[i]; + } + + return 0; +} + +static bool vfio_pci_needed(void *opaque) +{ + return cpr_get_mode() =3D=3D CPR_MODE_RESTART; +} + +static const VMStateDescription vfio_pci_vmstate =3D { + .name =3D "vfio-pci", + .unmigratable =3D 1, + .version_id =3D 0, + .minimum_version_id =3D 0, + .priority =3D MIG_PRI_VFIO_PCI, /* must load before container */ + .pre_load =3D vfio_pci_pre_load, + .needed =3D vfio_pci_needed, + .fields =3D (VMStateField[]) { + VMSTATE_END_OF_LIST() + } +}; + static void vfio_pci_dev_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -3357,6 +3400,7 @@ static void vfio_pci_dev_class_init(ObjectClass *klas= s, void *data) =20 dc->reset =3D vfio_pci_reset; device_class_set_props(dc, vfio_pci_dev_properties); + dc->vmsd =3D &vfio_pci_vmstate; dc->desc =3D "VFIO-based PCI device assignment"; set_bit(DEVICE_CATEGORY_MISC, dc->categories); pdc->realize =3D vfio_realize; diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index 73dffe9..a6d0034 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -119,6 +119,7 @@ vfio_region_sparse_mmap_header(const char *name, int in= dex, int nr_areas) "Devic vfio_region_sparse_mmap_entry(int i, unsigned long start, unsigned long en= d) "sparse entry %d [0x%lx - 0x%lx]" vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t s= ubtype) "%s index %d, %08x/%0x8" vfio_dma_unmap_overflow_workaround(void) "" +vfio_region_remap(const char *name, int fd, uint64_t iova_start, uint64_t = iova_end, void *vaddr) "%s fd %d 0x%"PRIx64" - 0x%"PRIx64" [%p]" =20 # platform.c vfio_platform_base_device_init(char *name, int groupid) "%s belongs to gro= up #%d" diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index e573f5a..17ad9ba 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -81,10 +81,14 @@ typedef struct VFIOContainer { int fd; /* /dev/vfio/vfio, empowered by the attached groups */ MemoryListener listener; MemoryListener prereg_listener; + Notifier cpr_notifier; + Error *cpr_blocker; unsigned iommu_type; Error *error; bool initialized; bool dirty_pages_supported; + bool reused; + bool vaddr_unmapped; uint64_t dirty_pgsizes; uint64_t max_dirty_bitmap_size; unsigned long pgsizes; @@ -136,6 +140,7 @@ typedef struct VFIODevice { bool no_mmap; bool ram_block_discard_allowed; bool enable_migration; + bool reused; VFIODeviceOps *ops; unsigned int num_irqs; unsigned int num_regions; @@ -213,6 +218,9 @@ void vfio_put_group(VFIOGroup *group); int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vbasedev, Error **errp); =20 +int vfio_cpr_register_container(VFIOContainer *container, Error **errp); +void vfio_cpr_unregister_container(VFIOContainer *container); + extern const MemoryRegionOps vfio_region_ops; typedef QLIST_HEAD(VFIOGroupList, VFIOGroup) VFIOGroupList; extern VFIOGroupList vfio_group_list; @@ -234,6 +242,9 @@ struct vfio_info_cap_header * vfio_get_device_info_cap(struct vfio_device_info *info, uint16_t id); #endif extern const MemoryListener vfio_prereg_listener; +void vfio_listener_register(VFIOContainer *container); +void vfio_container_region_add(VFIOContainer *container, + MemoryRegionSection *section); =20 int vfio_spapr_create_window(VFIOContainer *container, MemoryRegionSection *section, diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index ad24aa1..19f1538 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -157,6 +157,7 @@ typedef enum { MIG_PRI_GICV3_ITS, /* Must happen before PCI devices */ MIG_PRI_GICV3, /* Must happen before the ITS */ MIG_PRI_MAX, + MIG_PRI_VFIO_PCI =3D MIG_PRI_IOMMU, } MigrationPriority; =20 struct VMStateField { --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306439; cv=none; d=zohomail.com; s=zohoarc; b=PFx1OuxK1qPL8wjX2uyUK8GJ3UzXgpX3DsquzyUvndlce+khd/KdZnIlkYj+GoBYIgL+lpF0oUWmXEIf/CBP0tvIu768AY57p3casTf6+Jsiq4cuD2nqSOA9u0Cyf5blSYDOajlQw2PQ6x+e9q4y9u8jeoREzQWxGkHdyX0bOJ4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306439; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=+mphpuKAc3NlR4KCnTDoo1E2ZOtc0VgbfuV5Tqgwm1Y=; b=njSEt2600drDVcPSRicwV/mS+HGPrZc7UVEIbhogFa6XCvrvUQCM2csrTOfeOK0tEY8U0Eo0S77boAFcV1Uvv84+imPP5NIeHmreExHJwK6a1t94/BE2a+MNH6+jqlVjkYYXPsuuzLn8jt2osn4hV2wUe9SZxZCNt4cZko3pnU8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306439295930.1538271238494; Wed, 15 Jun 2022 08:20:39 -0700 (PDT) Received: from localhost ([::1]:34508 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uow-0002zG-4P for importer@patchew.org; Wed, 15 Jun 2022 11:20:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47678) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOc-0007Oc-DD for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:26 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:43276) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOZ-00016C-Ss for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:26 -0400 Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE3B9q000856; Wed, 15 Jun 2022 14:53:03 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjx9gng5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:03 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7Ma023112; Wed, 15 Jun 2022 14:53:02 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq1a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:02 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNd018501; Wed, 15 Jun 2022 14:53:02 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-29; Wed, 15 Jun 2022 14:53:02 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=+mphpuKAc3NlR4KCnTDoo1E2ZOtc0VgbfuV5Tqgwm1Y=; b=XhHGi9hro9ffh8piXEHvrqhVxbzRdz3+PLaBvzlVwhGHHMp488htZRxIJBRCSMRFEZlx dAz0nyTpHZ094Hh02Wy5cMiJw8QR7Z28HkNH5xUUA4AN2gcuIGGtxw2Wfc4oN/Co2g4w dcvuFFptYPIMtqaSUB+kZjbRtRRomW47wdLsIBEujO/k33QeVfnsAch1utZ1AHnsg3bx fNhhnytWIzjVetsJBQmDqdOn2svi9BqibMS8mQ7yfTAvGVmhbjOpDLlSrJP+hTxtqUng dSffbq5kI5sJIERRTLDPtDRO9p7MvsRqODlSr1Ng1uJZGZ9HN8FmIE0H+OYc/4ISPmWJ NQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 28/39] vfio-pci: cpr part 2 (msi) Date: Wed, 15 Jun 2022 07:52:15 -0700 Message-Id: <1655304746-102776-29-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: 1NvWswczFMGoAQcS8js6Ztusq7cWiwao X-Proofpoint-GUID: 1NvWswczFMGoAQcS8js6Ztusq7cWiwao 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_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306440813100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Finish cpr for vfio-pci MSI/MSI-X devices by preserving eventfd's and vector state. Signed-off-by: Steve Sistare --- hw/vfio/pci.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 237231b..2fd7121 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -53,17 +53,53 @@ static void vfio_disable_interrupts(VFIOPCIDevice *vdev= ); static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled); static void vfio_msi_disable_common(VFIOPCIDevice *vdev); =20 +#define EVENT_FD_NAME(vdev, name) \ + g_strdup_printf("%s_%s", (vdev)->vbasedev.name, (name)) + +static int save_event_fd(VFIOPCIDevice *vdev, const char *name, int nr, + EventNotifier *ev) +{ + int fd =3D event_notifier_get_fd(ev); + + if (fd >=3D 0) { + Error *err; + g_autofree char *fdname =3D EVENT_FD_NAME(vdev, name); + + if (cpr_resave_fd(fdname, nr, fd, &err)) { + error_report_err(err); + return 1; + } + } + return 0; +} + +static int load_event_fd(VFIOPCIDevice *vdev, const char *name, int nr) +{ + g_autofree char *fdname =3D EVENT_FD_NAME(vdev, name); + int fd =3D cpr_find_fd(fdname, nr); + return fd; +} + +static void delete_event_fd(VFIOPCIDevice *vdev, const char *name, int nr) +{ + g_autofree char *fdname =3D EVENT_FD_NAME(vdev, name); + cpr_delete_fd(fdname, nr); +} + /* Create new or reuse existing eventfd */ static int vfio_notifier_init(VFIOPCIDevice *vdev, EventNotifier *e, const char *name, int nr) { - int fd =3D -1; /* placeholder until a subsequent patch */ int ret =3D 0; + int fd =3D load_event_fd(vdev, name, nr); =20 if (fd >=3D 0) { event_notifier_init_fd(e, fd); } else { ret =3D event_notifier_init(e, 0); + if (!ret) { + save_event_fd(vdev, name, nr, e); + } } return ret; } @@ -71,6 +107,7 @@ static int vfio_notifier_init(VFIOPCIDevice *vdev, Event= Notifier *e, static void vfio_notifier_cleanup(VFIOPCIDevice *vdev, EventNotifier *e, const char *name, int nr) { + delete_event_fd(vdev, name, nr); event_notifier_cleanup(e); } =20 @@ -511,6 +548,15 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, un= signed int nr, VFIOMSIVector *vector; int ret; =20 + /* + * Ignore the callback from msix_set_vector_notifiers during resume. + * The necessary subset of these actions is called from vfio_claim_vec= tors + * during post load. + */ + if (vdev->vbasedev.reused) { + return 0; + } + trace_vfio_msix_vector_do_use(vdev->vbasedev.name, nr); =20 vector =3D &vdev->msi_vectors[nr]; @@ -2784,6 +2830,11 @@ static void vfio_register_err_notifier(VFIOPCIDevice= *vdev) fd =3D event_notifier_get_fd(&vdev->err_notifier); qemu_set_fd_handler(fd, vfio_err_notifier_handler, NULL, vdev); =20 + /* Do not alter irq_signaling during vfio_realize for cpr */ + if (vdev->vbasedev.reused) { + return; + } + if (vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_ERR_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); @@ -2849,6 +2900,12 @@ static void vfio_register_req_notifier(VFIOPCIDevice= *vdev) fd =3D event_notifier_get_fd(&vdev->req_notifier); qemu_set_fd_handler(fd, vfio_req_notifier_handler, NULL, vdev); =20 + /* Do not alter irq_signaling during vfio_realize for cpr */ + if (vdev->vbasedev.reused) { + vdev->req_enabled =3D true; + return; + } + if (vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_REQ_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) { error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); @@ -3357,6 +3414,43 @@ static Property vfio_pci_dev_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static void vfio_claim_vectors(VFIOPCIDevice *vdev, int nr_vectors, bool m= six) +{ + int i, fd; + bool pending =3D false; + PCIDevice *pdev =3D &vdev->pdev; + + vdev->nr_vectors =3D nr_vectors; + vdev->msi_vectors =3D g_new0(VFIOMSIVector, nr_vectors); + vdev->interrupt =3D msix ? VFIO_INT_MSIX : VFIO_INT_MSI; + + for (i =3D 0; i < nr_vectors; i++) { + VFIOMSIVector *vector =3D &vdev->msi_vectors[i]; + + fd =3D load_event_fd(vdev, "interrupt", i); + if (fd >=3D 0) { + vfio_vector_init(vdev, i); + qemu_set_fd_handler(fd, vfio_msi_interrupt, NULL, vector); + } + + if (load_event_fd(vdev, "kvm_interrupt", i) >=3D 0) { + vfio_route_change =3D kvm_irqchip_begin_route_changes(kvm_stat= e); + vfio_add_kvm_msi_virq(vdev, vector, i, msix); + kvm_irqchip_commit_route_changes(&vfio_route_change); + vfio_connect_kvm_msi_virq(vector, i); + } + + if (msix && msix_is_pending(pdev, i) && msix_is_masked(pdev, i)) { + set_bit(i, vdev->msix->pending); + pending =3D true; + } + } + + if (msix) { + memory_region_set_enabled(&pdev->msix_pba_mmio, pending); + } +} + /* * The kernel may change non-emulated config bits. Exclude them from the * changed-bits check in get_pci_config_device. @@ -3375,6 +3469,29 @@ static int vfio_pci_pre_load(void *opaque) return 0; } =20 +static int vfio_pci_post_load(void *opaque, int version_id) +{ + VFIOPCIDevice *vdev =3D opaque; + PCIDevice *pdev =3D &vdev->pdev; + int nr_vectors; + + if (msix_enabled(pdev)) { + msix_set_vector_notifiers(pdev, vfio_msix_vector_use, + vfio_msix_vector_release, NULL); + nr_vectors =3D vdev->msix->entries; + vfio_claim_vectors(vdev, nr_vectors, true); + + } else if (msi_enabled(pdev)) { + nr_vectors =3D msi_nr_vectors_allocated(pdev); + vfio_claim_vectors(vdev, nr_vectors, false); + + } else if (vfio_pci_read_config(pdev, PCI_INTERRUPT_PIN, 1)) { + assert(0); /* completed in a subsequent patch */ + } + + return 0; +} + static bool vfio_pci_needed(void *opaque) { return cpr_get_mode() =3D=3D CPR_MODE_RESTART; @@ -3387,8 +3504,11 @@ static const VMStateDescription vfio_pci_vmstate =3D= { .minimum_version_id =3D 0, .priority =3D MIG_PRI_VFIO_PCI, /* must load before container */ .pre_load =3D vfio_pci_pre_load, + .post_load =3D vfio_pci_post_load, .needed =3D vfio_pci_needed, .fields =3D (VMStateField[]) { + VMSTATE_PCI_DEVICE(pdev, VFIOPCIDevice), + VMSTATE_MSIX_TEST(pdev, VFIOPCIDevice, vfio_msix_present), VMSTATE_END_OF_LIST() } }; --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305620; cv=none; d=zohomail.com; s=zohoarc; b=iUlEz3O1Ze1Nm2TDiHSmNIoik9px/RrMAxdv39V/rKl+1mJIqYEdgjLQggxR8Krt+ppvCPYxFtos8hMo8XgNyj71gx+G7/qACTYczRgbyP1b26FMJFQKLRl1cDaM63DwFKR+WOQWdXDc6iu7JRoNaA5y+Z2Mp+aoREX7z7M8kkQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305620; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=tzSCMG7bNQDetdCrE5pKsy8MNosMSyxzTyUFS4jJchA=; b=JDyDyyCr8NgVEMyI0oybR4iMBqFan2fhH3I3E3ygkWJSZ0zxA4ZWX7s336LdsdNk/MGv3dtAH3JYOL57DXjsHVO79WGjSUK1X4V9oD+NDsnm4xWhe3ocUnW5Ha0UY1Ew39YqiLPv2XUgFMzx+7AlKnYRq0PYMC9L9v3uehzPYrc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 165530562033239.74521581664544; Wed, 15 Jun 2022 08:07:00 -0700 (PDT) Received: from localhost ([::1]:37488 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Ubj-0001Pc-2F for importer@patchew.org; Wed, 15 Jun 2022 11:06:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47528) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOT-00076U-Jg for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:17 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:26652) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOR-00014o-Jb for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:17 -0400 Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE26rt000892; Wed, 15 Jun 2022 14:53:04 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjx9gng6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:04 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ6AL023069; Wed, 15 Jun 2022 14:53:03 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq23-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:03 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNf018501; Wed, 15 Jun 2022 14:53:03 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-30; Wed, 15 Jun 2022 14:53:03 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=tzSCMG7bNQDetdCrE5pKsy8MNosMSyxzTyUFS4jJchA=; b=e0lSDuIu/5b9ryyOr2oWTqL1xp2+DhhFPY+bxWiRa/1m3DeU0mSaSJKXMfV0uHu5ZxER RKBz2rZH6yGSyyv/hAZVYpvWTsAblr3kqyXW4zhbYr/C56eOkBRDNxtki0emb0TgYZit JxFqXlh+lbQ1lPMoCcr27eqbuD/WlP/I4zc+l2UTCU38YS0PkInfn5kTl9YDFrQTYBbZ lRQeCZRVgVrys1E8DcvVfe16eF8/wToimT1C0Vf5rn8TMCeQc4TTNOpmbgNGtxf1lpPL 6VS1503oUl2BHPWMrWXeEY1f9sBvltyoZZxO6cwYC/WFbG97g8aj3Q65pSrDEUXJaFJx ZQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 29/39] vfio-pci: cpr part 3 (intx) Date: Wed, 15 Jun 2022 07:52:16 -0700 Message-Id: <1655304746-102776-30-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: vbCpwc6EDNRzwRbaDAwa9hBd_iOwBkbj X-Proofpoint-GUID: vbCpwc6EDNRzwRbaDAwa9hBd_iOwBkbj 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_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305622751100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Preserve vfio INTX state across cpr restart. Preserve VFIOINTx fields as follows: pin : Recover this from the vfio config in kernel space interrupt : Preserve its eventfd descriptor across exec. unmask : Ditto route.irq : This could perhaps be recovered in vfio_pci_post_load by calling pci_device_route_intx_to_irq(pin), whose implementation reads config space for a bridge device such as ich9. However, there is no guarantee that the bridge vmstate is read before vfio vmstate. Rather than fiddling with MigrationPriority for vmstate handlers, explicitly save route.irq in vfio vmstate. pending : save in vfio vmstate. mmap_timeout, mmap_timer : Re-initialize bool kvm_accel : Re-initialize In vfio_realize, defer calling vfio_intx_enable until the vmstate is available, in vfio_pci_post_load. Modify vfio_intx_enable and vfio_intx_kvm_enable to skip vfio initialization, but still perform kvm initialization. Signed-off-by: Steve Sistare --- hw/vfio/pci.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 2fd7121..b8aee91 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -173,14 +173,45 @@ static void vfio_intx_eoi(VFIODevice *vbasedev) vfio_unmask_single_irqindex(vbasedev, VFIO_PCI_INTX_IRQ_INDEX); } =20 +#ifdef CONFIG_KVM +static bool vfio_no_kvm_intx(VFIOPCIDevice *vdev) +{ + return vdev->no_kvm_intx || !kvm_irqfds_enabled() || + vdev->intx.route.mode !=3D PCI_INTX_ENABLED || + !kvm_resamplefds_enabled(); +} +#endif + +static void vfio_intx_reenable_kvm(VFIOPCIDevice *vdev, Error **errp) +{ +#ifdef CONFIG_KVM + if (vfio_no_kvm_intx(vdev)) { + return; + } + + if (vfio_notifier_init(vdev, &vdev->intx.unmask, "intx-unmask", 0)) { + error_setg(errp, "vfio_notifier_init intx-unmask failed"); + return; + } + + if (kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, + &vdev->intx.interrupt, + &vdev->intx.unmask, + vdev->intx.route.irq)) { + error_setg_errno(errp, errno, "failed to setup resample irqfd"); + return; + } + + vdev->intx.kvm_accel =3D true; +#endif +} + static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp) { #ifdef CONFIG_KVM int irq_fd =3D event_notifier_get_fd(&vdev->intx.interrupt); =20 - if (vdev->no_kvm_intx || !kvm_irqfds_enabled() || - vdev->intx.route.mode !=3D PCI_INTX_ENABLED || - !kvm_resamplefds_enabled()) { + if (vfio_no_kvm_intx(vdev)) { return; } =20 @@ -328,7 +359,13 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error= **errp) return 0; } =20 - vfio_disable_interrupts(vdev); + /* + * Do not alter interrupt state during vfio_realize and cpr-load. The + * reused flag is cleared thereafter. + */ + if (!vdev->vbasedev.reused) { + vfio_disable_interrupts(vdev); + } =20 vdev->intx.pin =3D pin - 1; /* Pin A (1) -> irq[0] */ pci_config_set_interrupt_pin(vdev->pdev.config, pin); @@ -353,6 +390,11 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error= **errp) fd =3D event_notifier_get_fd(&vdev->intx.interrupt); qemu_set_fd_handler(fd, vfio_intx_interrupt, NULL, vdev); =20 + if (vdev->vbasedev.reused) { + vfio_intx_reenable_kvm(vdev, &err); + goto finish; + } + if (vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, fd, errp)) { qemu_set_fd_handler(fd, NULL, NULL, vdev); @@ -365,6 +407,7 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error = **errp) warn_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name); } =20 +finish: vdev->interrupt =3D VFIO_INT_INTx; =20 trace_vfio_intx_enable(vdev->vbasedev.name); @@ -3195,9 +3238,13 @@ static void vfio_realize(PCIDevice *pdev, Error **er= rp) vfio_intx_routing_notifier); vdev->irqchip_change_notifier.notify =3D vfio_irqchip_change; kvm_irqchip_add_change_notifier(&vdev->irqchip_change_notifier); - ret =3D vfio_intx_enable(vdev, errp); - if (ret) { - goto out_deregister; + + /* Wait until cpr-load reads intx routing data to enable */ + if (!vdev->vbasedev.reused) { + ret =3D vfio_intx_enable(vdev, errp); + if (ret) { + goto out_deregister; + } } } =20 @@ -3474,6 +3521,7 @@ static int vfio_pci_post_load(void *opaque, int versi= on_id) VFIOPCIDevice *vdev =3D opaque; PCIDevice *pdev =3D &vdev->pdev; int nr_vectors; + int ret =3D 0; =20 if (msix_enabled(pdev)) { msix_set_vector_notifiers(pdev, vfio_msix_vector_use, @@ -3486,10 +3534,35 @@ static int vfio_pci_post_load(void *opaque, int ver= sion_id) vfio_claim_vectors(vdev, nr_vectors, false); =20 } else if (vfio_pci_read_config(pdev, PCI_INTERRUPT_PIN, 1)) { - assert(0); /* completed in a subsequent patch */ + Error *err =3D 0; + ret =3D vfio_intx_enable(vdev, &err); + if (ret) { + error_report_err(err); + } } =20 - return 0; + return ret; +} + +static const VMStateDescription vfio_intx_vmstate =3D { + .name =3D "vfio-intx", + .unmigratable =3D 1, + .version_id =3D 0, + .minimum_version_id =3D 0, + .fields =3D (VMStateField[]) { + VMSTATE_BOOL(pending, VFIOINTx), + VMSTATE_UINT32(route.mode, VFIOINTx), + VMSTATE_INT32(route.irq, VFIOINTx), + VMSTATE_END_OF_LIST() + } +}; + +#define VMSTATE_VFIO_INTX(_field, _state) { \ + .name =3D (stringify(_field)), \ + .size =3D sizeof(VFIOINTx), \ + .vmsd =3D &vfio_intx_vmstate, \ + .flags =3D VMS_STRUCT, \ + .offset =3D vmstate_offset_value(_state, _field, VFIOINTx), \ } =20 static bool vfio_pci_needed(void *opaque) @@ -3509,6 +3582,7 @@ static const VMStateDescription vfio_pci_vmstate =3D { .fields =3D (VMStateField[]) { VMSTATE_PCI_DEVICE(pdev, VFIOPCIDevice), VMSTATE_MSIX_TEST(pdev, VFIOPCIDevice, vfio_msix_present), + VMSTATE_VFIO_INTX(intx, VFIOPCIDevice), VMSTATE_END_OF_LIST() } }; --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306200; cv=none; d=zohomail.com; s=zohoarc; b=nKK8HbKHKsevV3PrsgtS+5ZXm5iMiPyZJGJO1JKQYDxi4Im4S0aD/DanWS8i3yCLOU9bgO7FCekaKafNK5xOpEptREjeej1UdjhAm1iFnmUch90atujaYDmld+RUwkvBaBadFh1gkD96xVe1/bxSoeMbhjq6QDlvaRPp/W+DjHg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306200; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=nJx101IJZVWEr28ZpjAal2ADXBW3GJypga1w1V4oiMc=; b=OBXJHehjaUO1hrwpI8qObLoahnStwv9Dc6nUZk7jmJ+KWabMwCJYoRPHmTssVZ8s5RwQl15vb31NDF/AOQGPSeQ/S8dd2Tp480xAqvotNa1LkXbWpq92LH37GM2fapPpIc6Kxta/NGaS+R/bx1D+7rIdzxoWIm1k3Q4t0f/+J7Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306200156206.78117575793226; Wed, 15 Jun 2022 08:16:40 -0700 (PDT) Received: from localhost ([::1]:56982 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Ul5-0006sE-2C for importer@patchew.org; Wed, 15 Jun 2022 11:16:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47902) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOu-0007tK-JH for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:47 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:25454) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOs-00017j-L3 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:44 -0400 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0O97002206; Wed, 15 Jun 2022 14:53:06 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhfcrskr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:06 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7tR023103; Wed, 15 Jun 2022 14:53:05 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq38-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:05 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNh018501; Wed, 15 Jun 2022 14:53:04 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-31; Wed, 15 Jun 2022 14:53:04 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=nJx101IJZVWEr28ZpjAal2ADXBW3GJypga1w1V4oiMc=; b=KhXpzTFZ60kv/DBLZfb6b8x2mPFNwx/+3swYryKTIshURceoYd8IQSCwCRCkWFsIX53q Z3pA8I66SrXMXkupUjYxXv9pmbRskPfXPzdOQmIrti9Ai35aBx4oOlPvZ2wy2k6WcAiB mnQs2y+/J7Z1aLjtnyefPNl9kRleuI3NZnZDBG8bq+Cqa8B1rz0HcZ6/b1t4mXSODE/U PqBanBb6DlW6hsM8ztp9s7N2Y83piJCxfYifh3emDndAdnfOeCAuGtsYQojf5/VMgl93 LBXcrVgYlJgHg6LTlzeg3lQXgwqPtcjrTiSaCoquaH+PEmtfXQFIbFX+Iu2jpz7Jlp1I Ag== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 30/39] vfio-pci: recover from unmap-all-vaddr failure Date: Wed, 15 Jun 2022 07:52:17 -0700 Message-Id: <1655304746-102776-31-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-ORIG-GUID: 1YltT1aB1BL_KxijSAo9n8qcGOmbejHY X-Proofpoint-GUID: 1YltT1aB1BL_KxijSAo9n8qcGOmbejHY Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306201230100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" If vfio_cpr_save fails to unmap all vaddr's, then recover by walking all flat sections to restore the vaddr for each. Do so by invoking the vfio listener callback, and passing a new "replay" flag that tells it to replay a mapping without re-allocating new userland data structures. Signed-off-by: Steve Sistare --- hw/vfio/common.c | 66 ++++++++++++++++++++++++++++++++-------= ---- hw/vfio/cpr.c | 29 +++++++++++++++++++ include/hw/vfio/vfio-common.h | 2 +- 3 files changed, 80 insertions(+), 17 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index c7d73b6..5f2bd50 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -895,15 +895,35 @@ static bool vfio_known_safe_misalignment(MemoryRegion= Section *section) return true; } =20 +static VFIORamDiscardListener *vfio_find_ram_discard_listener( + VFIOContainer *container, MemoryRegionSection *section) +{ + VFIORamDiscardListener *vrdl =3D NULL; + + QLIST_FOREACH(vrdl, &container->vrdl_list, next) { + if (vrdl->mr =3D=3D section->mr && + vrdl->offset_within_address_space =3D=3D + section->offset_within_address_space) { + break; + } + } + + if (!vrdl) { + hw_error("vfio: Trying to sync missing RAM discard listener"); + /* does not return */ + } + return vrdl; +} + static void vfio_listener_region_add(MemoryListener *listener, MemoryRegionSection *section) { VFIOContainer *container =3D container_of(listener, VFIOContainer, lis= tener); - vfio_container_region_add(container, section); + vfio_container_region_add(container, section, false); } =20 void vfio_container_region_add(VFIOContainer *container, - MemoryRegionSection *section) + MemoryRegionSection *section, bool replay) { hwaddr iova, end; Int128 llend, llsize; @@ -1033,6 +1053,23 @@ void vfio_container_region_add(VFIOContainer *contai= ner, int iommu_idx; =20 trace_vfio_listener_region_add_iommu(iova, end); + + if (replay) { + hwaddr as_offset =3D section->offset_within_address_space; + hwaddr iommu_offset =3D as_offset - section->offset_within_reg= ion; + + QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) { + if (giommu->iommu_mr =3D=3D iommu_mr && + giommu->iommu_offset =3D=3D iommu_offset) { + memory_region_iommu_replay(giommu->iommu_mr, &giommu->= n); + return; + } + } + error_report("Container cannot find iommu region %s offset %lx= ", + memory_region_name(section->mr), iommu_offset); + goto fail; + } + /* * FIXME: For VFIO iommu types which have KVM acceleration to * avoid bouncing all map/unmaps through qemu this way, this @@ -1083,7 +1120,15 @@ void vfio_container_region_add(VFIOContainer *contai= ner, * about changes. */ if (memory_region_has_ram_discard_manager(section->mr)) { - vfio_register_ram_discard_listener(container, section); + if (replay) { + VFIORamDiscardListener *vrdl =3D + vfio_find_ram_discard_listener(container, section); + if (vfio_ram_discard_notify_populate(&vrdl->listener, section)= ) { + error_report("ram_discard_manager_replay_populated failed"= ); + } + } else { + vfio_register_ram_discard_listener(container, section); + } return; } =20 @@ -1417,19 +1462,8 @@ static int vfio_sync_ram_discard_listener_dirty_bitm= ap(VFIOContainer *container, MemoryRegionSection *se= ction) { RamDiscardManager *rdm =3D memory_region_get_ram_discard_manager(secti= on->mr); - VFIORamDiscardListener *vrdl =3D NULL; - - QLIST_FOREACH(vrdl, &container->vrdl_list, next) { - if (vrdl->mr =3D=3D section->mr && - vrdl->offset_within_address_space =3D=3D - section->offset_within_address_space) { - break; - } - } - - if (!vrdl) { - hw_error("vfio: Trying to sync missing RAM discard listener"); - } + VFIORamDiscardListener *vrdl =3D + vfio_find_ram_discard_listener(container, section); =20 /* * We only want/can synchronize the bitmap for actually mapped parts - diff --git a/hw/vfio/cpr.c b/hw/vfio/cpr.c index a227d5e..2b5e77c 100644 --- a/hw/vfio/cpr.c +++ b/hw/vfio/cpr.c @@ -32,6 +32,15 @@ vfio_dma_unmap_vaddr_all(VFIOContainer *container, Error= **errp) return 0; } =20 +static int +vfio_region_remap(MemoryRegionSection *section, void *handle, Error **errp) +{ + VFIOContainer *container =3D handle; + vfio_container_region_add(container, section, true); + container->vaddr_unmapped =3D false; + return 0; +} + static bool vfio_is_cpr_capable(VFIOContainer *container, Error **errp) { if (!ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UPDATE_VADDR) || @@ -98,6 +107,22 @@ static const VMStateDescription vfio_container_vmstate = =3D { } }; =20 +static void vfio_cpr_save_failed_notifier(Notifier *notifier, void *data) +{ + Error *err; + VFIOContainer *container =3D + container_of(notifier, VFIOContainer, cpr_notifier); + + /* Set reused so vfio_dma_map restores vaddr */ + container->reused =3D true; + if (address_space_flat_for_each_section(container->space->as, + vfio_region_remap, + container, &err)) { + error_report_err(err); + } + container->reused =3D false; +} + int vfio_cpr_register_container(VFIOContainer *container, Error **errp) { container->cpr_blocker =3D NULL; @@ -108,6 +133,8 @@ int vfio_cpr_register_container(VFIOContainer *containe= r, Error **errp) =20 vmstate_register(NULL, -1, &vfio_container_vmstate, container); =20 + cpr_add_notifier(&container->cpr_notifier, vfio_cpr_save_failed_notifi= er, + CPR_NOTIFY_SAVE_FAILED); return 0; } =20 @@ -116,4 +143,6 @@ void vfio_cpr_unregister_container(VFIOContainer *conta= iner) cpr_del_blocker(&container->cpr_blocker); =20 vmstate_unregister(NULL, &vfio_container_vmstate, container); + + cpr_remove_notifier(&container->cpr_notifier); } diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 17ad9ba..dd6bbcf 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -244,7 +244,7 @@ vfio_get_device_info_cap(struct vfio_device_info *info,= uint16_t id); extern const MemoryListener vfio_prereg_listener; void vfio_listener_register(VFIOContainer *container); void vfio_container_region_add(VFIOContainer *container, - MemoryRegionSection *section); + MemoryRegionSection *section, bool replay); =20 int vfio_spapr_create_window(VFIOContainer *container, MemoryRegionSection *section, --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305433; cv=none; d=zohomail.com; s=zohoarc; b=aBKOKpbzDB8BiZzuE9nAvUk1EITWiSaPIfGB4rQNrTblDAiq3eRPDyQF3LSQUtnP7/TZeX/znzlBZRwDy13+g3SKU87pU7uln/oKEuFt+nf4Fw+nw6OQKQgdGylkSnitYwH+u2EtkRoey/hjDDUXS/qd2QTGta9rbkzKrQHwngQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305433; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=u+USWiZ7o3DyQxWHdJI7EwK8AIskaFZDpN+FFhGWYKM=; b=Ql0d0wyDUYxAVgT9jcvQHtgrv0Yhk49kE+9aa7toyr54NeeUFPXjX8zyVQnYGSotA5K7Y+YWrYlzBsRT1i4b6KxYj4bb8s1FxJK29IeHjwcOLsg8AzzMCaVujA4ktKNU1uZxFJ88JWlnV50Scrad7NY8qBvKlXZgKOiGZaIjtzo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305433153853.9930517632117; Wed, 15 Jun 2022 08:03:53 -0700 (PDT) Received: from localhost ([::1]:56280 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UYi-00034G-52 for importer@patchew.org; Wed, 15 Jun 2022 11:03:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47634) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOX-0007HR-Tv for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:23 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:34582) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOV-00015T-R9 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:21 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDrshi015214; Wed, 15 Jun 2022 14:53:07 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhn0gvfu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:07 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7KB023155; Wed, 15 Jun 2022 14:53:06 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq3v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:06 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNj018501; Wed, 15 Jun 2022 14:53:05 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-32; Wed, 15 Jun 2022 14:53:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=u+USWiZ7o3DyQxWHdJI7EwK8AIskaFZDpN+FFhGWYKM=; b=XoR7Cc3PrSieTnP1mm+SUS+MhF+Kxc7XOsPBukQuqgow4JlZ7lPQpLAgI6TrIpuNsPFO 9g89KtaN4CE+jywXtGE7VOC6zOh92tbxChPn1yX91bQGrhk0BqIkrJ9lqM2jcRCf7GPA SZsOUI5jd3+DXawjNcHdvj3LKPw+641BBl5n3O7A4gZH9tScVFeqdxOnG1tISaZbi4lB XG356DdozQlybIBWwW9y3dQiJjvp/TOkzqZk+a53JUfgVncx2AjeqpKZPNRiX+7X1MUZ OLNxFJc5CLpRCVX8/Nt1TR6xL+hTKeEPMkysX7+mNhOku3NpVK+Ap5J1WNp6wk67jRoX 8Q== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 31/39] vhost: reset vhost devices for cpr Date: Wed, 15 Jun 2022 07:52:18 -0700 Message-Id: <1655304746-102776-32-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: Qr0T5rhpOzzWG1gwnovkgnz-cuq7IxNH X-Proofpoint-ORIG-GUID: Qr0T5rhpOzzWG1gwnovkgnz-cuq7IxNH 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_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305434206100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" A vhost device is implicitly preserved across re-exec because its fd is not closed, and the value of the fd is specified on the command line for the new qemu to find. However, new qemu issues an VHOST_RESET_OWNER ioctl, which fails because the device already has an owner. To fix, reset the owner prior to exec. Signed-off-by: Mark Kanda Signed-off-by: Steve Sistare --- hw/virtio/vhost.c | 17 +++++++++++++++++ include/hw/virtio/vhost.h | 1 + 2 files changed, 18 insertions(+) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index dd3263d..efaa28c 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -23,6 +23,7 @@ #include "standard-headers/linux/vhost_types.h" #include "hw/virtio/virtio-bus.h" #include "hw/virtio/virtio-access.h" +#include "migration/cpr.h" #include "migration/blocker.h" #include "migration/qemu-file-types.h" #include "sysemu/dma.h" @@ -1306,6 +1307,17 @@ static void vhost_virtqueue_cleanup(struct vhost_vir= tqueue *vq) event_notifier_cleanup(&vq->masked_notifier); } =20 +static void vhost_cpr_exec_notifier(Notifier *notifier, void *data) +{ + struct vhost_dev *dev =3D container_of(notifier, struct vhost_dev, + cpr_notifier); + int r =3D dev->vhost_ops->vhost_reset_device(dev); + + if (r < 0) { + VHOST_OPS_DEBUG(r, "vhost_reset_device failed"); + } +} + int vhost_dev_init(struct vhost_dev *hdev, void *opaque, VhostBackendType backend_type, uint32_t busyloop_timeou= t, Error **errp) @@ -1405,6 +1417,8 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaq= ue, hdev->log_enabled =3D false; hdev->started =3D false; memory_listener_register(&hdev->memory_listener, &address_space_memory= ); + cpr_add_notifier(&hdev->cpr_notifier, vhost_cpr_exec_notifier, + CPR_NOTIFY_EXEC); QLIST_INSERT_HEAD(&vhost_devices, hdev, entry); =20 if (used_memslots > hdev->vhost_ops->vhost_backend_memslots_limit(hdev= )) { @@ -1444,6 +1458,9 @@ void vhost_dev_cleanup(struct vhost_dev *hdev) migrate_del_blocker(hdev->migration_blocker); error_free(hdev->migration_blocker); } + if (hdev->cpr_notifier.notify) { + cpr_remove_notifier(&hdev->cpr_notifier); + } g_free(hdev->mem); g_free(hdev->mem_sections); if (hdev->vhost_ops) { diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index b291fe4..1316b14 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -100,6 +100,7 @@ struct vhost_dev { QLIST_ENTRY(vhost_dev) entry; QLIST_HEAD(, vhost_iommu) iommu_list; IOMMUNotifier n; + Notifier cpr_notifier; const VhostDevConfigOps *config_ops; }; =20 --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305644; cv=none; d=zohomail.com; s=zohoarc; b=F8CFzrlj2Vh3MMsuVE91RPwGyWOecK+Lg6OT0cHKxk+0w+r6J4v+gd9AieMHUIKB/IPRYsEBaE5wULzZ08IqYS3Ae12Ry/cuLivfvGvOJTg62tcTBgZ3LhvCcGgWQ05vJ834aPIGVYZdlBU3pxMaqP7RWjzFdbg8nH4ut7jA8Us= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305644; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=VXFSP3he1Qn7f9PCKt9d1pzoHH/4Rt6Bt6/zgwsBvzo=; b=AZHQvNBTva31/Phjr1jHghdHQ4georrfT8lfNzItqRgqvc9/pGitCOrgTXELD/c1xfSc0FJCgcJPH8t4ukxS2rQ7rP4RCtRS+cqRAA2lqcKzUp5GjeEMjEZX0fxuPJt/HBkJmSwInlsUaT+8Mn45iT29327nmrEJZWI4T2QRPzw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305644692507.8975178615349; Wed, 15 Jun 2022 08:07:24 -0700 (PDT) Received: from localhost ([::1]:39628 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uc6-0002t2-I4 for importer@patchew.org; Wed, 15 Jun 2022 11:07:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47808) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOn-0007mZ-IA for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:39 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:8800) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOl-00016I-3O for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:37 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gw4025874; Wed, 15 Jun 2022 14:53:08 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxg3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:08 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ73I023089; Wed, 15 Jun 2022 14:53:07 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq4g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:07 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNl018501; Wed, 15 Jun 2022 14:53:06 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-33; Wed, 15 Jun 2022 14:53:06 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=VXFSP3he1Qn7f9PCKt9d1pzoHH/4Rt6Bt6/zgwsBvzo=; b=OsXW/zdhTWVPa6ZsYOu/yM3MUnE3HryhBs1b5+yRPD6xeJqwPjh6spr6W9k8KjO0gMvr ikp+4DWiWvC5vR4/rD2KxYlLFZrgI81oQKCrGGM/UXshHMu5AA92Y8++OkW7fLgh5tgH j/XU0/IspgQSGrFgAzyBYDH99d/Op4fJWIQWrnpGiD2tgv4QQIFjeDiAlKScHiDSTcyT 8T4fuk1bDHTLwH9sM4G8O74weh/6726UrS7B3BoKIdrqH3dOL/jhXeUyGWFFIbHiLUDl O1Z706lRoxY905nKt5EjATrhE9iYNDVLz35wx9Apls9qVjEBbj68Nb4Mgcs39GVrNkPb xQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 32/39] loader: suppress rom_reset during cpr Date: Wed, 15 Jun 2022 07:52:19 -0700 Message-Id: <1655304746-102776-33-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: yAhot5a2Dz8XMV1rBTKtyjKBPT13ba8o X-Proofpoint-ORIG-GUID: yAhot5a2Dz8XMV1rBTKtyjKBPT13ba8o Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655305646813100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reported-by: Zheng Chuan Signed-off-by: Steve Sistare --- hw/core/loader.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/core/loader.c b/hw/core/loader.c index 0548830..7b39c07 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -51,6 +51,7 @@ #include "hw/hw.h" #include "disas/disas.h" #include "migration/vmstate.h" +#include "migration/cpr.h" #include "monitor/monitor.h" #include "sysemu/reset.h" #include "sysemu/sysemu.h" @@ -1153,6 +1154,7 @@ ssize_t rom_add_option(const char *file, int32_t boot= index) static void rom_reset(void *unused) { Rom *rom; + bool cpr_is_active =3D (cpr_get_mode() !=3D CPR_MODE_NONE); =20 QTAILQ_FOREACH(rom, &roms, next) { if (rom->fw_file) { @@ -1163,7 +1165,7 @@ static void rom_reset(void *unused) * the data in during the next incoming migration in all cases. N= ote * that some of those RAMs can actually be modified by the guest. */ - if (runstate_check(RUN_STATE_INMIGRATE)) { + if (runstate_check(RUN_STATE_INMIGRATE) || cpr_is_active) { if (rom->data && rom->isrom) { /* * Free it so that a rom_reset after migration doesn't --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655305999; cv=none; d=zohomail.com; s=zohoarc; b=e7DmNm/G4ytx8Owmm0XdF2Ecu0lTudJFoO9PYWdUcj6uDIvypNF5d97XCAJUZIYpORMIZbSJ3cCHHVk91sPXK2uyIEM+OomDq+tdFu+WPE0l+2sIBG/oHMiPBoQiXvEpgoEM+PY0dN+BUNJwzEukD2tPBEeAmERXkidmLhpVLas= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655305999; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=j2GOVjMrbXSH/xbYYYoczi6lJUabCkJpmttuDx/IZFc=; b=KRxmtoeECUua2oyoIkiXS12gLk2HHgsRZBB/MqZagfinBdyoKC74aZ+sT/ckB/Cf1/aRp4di97OgL7vpmrRetTMKeSSU9Xgnnnr/+nnVQCUqzZ04i8glnFXx1MdYD6eUD9Ma6kqFfoCF9FCtC48JJb9ri97Kr4JAidIRWpP8pKM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655305999624109.12823170291756; Wed, 15 Jun 2022 08:13:19 -0700 (PDT) Received: from localhost ([::1]:50392 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uhq-0001uo-Ed for importer@patchew.org; Wed, 15 Jun 2022 11:13:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47690) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOd-0007RE-BY for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:27 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:45562) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOb-00016O-3G for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:27 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDrshj015214; Wed, 15 Jun 2022 14:53:10 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhn0gvfw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:10 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ72Z023081; Wed, 15 Jun 2022 14:53:09 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq5a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:09 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNn018501; Wed, 15 Jun 2022 14:53:08 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-34; Wed, 15 Jun 2022 14:53:08 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=j2GOVjMrbXSH/xbYYYoczi6lJUabCkJpmttuDx/IZFc=; b=byHlzhV4U5xVYSZ9Bqt/gIwzpBwQHhGPkhXIoj0xp09nMnn4spTBSHw0/eRmzt1PM8+l QQq+Eg2Ws0FTuwqocXyMw094qpPOB+4NgVHFay0n0WLDZ+UnpO7LpZxFPlIbBPIkYYka oenktY4sZO8sWdrlLGtSY7p1f5vpv79D5p8x9G8UmFV5i47mAa5yV0Qc1QllgIrTkeqk YXxaCPoXswUvUXuVOSX5mr7BA+aXkOh2cLouxaQ9/Iqsm0+h/snDYl0YlUAr42is0tJE /lLhV5DSxMJV7NfL4wgawsCVnKiCedl/1XjCQn3zNfQpKSAQ2iMaDox2PjjfJaDX7NBV oA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 33/39] chardev: cpr framework Date: Wed, 15 Jun 2022 07:52:20 -0700 Message-Id: <1655304746-102776-34-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: zaYXxthhcOXDhmVT-PCgAJe43A46Te35 X-Proofpoint-ORIG-GUID: zaYXxthhcOXDhmVT-PCgAJe43A46Te35 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_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306002209100002 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add QEMU_CHAR_FEATURE_CPR for devices that support cpr by preserving an open descriptor across exec. Add the chardev reopen-on-cpr option for devices that should be closed on cpr and reopened after exec. Enable cpr for a chardev if it has QEMU_CHAR_FEATURE_CPR and reopen-on-cpr is false. Allow cpr-save if either QEMU_CHAR_FEATURE_CPR or reopen-on-cpr is true for all chardevs in the configuration. Signed-off-by: Steve Sistare --- chardev/char.c | 49 +++++++++++++++++++++++++++++++++++++++++++++-= --- include/chardev/char.h | 5 +++++ qapi/char.json | 7 ++++++- qemu-options.hx | 26 ++++++++++++++++++++++---- 4 files changed, 78 insertions(+), 9 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 0169d8d..ef3f196 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -36,9 +36,11 @@ #include "qemu/help_option.h" #include "qemu/module.h" #include "qemu/option.h" +#include "migration/cpr.h" #include "qemu/id.h" #include "qemu/coroutine.h" #include "qemu/yank.h" +#include "sysemu/sysemu.h" =20 #include "chardev-internal.h" =20 @@ -236,26 +238,55 @@ int qemu_chr_add_client(Chardev *s, int fd) static void qemu_char_open(Chardev *chr, ChardevBackend *backend, bool *be_opened, Error **errp) { + ERRP_GUARD(); + g_autofree char *fdname =3D NULL; + ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); /* Any ChardevCommon member would work */ ChardevCommon *common =3D backend ? backend->u.null.data : NULL; + bool has_logfile =3D (common && common->has_logfile); + bool has_feature_cpr; =20 - if (common && common->has_logfile) { + if (has_logfile) { int flags =3D O_WRONLY; + fdname =3D g_strdup_printf("%s_log", chr->label); if (common->has_logappend && common->logappend) { flags |=3D O_APPEND; } else { flags |=3D O_TRUNC; } - chr->logfd =3D qemu_create(common->logfile, flags, 0666, errp); + chr->logfd =3D cpr_find_fd(fdname, 0); + if (chr->logfd < 0) { + chr->logfd =3D qemu_create(common->logfile, flags, 0666, errp); + } if (chr->logfd < 0) { return; } } =20 + chr->reopen_on_cpr =3D (common && common->reopen_on_cpr); + if (cc->open) { cc->open(chr, backend, be_opened, errp); + if (*errp) { + return; + } + } + + /* Evaluate this after the open method sets the feature */ + has_feature_cpr =3D qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_CPR); + chr->cpr_enabled =3D !chr->reopen_on_cpr && has_feature_cpr; + + if (!chr->reopen_on_cpr && !has_feature_cpr) { + chr->cpr_blocker =3D NULL; + error_setg(&chr->cpr_blocker, + "chardev %s -> %s does not allow cpr. See reopen-on-cpr.", + chr->label, chr->filename); + cpr_add_blocker(&chr->cpr_blocker, errp, CPR_MODE_RESTART, 0); + + } else if (chr->cpr_enabled && has_logfile) { + cpr_resave_fd(fdname, 0, chr->logfd, errp); } } =20 @@ -297,11 +328,16 @@ static void char_finalize(Object *obj) if (chr->be) { chr->be->chr =3D NULL; } - g_free(chr->filename); - g_free(chr->label); if (chr->logfd !=3D -1) { + g_autofree char *fdname =3D g_strdup_printf("%s_log", chr->label); + if (chr->cpr_enabled) { + cpr_delete_fd(fdname, 0); + } close(chr->logfd); } + cpr_del_blocker(&chr->cpr_blocker); + g_free(chr->filename); + g_free(chr->label); qemu_mutex_destroy(&chr->chr_write_lock); } =20 @@ -501,6 +537,8 @@ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommo= n *backend) =20 backend->has_logappend =3D true; backend->logappend =3D qemu_opt_get_bool(opts, "logappend", false); + + backend->reopen_on_cpr =3D qemu_opt_get_bool(opts, "reopen-on-cpr", fa= lse); } =20 static const ChardevClass *char_get_class(const char *driver, Error **errp) @@ -942,6 +980,9 @@ QemuOptsList qemu_chardev_opts =3D { },{ .name =3D "abstract", .type =3D QEMU_OPT_BOOL, + },{ + .name =3D "reopen-on-cpr", + .type =3D QEMU_OPT_BOOL, #endif }, { /* end of list */ } diff --git a/include/chardev/char.h b/include/chardev/char.h index a319b5f..bbf2560 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -50,6 +50,8 @@ typedef enum { /* Whether the gcontext can be changed after calling * qemu_chr_be_update_read_handlers() */ QEMU_CHAR_FEATURE_GCONTEXT, + /* Whether the device supports cpr */ + QEMU_CHAR_FEATURE_CPR, =20 QEMU_CHAR_FEATURE_LAST, } ChardevFeature; @@ -67,6 +69,9 @@ struct Chardev { int be_open; /* used to coordinate the chardev-change special-case: */ bool handover_yank_instance; + bool reopen_on_cpr; + bool cpr_enabled; + Error *cpr_blocker; GSource *gsource; GMainContext *gcontext; DECLARE_BITMAP(features, QEMU_CHAR_FEATURE_LAST); diff --git a/qapi/char.json b/qapi/char.json index 923dc50..0c3558e 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -204,12 +204,17 @@ # @logfile: The name of a logfile to save output # @logappend: true to append instead of truncate # (default to false to truncate) +# @reopen-on-cpr: if true, close device's fd on cpr-save and reopen it aft= er +# cpr-exec. Set this to allow CPR on a device that does not +# support QEMU_CHAR_FEATURE_CPR. defaults to false. +# since 7.1. # # Since: 2.6 ## { 'struct': 'ChardevCommon', 'data': { '*logfile': 'str', - '*logappend': 'bool' } } + '*logappend': 'bool', + '*reopen-on-cpr': 'bool' } } =20 ## # @ChardevFile: diff --git a/qemu-options.hx b/qemu-options.hx index 1b49360..2f4bb2b 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3291,43 +3291,57 @@ DEFHEADING(Character device options:) =20 DEF("chardev", HAS_ARG, QEMU_OPTION_chardev, "-chardev help\n" - "-chardev null,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend=3Don= |off]\n" + "-chardev null,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend=3Don= |off][,reopen-on-cpr=3Don|off]\n" "-chardev socket,id=3Did[,host=3Dhost],port=3Dport[,to=3Dto][,ipv4=3Do= n|off][,ipv6=3Don|off][,nodelay=3Don|off]\n" " [,server=3Don|off][,wait=3Don|off][,telnet=3Don|off][,websoc= ket=3Don|off][,reconnect=3Dseconds][,mux=3Don|off]\n" - " [,logfile=3DPATH][,logappend=3Don|off][,tls-creds=3DID][,tls= -authz=3DID] (tcp)\n" + " [,logfile=3DPATH][,logappend=3Don|off][,tls-creds=3DID][,tls= -authz=3DID][,reopen-on-cpr=3Don|off] (tcp)\n" "-chardev socket,id=3Did,path=3Dpath[,server=3Don|off][,wait=3Don|off]= [,telnet=3Don|off][,websocket=3Don|off][,reconnect=3Dseconds]\n" - " [,mux=3Don|off][,logfile=3DPATH][,logappend=3Don|off][,abstr= act=3Don|off][,tight=3Don|off] (unix)\n" + " [,mux=3Don|off][,logfile=3DPATH][,logappend=3Don|off][,abstr= act=3Don|off][,tight=3Don|off][,reopen-on-cpr=3Don|off] (unix)\n" "-chardev udp,id=3Did[,host=3Dhost],port=3Dport[,localaddr=3Dlocaladdr= ]\n" " [,localport=3Dlocalport][,ipv4=3Don|off][,ipv6=3Don|off][,mu= x=3Don|off]\n" - " [,logfile=3DPATH][,logappend=3Don|off]\n" + " [,logfile=3DPATH][,logappend=3Don|off][,reopen-on-cpr=3Don|o= ff]\n" "-chardev msmouse,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend= =3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev vc,id=3Did[[,width=3Dwidth][,height=3Dheight]][[,cols=3Dcols= ][,rows=3Drows]]\n" " [,mux=3Don|off][,logfile=3DPATH][,logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev ringbuf,id=3Did[,size=3Dsize][,logfile=3DPATH][,logappend=3D= on|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev file,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,lo= gappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev pipe,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,lo= gappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" #ifdef _WIN32 "-chardev console,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend= =3Don|off]\n" "-chardev serial,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,= logappend=3Don|off]\n" #else "-chardev pty,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend=3Don|= off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev stdio,id=3Did[,mux=3Don|off][,signal=3Don|off][,logfile=3DPA= TH][,logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" #endif #ifdef CONFIG_BRLAPI "-chardev braille,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend= =3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" #endif #if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \ || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__Dragon= Fly__) "-chardev serial,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,= logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev tty,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,log= append=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" #endif #if defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__) "-chardev parallel,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH]= [,logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev parport,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][= ,logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" #endif #if defined(CONFIG_SPICE) "-chardev spicevmc,id=3Did,name=3Dname[,debug=3Ddebug][,logfile=3DPATH= ][,logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" "-chardev spiceport,id=3Did,name=3Dname[,debug=3Ddebug][,logfile=3DPAT= H][,logappend=3Don|off]\n" + " [,reopen-on-cpr=3Don|off]\n" #endif , QEMU_ARCH_ALL ) @@ -3402,6 +3416,10 @@ The general form of a character device option is: ``logappend`` option controls whether the log file will be truncated or appended to when opened. =20 + Every backend supports the ``reopen-on-cpr`` option. If on, the + devices's descriptor is closed during cpr-save, and reopened after exe= c. + This is useful for devices that do not support cpr. + The available backends are: =20 ``-chardev null,id=3Did`` --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306283; cv=none; d=zohomail.com; s=zohoarc; b=UmOsX8+24W/a0ocIAZl9mtFPpB/Btdu8vAT3nhbFPfm4FgBZCYx8zNIAZPEGL2DIFdIKJzdT7L89b3DN9KCtlxUf62igpAnxo/wzb42xRjUG597eg9pVow+PboMoQ2Il0f7JhkRTzWOJ3qEF+Du1GBdWd7How0u3lKkTwNW0D98= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306283; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=+ZzpcwQtt1RTx7/w3kERr/xIGS0RKClA/iA96Fnr5j0=; b=QTUSFPgAjQ0EKXA7IbANwNMG3sB+JhFcJUtcrSsNL5RNoWIWYV9P4E3OK3ZasHQUzARQp6e9NW6wMNV+r+LNHx+lf9hA3gWJosH7Bx45TOR6wh2vTDOr4GTvifPRWx/SKi3k5rhBE3FYGKT1wTGToyef29hsH/1RVSwJZNJubhg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306283912845.0132266586585; Wed, 15 Jun 2022 08:18:03 -0700 (PDT) Received: from localhost ([::1]:58972 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UmQ-0008Mk-SU for importer@patchew.org; Wed, 15 Jun 2022 11:18:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47826) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOo-0007mg-Ok for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:39 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:14490) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOm-00016l-Vh for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:38 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE61kR001479; Wed, 15 Jun 2022 14:53:11 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tna-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:11 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7w6023077; Wed, 15 Jun 2022 14:53:10 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq5n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:10 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNp018501; Wed, 15 Jun 2022 14:53:09 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-35; Wed, 15 Jun 2022 14:53:09 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=+ZzpcwQtt1RTx7/w3kERr/xIGS0RKClA/iA96Fnr5j0=; b=X8g1GbX/Q4I185YYXCKAb48trHcdvwA9S5nARPoL/k4MS4IcOLEiN6zrMfIj0BtfAhHI MfXmGl84hoaLXIqSSmWvY1+uSVN1eY8qCiXrmP1EVcVeCFuDvtFinb9Bqd/Ke5WYsgku cSfzKe700+PO+CkuXkYKMXHz1qfkW0giVno/YY79HkCSbiYX+A2UnpeF4JyhiilqoP1O 0C1C0/+W0cwLqZE3HV/LqSqhfDF6L9C+EO++KwrPoGv7dSbJBgH8ppDVbwnl+sUyeV4M JvZyOzgCLFNGxv36B795aZD63wTsos5g/wOzZZySx+myCtrlno0VkgEwE5TtSAOLrxyg vQ== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 34/39] chardev: cpr for simple devices Date: Wed, 15 Jun 2022 07:52:21 -0700 Message-Id: <1655304746-102776-35-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: olo8Tu0sNfD3jWWvS_34i0NSuKBs2UWn X-Proofpoint-ORIG-GUID: olo8Tu0sNfD3jWWvS_34i0NSuKBs2UWn Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306285677100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Set QEMU_CHAR_FEATURE_CPR for devices that trivially support cpr. char-stdio is slightly less trivial. Allow the gdb server by closing it on exec. Signed-off-by: Steve Sistare --- chardev/char-mux.c | 1 + chardev/char-null.c | 1 + chardev/char-serial.c | 1 + chardev/char-stdio.c | 10 ++++++++++ gdbstub.c | 1 + 5 files changed, 14 insertions(+) diff --git a/chardev/char-mux.c b/chardev/char-mux.c index ee2d47b..d47fa31 100644 --- a/chardev/char-mux.c +++ b/chardev/char-mux.c @@ -337,6 +337,7 @@ static void qemu_chr_open_mux(Chardev *chr, */ *be_opened =3D muxes_opened; qemu_chr_fe_init(&d->chr, drv, errp); + qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_CPR); } =20 static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend, diff --git a/chardev/char-null.c b/chardev/char-null.c index 1c6a290..02acaff 100644 --- a/chardev/char-null.c +++ b/chardev/char-null.c @@ -32,6 +32,7 @@ static void null_chr_open(Chardev *chr, Error **errp) { *be_opened =3D false; + qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_CPR); } =20 static void char_null_class_init(ObjectClass *oc, void *data) diff --git a/chardev/char-serial.c b/chardev/char-serial.c index 4b0b83d..7aa2042 100644 --- a/chardev/char-serial.c +++ b/chardev/char-serial.c @@ -277,6 +277,7 @@ static void qmp_chardev_open_serial(Chardev *chr, } tty_serial_init(fd, 115200, 'N', 8, 1); =20 + qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_CPR); qemu_chr_open_fd(chr, fd, fd); } #endif /* __linux__ || __sun__ */ diff --git a/chardev/char-stdio.c b/chardev/char-stdio.c index 3c64867..520f1db 100644 --- a/chardev/char-stdio.c +++ b/chardev/char-stdio.c @@ -27,6 +27,7 @@ #include "qemu/option.h" #include "qemu/sockets.h" #include "qapi/error.h" +#include "migration/cpr.h" #include "chardev/char.h" =20 #ifdef _WIN32 @@ -44,6 +45,7 @@ static int old_fd0_flags; static bool stdio_in_use; static bool stdio_allow_signal; static bool stdio_echo_state; +static Notifier cpr_notifier; =20 static void term_exit(void) { @@ -53,6 +55,11 @@ static void term_exit(void) } } =20 +static void term_cpr_exec_notifier(Notifier *notifier, void *data) +{ + term_exit(); +} + static void qemu_chr_set_echo_stdio(Chardev *chr, bool echo) { struct termios tty; @@ -117,6 +124,8 @@ static void qemu_chr_open_stdio(Chardev *chr, =20 stdio_allow_signal =3D !opts->has_signal || opts->signal; qemu_chr_set_echo_stdio(chr, false); + qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_CPR); + cpr_add_notifier(&cpr_notifier, term_cpr_exec_notifier, CPR_NOTIFY_EXE= C); } #endif =20 @@ -147,6 +156,7 @@ static void char_stdio_finalize(Object *obj) { #ifndef _WIN32 term_exit(); + cpr_remove_notifier(&cpr_notifier); #endif } =20 diff --git a/gdbstub.c b/gdbstub.c index 88a34c8..7865c3d 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -3584,6 +3584,7 @@ int gdbserver_start(const char *device) mon_chr =3D gdbserver_state.mon_chr; reset_gdbserver_state(); } + mon_chr->reopen_on_cpr =3D true; =20 create_processes(&gdbserver_state); =20 --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306677; cv=none; d=zohomail.com; s=zohoarc; b=AI1fZ1tBGIrgAFkaxMpTrE0PpfHy+X3yum+x2RrP9mUFEV7jJrdTJz6dQBiSCFP/Mf2+kgbbFQ4bh/fGMd8/l1LcRtNg+LtQhT6od6VDEdrN8dxvs/ueBVFVgqLKZa3Rw1SeATC9lwcJCg2xkeu48yKsW8HCvT0/Yq6ktoJB3yQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306677; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=/De//qmUx+XrVa/O1wsgIAQOBYnPOuns7xjixxqathw=; b=MzzaZdb8+0XS/nvs+N+rZ3RQs6HylaCsDIRr1bSKeR9arzNr+idkoh5RKf+1GQ8tmwxczTr2ORC4Ki7shot5Av6N2FOWAkIlXMlgjUN6sLSz0RitrbBMdPP8rKQuBsETZ0Pqg5HDKsCqHvJxxq2ZtKqqV73wGe+72abuLpl1EOQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306677043215.9015571203281; Wed, 15 Jun 2022 08:24:37 -0700 (PDT) Received: from localhost ([::1]:43040 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Usl-0000RB-N7 for importer@patchew.org; Wed, 15 Jun 2022 11:24:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47776) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOm-0007jm-7z for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:36 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:8276) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOk-00016E-IZ for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:35 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gw7025874; Wed, 15 Jun 2022 14:53:12 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxgb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:12 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7dI023131; Wed, 15 Jun 2022 14:53:11 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq6a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:11 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNr018501; Wed, 15 Jun 2022 14:53:10 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-36; Wed, 15 Jun 2022 14:53:10 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=/De//qmUx+XrVa/O1wsgIAQOBYnPOuns7xjixxqathw=; b=SQoc0D7BBr6d1ITsh63otNf7zFFJ1zTqQlAdGgCW0qM2f7O3gyh9/yS31my6HN1TmC8r OihBvVsL99P5w9dPgVq2YAXviQ1fAfh+QpvDnfjCfNm91sEGIIiT9z+5Lb47TXSe1748 nTOAdPmQI5P1cukZQIFSkZhCqgaIpUYgBOQKi2mb4PjVaO+BSSHKt/b/W8KB3YkifEhJ 5rpduCvqpKcHbcimwhYBdmCDM8KEfEAJ8RLfA7vepxCYH5qE/Tq3sAmihDztP1ugaI9c BSLA99zMhF29MzTBplx6gdkNUizOuO5XXfvNavJ4jRIsYOuoSj1v2Vjn/4FHrorH/Aw3 XA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 35/39] chardev: cpr for pty Date: Wed, 15 Jun 2022 07:52:22 -0700 Message-Id: <1655304746-102776-36-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: ikgGDrnnJXY8uYTwmdLTWemy8SXjCvzf X-Proofpoint-ORIG-GUID: ikgGDrnnJXY8uYTwmdLTWemy8SXjCvzf Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306678134100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Save and restore pty descriptors across cpr-save and cpr-load. Signed-off-by: Steve Sistare --- chardev/char-pty.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/chardev/char-pty.c b/chardev/char-pty.c index 53f25c6..ff5b00a 100644 --- a/chardev/char-pty.c +++ b/chardev/char-pty.c @@ -29,6 +29,7 @@ #include "qemu/sockets.h" #include "qemu/error-report.h" #include "qemu/module.h" +#include "migration/cpr.h" #include "qemu/qemu-print.h" =20 #include "chardev/char-io.h" @@ -190,6 +191,9 @@ static void char_pty_finalize(Object *obj) Chardev *chr =3D CHARDEV(obj); PtyChardev *s =3D PTY_CHARDEV(obj); =20 + if (chr->cpr_enabled) { + cpr_delete_fd(chr->label, 0); + } pty_chr_state(chr, 0); object_unref(OBJECT(s->ioc)); pty_chr_timer_cancel(s); @@ -317,12 +321,20 @@ static void char_pty_open(Chardev *chr, char pty_name[PATH_MAX]; char *name; =20 + master_fd =3D cpr_find_fd(chr->label, 0); + if (master_fd >=3D 0) { + chr->filename =3D g_strdup_printf("pty:unknown"); + goto have_fd; + } + master_fd =3D qemu_openpty_raw(&slave_fd, pty_name); if (master_fd < 0) { error_setg_errno(errp, errno, "Failed to create PTY"); return; } - + if (chr->cpr_enabled) { + cpr_save_fd(chr->label, 0, master_fd); + } close(slave_fd); if (!g_unix_set_fd_nonblocking(master_fd, true, NULL)) { error_setg_errno(errp, errno, "Failed to set FD nonblocking"); @@ -333,6 +345,8 @@ static void char_pty_open(Chardev *chr, qemu_printf("char device redirected to %s (label %s)\n", pty_name, chr->label); =20 +have_fd: + qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_CPR); s =3D PTY_CHARDEV(chr); s->ioc =3D QIO_CHANNEL(qio_channel_file_new_fd(master_fd)); name =3D g_strdup_printf("chardev-pty-%s", chr->label); --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306083; cv=none; d=zohomail.com; s=zohoarc; b=F1AlH/gX7C7H0M1DQL/o+FDO5414eRXe+mo01qUFWgbDiSbxFmgJiYi9n0eJtcMNiVZxlExYr/DZnu1+lFjL1OdGkD9rVUbFZmGBpEBFN5AlYCa7V+PzRJYeJlx/LzXf5+xT90Cjly7SLbNUDx55Q7ayYp+ocDOyl7StW1RgOhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306083; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=nL9sWxmyOPM5u9KgInXR79NDNqqaTQUG+Zfw0B46+Dw=; b=fcUQQckSMy4BUkvbmF8gY3+H667uDL2UTPa/ALs7ZMFCMW/eHTcccDTH3iYRnB7cXDG2astWvjQ43SgRu4Pu59omCah4FHKb1LkAuHfisR2IXAcJDuNwaoYmv1AQI0jVxjKI1x4RB31+t6cEl+nE71gRR8UXcN20nHmpM5huOsg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306083157147.8616547851775; Wed, 15 Jun 2022 08:14:43 -0700 (PDT) Received: from localhost ([::1]:54224 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UjB-0004kz-4D for importer@patchew.org; Wed, 15 Jun 2022 11:14:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47660) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOb-0007La-Ea for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:25 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:41160) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOY-000161-Od for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:24 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FDbEWw015196; Wed, 15 Jun 2022 14:53:13 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhn0gvg0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:13 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7A8023097; Wed, 15 Jun 2022 14:53:12 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq6v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:12 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNt018501; Wed, 15 Jun 2022 14:53:11 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-37; Wed, 15 Jun 2022 14:53:11 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=nL9sWxmyOPM5u9KgInXR79NDNqqaTQUG+Zfw0B46+Dw=; b=BA399D/PTucGoGBiBaqIfEoxL4uZALPhlXeCnLpztTFmczVS/jmU0V4qTRwrOxvt1ZZy ymBkNUaw9IMdWn+COK7aPMItmgX1DXuLjwbW4a0M743Yq4RwhJpeDADSBLJvJgfSbHO6 NqtwBQxv1ED2E81UX92ZRqtm5+2fsTMyrMzQuRot2ZSrMny1am+24CCWGrbIx+eAQQjn vqOuDBQ9u/zP7IfafB6PqR5BgKArXIh1gDt4jg2uhdbX+W9/743L9kDNpG+oIZHsDHkA 0y+lxaUXB6KpfxIUP7K8wo2sOgWPL5nPfddKXpCu4rlDPg3XB+bAXg0fIkaCcoWxY3aN /w== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 36/39] chardev: cpr for sockets Date: Wed, 15 Jun 2022 07:52:23 -0700 Message-Id: <1655304746-102776-37-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: v8mPz6jb1HYopqpbxNoEI8ePU8uzLi5E X-Proofpoint-ORIG-GUID: v8mPz6jb1HYopqpbxNoEI8ePU8uzLi5E 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_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306084773100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Save accepted socket fds before cpr-save, and look for them after cpr-load. Block cpr-exec if a socket enables the TLS or websocket option. Allow a monitor socket by closing it on exec. Signed-off-by: Mark Kanda Signed-off-by: Steve Sistare --- chardev/char-socket.c | 45 +++++++++++++++++++++++++++++++++++++++= ++++ include/chardev/char-socket.h | 1 + monitor/hmp.c | 3 +++ monitor/qmp.c | 3 +++ 4 files changed, 52 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index dc4e218..3a1e36b 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -26,6 +26,7 @@ #include "chardev/char.h" #include "io/channel-socket.h" #include "io/channel-websock.h" +#include "migration/cpr.h" #include "qemu/error-report.h" #include "qemu/module.h" #include "qemu/option.h" @@ -33,6 +34,7 @@ #include "qapi/clone-visitor.h" #include "qapi/qapi-visit-sockets.h" #include "qemu/yank.h" +#include "sysemu/sysemu.h" =20 #include "chardev/char-io.h" #include "chardev/char-socket.h" @@ -358,6 +360,11 @@ static void tcp_chr_free_connection(Chardev *chr) SocketChardev *s =3D SOCKET_CHARDEV(chr); int i; =20 + if (chr->cpr_enabled) { + cpr_delete_fd(chr->label, 0); + } + cpr_del_blocker(&s->cpr_blocker); + if (s->read_msgfds_num) { for (i =3D 0; i < s->read_msgfds_num; i++) { close(s->read_msgfds[i]); @@ -923,6 +930,10 @@ static void tcp_chr_accept(QIONetListener *listener, QIO_CHANNEL(cioc)); } tcp_chr_new_client(chr, cioc); + + if (s->sioc && chr->cpr_enabled) { + cpr_resave_fd(chr->label, 0, s->sioc->fd, NULL); + } } =20 =20 @@ -1178,6 +1189,26 @@ static gboolean socket_reconnect_timeout(gpointer op= aque) return false; } =20 +static int load_char_socket_fd(Chardev *chr, Error **errp) +{ + SocketChardev *sockchar =3D SOCKET_CHARDEV(chr); + QIOChannelSocket *sioc; + const char *label =3D chr->label; + int fd =3D cpr_find_fd(label, 0); + + if (fd !=3D -1) { + sockchar =3D SOCKET_CHARDEV(chr); + sioc =3D qio_channel_socket_new_fd(fd, errp); + if (sioc) { + tcp_chr_accept(sockchar->listener, sioc, chr); + object_unref(OBJECT(sioc)); + } else { + error_setg(errp, "could not restore socket for %s", label); + return -1; + } + } + return 0; +} =20 static int qmp_chardev_open_socket_server(Chardev *chr, bool is_telnet, @@ -1388,6 +1419,18 @@ static void qmp_chardev_open_socket(Chardev *chr, } s->registered_yank =3D true; =20 + if (!s->tls_creds && !s->is_websock) { + qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_CPR); + } else if (!chr->reopen_on_cpr) { + s->cpr_blocker =3D NULL; + error_setg(&s->cpr_blocker, + "error: socket %s is not cpr capable due to %s option", + chr->label, (s->tls_creds ? "TLS" : "websocket")); + if (cpr_add_blocker(&s->cpr_blocker, errp, CPR_MODE_RESTART, 0)) { + return; + } + } + /* be isn't opened until we get a connection */ *be_opened =3D false; =20 @@ -1403,6 +1446,8 @@ static void qmp_chardev_open_socket(Chardev *chr, return; } } + + load_char_socket_fd(chr, errp); } =20 static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, diff --git a/include/chardev/char-socket.h b/include/chardev/char-socket.h index 0708ca6..1c3abf7 100644 --- a/include/chardev/char-socket.h +++ b/include/chardev/char-socket.h @@ -78,6 +78,7 @@ struct SocketChardev { bool connect_err_reported; =20 QIOTask *connect_task; + Error *cpr_blocker; }; typedef struct SocketChardev SocketChardev; =20 diff --git a/monitor/hmp.c b/monitor/hmp.c index 15ca047..75e6739 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1501,4 +1501,7 @@ void monitor_init_hmp(Chardev *chr, bool use_readline= , Error **errp) qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, monitor_r= ead, monitor_event, NULL, &mon->common, NULL, true= ); monitor_list_append(&mon->common); + + /* monitor cannot yet be preserved across cpr */ + chr->reopen_on_cpr =3D true; } diff --git a/monitor/qmp.c b/monitor/qmp.c index 092c527..0043459 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -535,4 +535,7 @@ void monitor_init_qmp(Chardev *chr, bool pretty, Error = **errp) NULL, &mon->common, NULL, true); monitor_list_append(&mon->common); } + + /* Monitor cannot yet be preserved across cpr */ + chr->reopen_on_cpr =3D true; } --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306586; cv=none; d=zohomail.com; s=zohoarc; b=FuAbb3PV0ks3IUvSkp4Ms+zKlXA8RQk+WIyEUGE2DnVONnXPhW74e0tOn1q9AacXW4f+c+IZqJB/egOb631V2akteErW8nrOgwWlTgHN8+QFagJbW7jAKnFnLADDuearrNwTB+ylUlV9c5HLKgasjNwg7JvrC3dsDx24UuZHPfc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306586; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=5kgwdTgYiH/ebPCufCeVFS5dIRPUl4P0QfsJgnWgqug=; b=n3Ix8QYEo3s/UephX44YEhgu0+EW6WhaDEZyBxUmNMtlat+q2UksN+ewbiLWPy8ZvxRcrAM0AC6f9zY+FntkA9B1767TdJHo8KQ6snAKCTZ/ChoqmeFMfpjskJis83wfq6nvAVr/a3BcdL3D2h8zwgequzKk8mH4tNeqeil9/wk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306585971129.9362702536382; Wed, 15 Jun 2022 08:23:05 -0700 (PDT) Received: from localhost ([::1]:39160 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1UrI-0006Ch-Qi for importer@patchew.org; Wed, 15 Jun 2022 11:23:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47814) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOn-0007mf-TO for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:39 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:10412) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOl-00016R-3t for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:37 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0c2X001492; Wed, 15 Jun 2022 14:53:14 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tnk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:14 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7tX023103; Wed, 15 Jun 2022 14:53:13 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq7m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:13 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNv018501; Wed, 15 Jun 2022 14:53:12 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-38; Wed, 15 Jun 2022 14:53:12 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=5kgwdTgYiH/ebPCufCeVFS5dIRPUl4P0QfsJgnWgqug=; b=ga+urvzmsuTxEofyRC/TLAmW9wNxX1dY/Bpz/mBGDfCTNPJYOX5zrlwZoaLcEZbaTUeh DiN+gg93H3f8nDsvlUGnWu8gtGS6tmNSSKYjW5/sUikPPO8TdANjRwW5HMco8MABFIYK DwHWQ1uSJK6f7MhD3PgdgQp3q8KgB+pcdZmmzSeBEqpjkHxeRYx1IHv0c58DDT0y/BSQ 3vdfZjGBurM2QkXB7ZNFNvAWvPMBM1zkZY5bOlrCzcDN1Pmhl92EDgEVjKFkmpbsUun6 hzoAgXVBgz7SGnmNHkEz0aEsvtU4vz3GMzmD/JBDqWj3Akx5twr1X7oRhJEBcRzbcnym cg== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 37/39] cpr: only-cpr-capable option Date: Wed, 15 Jun 2022 07:52:24 -0700 Message-Id: <1655304746-102776-38-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: UJHZ0Tr58QblZt33fFHWtILUxi8glJ0W X-Proofpoint-ORIG-GUID: UJHZ0Tr58QblZt33fFHWtILUxi8glJ0W Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306587439100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add the only-cpr-capable option, which causes qemu to exit with an error if any devices that are not capable of cpr are added. This guarantees that cpr-save will not fail due to a blocker. Signed-off-by: Steve Sistare --- include/migration/cpr.h | 2 +- migration/cpr.c | 13 +++++++++++-- qemu-options.hx | 8 ++++++++ softmmu/vl.c | 6 +++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/include/migration/cpr.h b/include/migration/cpr.h index ab5f53e..c7eb914 100644 --- a/include/migration/cpr.h +++ b/include/migration/cpr.h @@ -11,7 +11,7 @@ #include "qapi/qapi-types-cpr.h" #include "qemu/notify.h" =20 -void cpr_init(int modes); +void cpr_init(int modes, bool only_cpr_capable); void cpr_set_mode(CprMode mode); CprMode cpr_get_mode(void); bool cpr_enabled(CprMode mode); diff --git a/migration/cpr.c b/migration/cpr.c index 9d6bca4..7f507f1 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -18,9 +18,11 @@ #include "sysemu/sysemu.h" =20 static int cpr_enabled_modes; +static bool only_cpr_capable; =20 -void cpr_init(int modes) +void cpr_init(int modes, bool only_cpr) { + only_cpr_capable =3D only_cpr; cpr_enabled_modes =3D modes; cpr_state_load(&error_fatal); } @@ -36,7 +38,7 @@ static GSList *cpr_blockers[CPR_MODE__MAX]; * Add blocker for each mode in varargs list, or for all modes if CPR_MODE= _ALL * is specified. Caller terminates the list with 0 or CPR_MODE_ALL. This * function takes ownership of *reasonp, and frees it on error, or in - * cpr_del_blocker. errp is set in a later patch. + * cpr_del_blocker. */ int cpr_add_blocker(Error **reasonp, Error **errp, CprMode mode, ...) { @@ -55,6 +57,13 @@ int cpr_add_blocker(Error **reasonp, Error **errp, CprMo= de mode, ...) modes =3D BIT(CPR_MODE__MAX) - 1; } =20 + if (only_cpr_capable && (cpr_enabled_modes & modes)) { + error_propagate_prepend(errp, *reasonp, + "-only-cpr-capable specified, but: "); + *reasonp =3D NULL; + return -EACCES; + } + for (mode =3D 0; mode < CPR_MODE__MAX; mode++) { if (modes & BIT(mode)) { cpr_blockers[mode] =3D g_slist_prepend(cpr_blockers[mode], *re= asonp); diff --git a/qemu-options.hx b/qemu-options.hx index 2f4bb2b..25e392f 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4511,6 +4511,14 @@ SRST commands. ERST =20 +DEF("only-cpr-capable", 0, QEMU_OPTION_only_cpr_capable, \ + "-only-cpr-capable allow only cpr capable devices\n", QEMU_ARCH_ALL) +SRST +``-only-cpr-capable`` + Only allow cpr capable devices, which guarantees that cpr-save will not + fail due to a cpr blocker. +ERST + DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \ "-nodefaults don't create default devices\n", QEMU_ARCH_ALL) SRST diff --git a/softmmu/vl.c b/softmmu/vl.c index 3e19c74..1bee692 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2604,6 +2604,7 @@ void qemu_init(int argc, char **argv, char **envp) bool userconfig =3D true; FILE *vmstate_dump_file =3D NULL; int cpr_modes =3D 0; + bool only_cpr_capable =3D false; =20 qemu_add_opts(&qemu_drive_opts); qemu_add_drive_opts(&qemu_legacy_drive_opts); @@ -3321,6 +3322,9 @@ void qemu_init(int argc, char **argv, char **envp) cpr_modes |=3D BIT(qapi_enum_parse(&CprMode_lookup, optarg= , -1, &error_fatal)); break; + case QEMU_OPTION_only_cpr_capable: + only_cpr_capable =3D true; + break; case QEMU_OPTION_nodefaults: has_defaults =3D 0; break; @@ -3472,7 +3476,7 @@ void qemu_init(int argc, char **argv, char **envp) qemu_validate_options(machine_opts_dict); qemu_process_sugar_options(); =20 - cpr_init(cpr_modes); + cpr_init(cpr_modes, only_cpr_capable); =20 /* * These options affect everything else and should be processed --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306813; cv=none; d=zohomail.com; s=zohoarc; b=GmFCK4E/z/NsYRDWwyvHTJeE7fk02ou+SIq5ukoy6a6XSqq/v6eZbgI3v2OUkJ5EEmO59A+WZ5NBcAnQi65oRz1QolzqoZ1AkQ7VJin8H8O+uv9S0il23mZh8CWtFhNAlE2zSkYXILzWVXux0kIqVhzhqLLPGoa1NDo3qWXvNT8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306813; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=7tyxW1gFURtYbDz4zwB3N0WvJeD2az8xGMuQaS2NWYk=; b=iT7VYw9z3OlKYsgS65eqiWfGqu2hmRcBUdFLegmkpcsUXDshY5f58TP8v/9I/f9Z3BZXfrRGDzdYpQ34kk2pRpyHZFRagl/3a0Hs3skxthsNqL42YBmsE5+h9RG7mw9NrFL8178iiQWZ7sjUwMXUKwZIKiD5TGLzK8gpOtX+Ohk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306813081603.1099892185442; Wed, 15 Jun 2022 08:26:53 -0700 (PDT) Received: from localhost ([::1]:47552 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Uux-0003cA-Vc for importer@patchew.org; Wed, 15 Jun 2022 11:26:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47910) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOv-0007tO-GO for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:45 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:27086) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOt-00017n-8u for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:44 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0c2Z001492; Wed, 15 Jun 2022 14:53:15 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmjns8tnr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:15 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7AB023097; Wed, 15 Jun 2022 14:53:14 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq8e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:14 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSNx018501; Wed, 15 Jun 2022 14:53:14 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-39; Wed, 15 Jun 2022 14:53:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=7tyxW1gFURtYbDz4zwB3N0WvJeD2az8xGMuQaS2NWYk=; b=PtfZUHLrja8xtEiovHTMVpo5bhmTBGHR4vgWLK3moguRnglc0OVKPIQDkZLPLmZ51dZN Fon32RVnwBP+gVcWUnbzWvZcQs53WqVooAInIebpGNNqA6o8Xp8xlMoPErjKDvJ03NkH Jhhq+YW87/mfRZVk0WmjhB3HH65CukgUUtgipB/kcY7rnWKHK8FqGGVmhxIEKCYNRr9J t7vd5GhMWJB5aVzhLzwyCyU7DAHmivwCvAfIqMTI1Y3ziiFnYcmWmPtBecFKmD+b+uFt UjZiM+LIRblu+UD9WYxyOjYqsMA1wNVLfSFAtyN4q0jXw11hU/kfa89ZDQaaUS0MKA2K Yg== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 38/39] python/machine: add QEMUMachine accessors Date: Wed, 15 Jun 2022 07:52:25 -0700 Message-Id: <1655304746-102776-39-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: Hqdt7RJzoybz-tl9O1lKE1rTKbli5s8- X-Proofpoint-ORIG-GUID: Hqdt7RJzoybz-tl9O1lKE1rTKbli5s8- Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306814788100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Provide full_args() to return all command-line arguments used to start a vm, some of which are not otherwise visible to QEMUMachine clients. This is needed by the cpr test, which must start a vm, then pass all qemu command-line arguments to the cpr-exec monitor call. Provide reopen_qmp_connection() to reopen a closed monitor connection. This is needed by cpr, because qemu-exec closes the monitor socket. Signed-off-by: Steve Sistare --- python/qemu/machine/machine.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py index 37191f4..60b934d 100644 --- a/python/qemu/machine/machine.py +++ b/python/qemu/machine/machine.py @@ -332,6 +332,11 @@ def args(self) -> List[str]: """Returns the list of arguments given to the QEMU binary.""" return self._args =20 + @property + def full_args(self) -> List[str]: + """Returns the full list of arguments used to launch QEMU.""" + return list(self._qemu_full_args) + def _pre_launch(self) -> None: if self._console_set: self._remove_files.append(self._console_address) @@ -486,6 +491,15 @@ def _close_qmp_connection(self) -> None: finally: self._qmp_connection =3D None =20 + def reopen_qmp_connection(self): + self._close_qmp_connection() + self._qmp_connection =3D QEMUMonitorProtocol( + self._monitor_address, + server=3DTrue, + nickname=3Dself._name + ) + self._qmp.accept(self._qmp_timer) + def _early_cleanup(self) -> None: """ Perform any cleanup that needs to happen before the VM exits. --=20 1.8.3.1 From nobody Mon Feb 9 00:46:45 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1655306575; cv=none; d=zohomail.com; s=zohoarc; b=YQ4Rc0rrfdJaHtJ13B+XgLKSf/yqi5adSYOEHnl0FvK4tSTkMau942X9tRBOBw4LJYixtY12ZaNT1hQ4MWBOEAr6BpaH3mAL2UKxT7fvPdEiTGvjr3cYNPujObjexJv6KFIvBAztDFgkdYCvGsWwzLoqe3pOqk6cQcf47e9ZufA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1655306575; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=USZPM1Joce+jMmK64fgOgXWv6jKDLcMYDJzCJ6Lk4lM=; b=EfcKnS9cNOu0BnGrLgbEdl5nM5NTykov5C+Z87XcMuXisR1SUg+V3tIyjnoFdmCwYq+LaKWg+XC5lhNvXTFfQYvMPh6DO62ymalgS2WJPcP///YNTuPrDuPIyNMdophStot2B+1g4lzIkxMJaqGsRf05kmDknMNwxo+1aX1EdPM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1655306575906428.231941503704; Wed, 15 Jun 2022 08:22:55 -0700 (PDT) Received: from localhost ([::1]:39050 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1Ur8-00068S-4B for importer@patchew.org; Wed, 15 Jun 2022 11:22:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47860) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOq-0007om-OG for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:40 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:16110) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1UOo-00016u-S1 for qemu-devel@nongnu.org; Wed, 15 Jun 2022 10:53:40 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25FE0Gw9025874; Wed, 15 Jun 2022 14:53:17 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gmhu2rxgt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:16 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25FEQ7ta023103; Wed, 15 Jun 2022 14:53:15 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vq94-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 15 Jun 2022 14:53:15 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 25FEqSO1018501; Wed, 15 Jun 2022 14:53:15 GMT Received: from ca-dev63.us.oracle.com (ca-dev63.us.oracle.com [10.211.8.221]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3gpr25vpfm-40; Wed, 15 Jun 2022 14:53:15 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2021-07-09; bh=USZPM1Joce+jMmK64fgOgXWv6jKDLcMYDJzCJ6Lk4lM=; b=LacwNyL0YPt6zYjNImSXUSS2S5LLQhq6jmCHOvZMWImJOkB3D6TODcvlxjGBTiM3ZUbZ QWKcqbZ/qDpJNbsWj3zFyaFWKkeEwC7YtoMjvP2drPvLhmshfsAGNKLVQZgHmGwgPRxR YE1+GHuDU0ttlukXoSWgFXumalwytThRk5U1kUxMC7f58enpvt+lGIExrxuKgAK0HoyM j1fazrezcxVYDKBM4dp0gBilVaLtZa3xqCGkeWC18YKiWXngqhgfcgwPoU+x4b2Mbt3p UV0R6wdFCP3m25xaeMuVszDrVVFKD2bIEJUJPAyaYt2s/7k/3yZPmYrbwDOPhqpK+1UN mA== From: Steve Sistare To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Alex=20Benn=C3=A9e?= , "Dr. David Alan Gilbert" , "Michael S. Tsirkin" , Marcel Apfelbaum , Alex Williamson , "Daniel P. Berrange" , Juan Quintela , Markus Armbruster , Eric Blake , Jason Zeng , Zheng Chuan , Steve Sistare , Mark Kanda , Guoyi Tu , Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Mammedov , David Hildenbrand , John Snow Subject: [PATCH V8 39/39] tests/avocado: add cpr regression test Date: Wed, 15 Jun 2022 07:52:26 -0700 Message-Id: <1655304746-102776-40-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> References: <1655304746-102776-1-git-send-email-steven.sistare@oracle.com> X-Proofpoint-GUID: kPPRzPM9EZePLA5LN7HAIhF51JTehBkB X-Proofpoint-ORIG-GUID: kPPRzPM9EZePLA5LN7HAIhF51JTehBkB Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=steven.sistare@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1655306577208100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Steve Sistare --- MAINTAINERS | 1 + tests/avocado/cpr.py | 152 +++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 153 insertions(+) create mode 100644 tests/avocado/cpr.py diff --git a/MAINTAINERS b/MAINTAINERS index 864aec6..4e6e7ab 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3164,6 +3164,7 @@ F: stubs/cpr.c F: tests/unit/test-strlist.c F: migration/cpr-state.c F: stubs/cpr-state.c +F: tests/avocado/cpr.py =20 Record/replay M: Pavel Dovgalyuk diff --git a/tests/avocado/cpr.py b/tests/avocado/cpr.py new file mode 100644 index 0000000..feb43d1 --- /dev/null +++ b/tests/avocado/cpr.py @@ -0,0 +1,152 @@ +# cpr test + +# Copyright (c) 2021, 2022 Oracle and/or its affiliates. +# +# This work is licensed under the terms of the GNU GPL, version 2. +# See the COPYING file in the top-level directory. + +import tempfile +from avocado_qemu import QemuSystemTest +from avocado.utils import wait + +class Cpr(QemuSystemTest): + """ + :avocado: tags=3Dcpr + """ + + timeout =3D 5 + fast_timeout =3D 1 + + @staticmethod + def has_status(vm, status): + return vm.command('query-status')['status'] =3D=3D status + + def wait_for_status(self, vm, status): + wait.wait_for(self.has_status, + timeout=3Dself.timeout, + step=3D0.1, + args=3D(vm,status,)) + + def run_and_fail(self, vm, msg): + # Qemu will fail fast, so disable monitor to avoid timeout in acce= pt + vm.set_qmp_monitor(False) + vm.launch() + vm.wait(self.timeout) + self.assertRegex(vm.get_log(), msg) + + def do_cpr_restart(self, vmstate_name): + vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'restart', + '-object', 'memory-backend-memfd,id=3Dpc.ram,size= =3D8M', + '-machine', 'memory-backend=3Dpc.ram') + + vm.launch() + + vm.qmp('cpr-save', filename=3Dvmstate_name, mode=3D'restart') + vm.event_wait(name=3D'STOP', timeout=3Dself.fast_timeout) + + args =3D vm.full_args + ['-S'] + vm.qmp('cpr-exec', argv=3Dargs) + + # exec closes the monitor socket, so reopen it. + vm.reopen_qmp_connection() + + self.wait_for_status(vm, 'prelaunch') + vm.qmp('cpr-load', filename=3Dvmstate_name, mode=3D'restart') + vm.event_wait(name=3D'RESUME', timeout=3Dself.fast_timeout) + + self.assertEqual(vm.command('query-status')['status'], 'running') + + def do_cpr_reboot(self, vmstate_name): + old_vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'reboot') + old_vm.launch() + + old_vm.qmp('cpr-save', filename=3Dvmstate_name, mode=3D'reboot') + old_vm.event_wait(name=3D'STOP', timeout=3Dself.fast_timeout) + + new_vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'reboot', + '-S') + new_vm.launch() + self.wait_for_status(new_vm, 'prelaunch') + + new_vm.qmp('cpr-load', filename=3Dvmstate_name, mode=3D'reboot') + new_vm.event_wait(name=3D'RESUME', timeout=3Dself.fast_timeout) + + self.assertEqual(new_vm.command('query-status')['status'], 'runnin= g') + + def test_cpr_restart(self): + """ + Verify that cpr restart mode works + """ + with tempfile.NamedTemporaryFile() as vmstate_file: + self.do_cpr_restart(vmstate_file.name) + + def test_cpr_reboot(self): + """ + Verify that cpr reboot mode works + """ + with tempfile.NamedTemporaryFile() as vmstate_file: + self.do_cpr_reboot(vmstate_file.name) + + def test_cpr_block_cpr_save(self): + + """ + Verify that qemu rejects cpr-save for volatile memory + """ + vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'restart') + vm.launch() + rsp =3D vm.qmp('cpr-save', filename=3D'/dev/null', mode=3D'restart= ') + vm.qmp('quit') + + expect =3D r'Memory region .* is volatile' + self.assertRegex(rsp['error']['desc'], expect) + + def test_cpr_block_memfd(self): + + """ + Verify that qemu complains for only-cpr-capable and volatile memory + """ + vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'restart', + '-only-cpr-capable') + self.run_and_fail(vm, r'only-cpr-capable specified.* Memory ') + + def test_cpr_block_replay(self): + """ + Verify that qemu complains for only-cpr-capable and replay + """ + vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'restart', + '-object', 'memory-backend-memfd,id=3Dpc.ram,size= =3D8M', + '-machine', 'memory-backend=3Dpc.ram', + '-only-cpr-capable', + '-icount', 'shift=3D10,rr=3Drecord,rrfile=3D/dev/= null') + self.run_and_fail(vm, r'only-cpr-capable specified.* replay ') + + def test_cpr_block_chardev(self): + """ + Verify that qemu complains for only-cpr-capable and unsupported ch= ardev + """ + vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'restart', + '-object', 'memory-backend-memfd,id=3Dpc.ram,size= =3D8M', + '-machine', 'memory-backend=3Dpc.ram', + '-only-cpr-capable', + '-chardev', 'vc,id=3Dvc1') + self.run_and_fail(vm, r'only-cpr-capable specified.* vc1 ') + + def test_cpr_allow_chardev(self): + """ + Verify that qemu allows unsupported chardev with reopen-on-cpr + """ + vm =3D self.get_vm('-nodefaults', + '-cpr-enable', 'restart', + '-object', 'memory-backend-memfd,id=3Dpc.ram,size= =3D8M', + '-machine', 'memory-backend=3Dpc.ram', + '-only-cpr-capable', + '-chardev', 'vc,id=3Dvc1,reopen-on-cpr=3Don') + vm.launch() + self.wait_for_status(vm, 'running') --=20 1.8.3.1