From nobody Mon Feb 9 16:53:04 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; arc=pass (i=1 dmarc=pass fromdomain=oracle.com); dmarc=fail(p=none dis=none) header.from=oracle.com ARC-Seal: i=2; a=rsa-sha256; t=1625679613; cv=pass; d=zohomail.com; s=zohoarc; b=hJ9yBLXi1SaWCULfpVe5nkrYR6goKBMjYYAY5sXRBlMZdvSWw8NrEaAw8M0GqgTwcQUjb3qnenzq5xWc8SgT5x076G7uANCTx/SzAjhimp4WNcFBjBQuqrXxP8SCtLA8YBtLDsALAIEA3vfLl0f8OOGZiiDSqNIsYTxc6JAD/R8= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1625679613; h=Content-Type: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=Dk4a+4WEUNVhnxOqffn7vWAGVx8wK6B+mqjTQqEBC20=; b=AqOr4PilZBqzT8w4uk1317LVN+FFmI1AZ+NSkhw15jDj+fWfFJ7HOoEtsalRLswKtd7UBj1v6ZUeKIec/ti7GcVEQKbNAX73VaI8UC8CqRgfUkfjxUFBm+a403gMdqPFii1Ge95Mqo9mRdL32PGfb01itQDATJshLujJaanaG24= ARC-Authentication-Results: i=2; 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; arc=pass (i=1 dmarc=pass fromdomain=oracle.com); dmarc=fail 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 1625679613477689.3525021231169; Wed, 7 Jul 2021 10:40:13 -0700 (PDT) Received: from localhost ([::1]:46362 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m1BWu-0001s3-Ay for importer@patchew.org; Wed, 07 Jul 2021 13:40:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48198) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m1BKc-0000e5-T1 for qemu-devel@nongnu.org; Wed, 07 Jul 2021 13:27:31 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:37654) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m1BKZ-0006q4-OE for qemu-devel@nongnu.org; Wed, 07 Jul 2021 13:27:30 -0400 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 167HCPEl011986; Wed, 7 Jul 2021 17:27:25 GMT Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by mx0b-00069f02.pphosted.com with ESMTP id 39nbsxrqng-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 07 Jul 2021 17:27:24 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 167HAXXl155319; Wed, 7 Jul 2021 17:27:23 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2109.outbound.protection.outlook.com [104.47.58.109]) by userp3020.oracle.com with ESMTP id 39k1nxjv9e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 07 Jul 2021 17:27:23 +0000 Received: from BYAPR10MB3240.namprd10.prod.outlook.com (2603:10b6:a03:155::17) by BY5PR10MB4180.namprd10.prod.outlook.com (2603:10b6:a03:211::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.20; Wed, 7 Jul 2021 17:27:20 +0000 Received: from BYAPR10MB3240.namprd10.prod.outlook.com ([fe80::59e7:5c8c:71fb:a6ba]) by BYAPR10MB3240.namprd10.prod.outlook.com ([fe80::59e7:5c8c:71fb:a6ba%7]) with mapi id 15.20.4287.033; Wed, 7 Jul 2021 17:27:20 +0000 Received: from ca-dev63.us.oracle.com (148.87.23.13) by SJ0PR03CA0104.namprd03.prod.outlook.com (2603:10b6:a03:333::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4308.21 via Frontend Transport; Wed, 7 Jul 2021 17:27:19 +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 : content-type : mime-version; s=corp-2020-01-29; bh=Dk4a+4WEUNVhnxOqffn7vWAGVx8wK6B+mqjTQqEBC20=; b=OXz1gtHqup7/Dp0zsAqIvtO9L1a4gzPonP+p6YlCpOFHssjbHDRbvgV1bt4qzpiHQCaI HSzM2CafuTJLLF+w3FdTPn3VSHwQY0Nqf5kQVyAyNJs0J4XSc7UMMmU4z99ThfjuuXBn NFjA9uVO7fQ3xq+4NTAt5hoSBg6WmjML3ZjGgpuyZAEbmA2zeacs92mkJ0ri5GOX80sL 1RxESUopJFZGF/jhYwU3REf8xa3mhOBnan8d9PyA4EdnfFUHWVVlYpgt+3JU0D4N4vNr 1MQHJnLm70lMEhG0Ah9u8pGkWZA7mlGA1PMa1FQ9Kbjx/f/XW4r3UCKj2t6Vmf2ABJPk Ww== ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EcpLzXs2+YAhFW3p3BxcBNL9tx3UTfE0d85/Z7V+mSJdDIyCYAbyNgFjpLaNP89dbcPQ2VtU8BRqZ2ZQXMjoF3FAsPX96nyS/Y9Sr/nx9Ez4sAMqRZLR+MmKLmCZ98sybUOT6nkwauKsZKq+60NdNwrA0AHgplxTPKMlAcklZkwcrqegYrkn2jwex1hTFbB+J3fAfDapH5f0gtFxswupPZOVN/Z+lbFso3Pmp5uQv6Igk97yFMc8etir1eapo9zlHiP4yZtPeBUzIzWAPPn2dbvwF2gA4RfYlzAG5Cskg8Dg19rF1h4cmvZXX9YhPBrh5Ol9F9ff71E0AOD/rlfv1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Dk4a+4WEUNVhnxOqffn7vWAGVx8wK6B+mqjTQqEBC20=; b=kzxWvH+KJg7aC3uVfOuIpEVf+ATvHsodQfKzmCXe5notuLxRwB57qesRpNewW2gVx7wldSlTT4o9G5b2NyXivE0jUUAwO+VYP2a32kLM0LkvKDq3HaSeHDP0seSHAGvUl8ql4nDL+UhDDOfvdrUTv8UpD6V0cbp/gtahFR6n36tdWtpDIpU2g/YIwAxsQgIrBQh0DsOLJnA276z7ATXjSqGwsw25A4fBlNRO6v/JImu4smJLYGzVwpN/uejDshZfGo1ovusQUlSurvJJNIzm7lXxbQLSJpQxiWY6n+GW6pAwoHKYDjVdjKYivYNpFHX4hbBBYBUqdEGWrozeddzPfw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Dk4a+4WEUNVhnxOqffn7vWAGVx8wK6B+mqjTQqEBC20=; b=J5qF4TLNGWdbc7bb9yIKq/Uj80GwlQBuCasu+UjyUhFSJ8oytxiFVqX1CrXxuesuzmVSJNyfVd3s7qB43wluXSfaWxlN/gl19/eOEay1i/Tj/q6uwnJFbpaYPXVckRe+CMb1yqaixLa6NSfRLsBM8S52xEnaQ+KFkDIcWtZKDdo= Authentication-Results: nongnu.org; dkim=none (message not signed) header.d=none;nongnu.org; dmarc=none action=none header.from=oracle.com; From: Steve Sistare To: qemu-devel@nongnu.org Subject: [PATCH V5 20/25] chardev: cpr framework Date: Wed, 7 Jul 2021 10:20:29 -0700 Message-Id: <1625678434-240960-21-git-send-email-steven.sistare@oracle.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1625678434-240960-1-git-send-email-steven.sistare@oracle.com> References: <1625678434-240960-1-git-send-email-steven.sistare@oracle.com> X-ClientProxiedBy: SJ0PR03CA0104.namprd03.prod.outlook.com (2603:10b6:a03:333::19) To BYAPR10MB3240.namprd10.prod.outlook.com (2603:10b6:a03:155::17) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7224cd97-6bb7-4a01-7b33-08d9416c7949 X-MS-TrafficTypeDiagnostic: BY5PR10MB4180: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:85; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: gCM7FicXHD9swsknTNAji7wTnMwUMmMQjL3fWZXG8abSmrJuWJuLidE/P413A5p5myuLn5VqPBq9pVVtR8audqOxmQtgIX5M8TrQ5y3A6EssML9hNdecqUwDRbQvnTZditm045yR6ByUR0q1MVPrSkuU631EUKtcLGygl0UQlxNFA2/nYlFsTpOxZO9PRjsjP6Y/dJlQA0wZrIFRg6sY/d9AfVyTW+Jno6AtLYj/ReZd06KCra3toW1N47WnCsZ125uGDqqnj1RqyFICIiVop90zA4fZP1Yl0IOg1Dx4rBj69Viz6YnbNWc2tjX6FhMln+PlkiAzviZiW1UHYzBjj9t9pJGRCIBE7zkbv8n8iMdZ9S3Pb+d3NkRBDpaSvvonSUuVk/ymykut2v07afMjGtaxjB8nrlpeNFxIZ7nhe7ypuZ4LaMdDPd/xWOAdbR9ADd0xDZP849CxHqquG8h3LoZ1bhjI6gDdO7tiRjo8jAK0pncQHCwjN5Zgzvga7vGLxwl+MpxEwlWaHcbDSTU67jz5fb7IvjaTnTmIf/3EPhFLpCWQ4wg4CfkDqT6TOt/mioaQc3+8czjJ3DLmfqVQ+R1Vgm4501ZdhQNHVjHw3N13WO2ZuFn601t5fhH646CEkqYXQHAWXmMlMgzWVo2ikEBtEmU3B4oh5coTzBN01a5Cijw4uoy9le2FFcXokV7IyvZY2hTfLC+usCfLgOqd9A== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BYAPR10MB3240.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(346002)(136003)(396003)(39860400002)(376002)(366004)(52116002)(7696005)(66556008)(2906002)(26005)(478600001)(83380400001)(316002)(107886003)(6486002)(8676002)(86362001)(956004)(2616005)(66476007)(38350700002)(38100700002)(4326008)(54906003)(6916009)(66946007)(8936002)(36756003)(5660300002)(6666004)(186003)(7416002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Bt7fJk39VGISHsLOGpMLHuF/uLEXTNcnM/PIxyN9vnL/5M6tvF29MAH3TEa4?= =?us-ascii?Q?WTa+7Rx1XTDQfbNusXxa35geomTwzdcEflYQSG1+dw+kxXC/DBn4iOcDANe0?= =?us-ascii?Q?koIMOGOr8ZjJINtViHWiQdLA/95Iwx5m84fH5/zaWpW/CpkorR55FHbZ4U83?= =?us-ascii?Q?T9plxqn7o9224O0+XPYWiKIRvn0YucYJG0VytBqJXZw6pmHkysOGyq9G3rIm?= =?us-ascii?Q?SvKmFl+BJUJVldFQ8xvjy3I6vfBXDlThRVUdZtbnDGkNolS8+U+ic0mQhPlF?= =?us-ascii?Q?7fbcJtuWLqMw85Ow2EyL9gHdNZXbnVHWRzP9z9EFq53fQMEc7W7PyuiH/18Q?= =?us-ascii?Q?AIEkB8yWdtDI/CPBWcGWR3HH024YPjkB0StgZp2LWaGGb1VMB9pLLc2IPonT?= =?us-ascii?Q?WJaw1VsOaJS6RP6vVOh2+HxpOo75PC2SEZTwpFMjb1nop0MZvvSIblHUfITC?= =?us-ascii?Q?BP94jVb/WzR/H25t1Eed2rkkXPSTwhfzFslonjPY1zshJSMA3XaHdu3jFhEl?= =?us-ascii?Q?YUi4/4CXJSLVvcDDv285Z5XjxUqdDrZBU5QxQTjk6G/zzZ8sZbNlbrJBqCz/?= =?us-ascii?Q?ojmRYsYoFvRTRwLp3avxG9tO0jrmk9UsMUTrR/i3uGVhI+l4LWnS0Y0hGSsb?= =?us-ascii?Q?4YNeWPw58GMy4CgaoJD0M7JKfNPq8eoi1r5DAtvRJmpgM3u7SqJigijX+jk+?= =?us-ascii?Q?4t9Ck/GhEypRZkb0j1Zr7oKHOp7pKr0Wbuor5l2AJF1oDcO1kIABNZCd13Fs?= =?us-ascii?Q?h+OEXeS76f0xLPlxcwDM3I50DcWc/9bxuGLAj6UTS9ZSMahQZrFfUkkBONU+?= =?us-ascii?Q?C29LBh7h/ik1P41YOBaj1tTX/eo5wCTrdvM2vsGpJ0eOA8+3DgjA29jcEb9s?= =?us-ascii?Q?Xb5IAXBX02MZY5rDWrg4uB309RzdU2VlraLadRuvreni8lRRiVzAiKgzA1nP?= =?us-ascii?Q?Lb9TvxygTdjV/Koe6UWMoxzpu83e+PeEj34tIq+bfIU7ohC4FTRe2XVe8Hju?= =?us-ascii?Q?u5iMS3ysgOdnPAiesoB/qVk5o/W/iKOZWZHfDt/hUKwijrqtdQvgvmgLon1C?= =?us-ascii?Q?d7dhIfdIXj79duikh358cHxmbM6adzb4TBFClPwlRKtoeEQcEZKZPmE1Dvv4?= =?us-ascii?Q?fkLuIKk0+ht/Hx5caCXvPc8DOq+3jNDQkcFPF504vhduhNY0R3oFSB8S2+Cw?= =?us-ascii?Q?BlGCsBOL+Ymbkm2T2u7ITFgbhdz23fEsNkM2Z1z9nI+od8+6nS/kjQhhqeSx?= =?us-ascii?Q?ue18IQrlcgJvKN9bmYhweSe+UP81MSIwWdIca6hy8scyHbG51Adk04hppIPu?= =?us-ascii?Q?yUE1XJ3vyMYHvhA4OPm8eOq0?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7224cd97-6bb7-4a01-7b33-08d9416c7949 X-MS-Exchange-CrossTenant-AuthSource: BYAPR10MB3240.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jul 2021 17:27:19.9456 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wkzVNMnO9Ddw7fEyEE9I4/7aeiyOslORQq4JqEVISQM19+ijB2PHsKBE9drP9JYodiLB9SiZOEGN8Ky09TtuosV7Vn8wzoe/l2ulT2MMMvA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR10MB4180 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=10037 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 spamscore=0 phishscore=0 adultscore=0 suspectscore=0 mlxscore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107070100 X-Proofpoint-ORIG-GUID: VFcXaFaLtgEpxdzFGlBPPXfmTBMAO1eF X-Proofpoint-GUID: VFcXaFaLtgEpxdzFGlBPPXfmTBMAO1eF 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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, MSGID_FROM_MTA_HEADER=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Daniel P. Berrange" , "Michael S. Tsirkin" , Jason Zeng , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Juan Quintela , "Dr. David Alan Gilbert" , Eric Blake , Markus Armbruster , Alex Williamson , Steve Sistare , Stefan Hajnoczi , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @oracle.onmicrosoft.com) X-ZM-MESSAGEID: 1625679615258100001 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add QEMU_CHAR_FEATURE_CPR for devices that support cpr. Add the chardev close_on_cpr option for devices that can be closed on cpr and reopened after exec. cpr is allowed only if either QEMU_CHAR_FEATURE_CPR or close_on_cpr is set for all chardevs in the configuration. Signed-off-by: Steve Sistare --- chardev/char.c | 41 ++++++++++++++++++++++++++++++++++++++--- include/chardev/char.h | 5 +++++ migration/cpr.c | 3 +++ qapi/char.json | 5 ++++- qemu-options.hx | 26 ++++++++++++++++++++++---- 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index d959eec..f10fb94 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -36,6 +36,7 @@ #include "qemu/help_option.h" #include "qemu/module.h" #include "qemu/option.h" +#include "qemu/env.h" #include "qemu/id.h" #include "qemu/coroutine.h" #include "qemu/yank.h" @@ -239,6 +240,9 @@ static void qemu_char_open(Chardev *chr, ChardevBackend= *backend, ChardevClass *cc =3D CHARDEV_GET_CLASS(chr); /* Any ChardevCommon member would work */ ChardevCommon *common =3D backend ? backend->u.null.data : NULL; + char fdname[40]; + + chr->close_on_cpr =3D (common && common->close_on_cpr); =20 if (common && common->has_logfile) { int flags =3D O_WRONLY | O_CREAT; @@ -248,7 +252,14 @@ static void qemu_char_open(Chardev *chr, ChardevBacken= d *backend, } else { flags |=3D O_TRUNC; } - chr->logfd =3D qemu_open_old(common->logfile, flags, 0666); + snprintf(fdname, sizeof(fdname), "%s_log", chr->label); + chr->logfd =3D getenv_fd(fdname); + if (chr->logfd < 0) { + chr->logfd =3D qemu_open_old(common->logfile, flags, 0666); + if (!chr->close_on_cpr) { + setenv_fd(fdname, chr->logfd); + } + } if (chr->logfd < 0) { error_setg_errno(errp, errno, "Unable to open logfile %s", @@ -300,11 +311,12 @@ 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) { close(chr->logfd); + unsetenv_fdv("%s_log", chr->label); } + g_free(chr->filename); + g_free(chr->label); qemu_mutex_destroy(&chr->chr_write_lock); } =20 @@ -504,6 +516,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->close_on_cpr =3D qemu_opt_get_bool(opts, "close-on-cpr", fals= e); } =20 static const ChardevClass *char_get_class(const char *driver, Error **errp) @@ -945,6 +959,9 @@ QemuOptsList qemu_chardev_opts =3D { },{ .name =3D "abstract", .type =3D QEMU_OPT_BOOL, + },{ + .name =3D "close-on-cpr", + .type =3D QEMU_OPT_BOOL, #endif }, { /* end of list */ } @@ -1212,6 +1229,24 @@ GSource *qemu_chr_timeout_add_ms(Chardev *chr, guint= ms, return source; } =20 +static int chr_cpr_capable(Object *obj, void *opaque) +{ + Chardev *chr =3D (Chardev *)obj; + Error **errp =3D opaque; + + if (qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_CPR) || chr->close_on_= cpr) { + return 0; + } + error_setg(errp, "error: chardev %s -> %s is not capable of cpr", + chr->label, chr->filename); + return 1; +} + +bool qemu_chr_cpr_capable(Error **errp) +{ + return !object_child_foreach(get_chardevs_root(), chr_cpr_capable, err= p); +} + void qemu_chr_cleanup(void) { object_unparent(get_chardevs_root()); diff --git a/include/chardev/char.h b/include/chardev/char.h index 7c0444f..e488ad1 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,7 @@ struct Chardev { int be_open; /* used to coordinate the chardev-change special-case: */ bool handover_yank_instance; + bool close_on_cpr; GSource *gsource; GMainContext *gcontext; DECLARE_BITMAP(features, QEMU_CHAR_FEATURE_LAST); @@ -291,4 +294,6 @@ void resume_mux_open(void); /* console.c */ void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **er= rp); =20 +bool qemu_chr_cpr_capable(Error **errp); + #endif diff --git a/migration/cpr.c b/migration/cpr.c index 6333988..feff97f 100644 --- a/migration/cpr.c +++ b/migration/cpr.c @@ -138,6 +138,9 @@ void cprexec(strList *args, Error **errp) error_setg(errp, "cprexec requires cprsave with restart mode"); return; } + if (!qemu_chr_cpr_capable(errp)) { + return; + } if (vfio_cprsave(errp)) { return; } diff --git a/qapi/char.json b/qapi/char.json index adf2685..5efaf59 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -204,12 +204,15 @@ # @logfile: The name of a logfile to save output # @logappend: true to append instead of truncate # (default to false to truncate) +# @close-on-cpr: if true, close device's fd on cprsave. defaults to false. +# since 6.1. # # Since: 2.6 ## { 'struct': 'ChardevCommon', 'data': { '*logfile': 'str', - '*logappend': 'bool' } } + '*logappend': 'bool', + '*close-on-cpr': 'bool' } } =20 ## # @ChardevFile: diff --git a/qemu-options.hx b/qemu-options.hx index fa53734..d5ff45f 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3134,43 +3134,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][,close-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][,reconnect=3Dseconds]\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][,close-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][,close-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][,close-on-cpr=3Don|of= f]\n" "-chardev msmouse,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend= =3Don|off]\n" + " [,close-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" + " [,close-on-cpr=3Don|off]\n" "-chardev ringbuf,id=3Did[,size=3Dsize][,logfile=3DPATH][,logappend=3D= on|off]\n" + " [,close-on-cpr=3Don|off]\n" "-chardev file,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,lo= gappend=3Don|off]\n" + " [,close-on-cpr=3Don|off]\n" "-chardev pipe,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,lo= gappend=3Don|off]\n" + " [,close-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" + " [,close-on-cpr=3Don|off]\n" "-chardev stdio,id=3Did[,mux=3Don|off][,signal=3Don|off][,logfile=3DPA= TH][,logappend=3Don|off]\n" + " [,close-on-cpr=3Don|off]\n" #endif #ifdef CONFIG_BRLAPI "-chardev braille,id=3Did[,mux=3Don|off][,logfile=3DPATH][,logappend= =3Don|off]\n" + " [,close-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" + " [,close-on-cpr=3Don|off]\n" "-chardev tty,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][,log= append=3Don|off]\n" + " [,close-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" + " [,close-on-cpr=3Don|off]\n" "-chardev parport,id=3Did,path=3Dpath[,mux=3Don|off][,logfile=3DPATH][= ,logappend=3Don|off]\n" + " [,close-on-cpr=3Don|off]\n" #endif #if defined(CONFIG_SPICE) "-chardev spicevmc,id=3Did,name=3Dname[,debug=3Ddebug][,logfile=3DPATH= ][,logappend=3Don|off]\n" + " [,close-on-cpr=3Don|off]\n" "-chardev spiceport,id=3Did,name=3Dname[,debug=3Ddebug][,logfile=3DPAT= H][,logappend=3Don|off]\n" + " [,close-on-cpr=3Don|off]\n" #endif , QEMU_ARCH_ALL ) @@ -3245,6 +3259,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 ``close-on-cpr`` option. If on, the + devices's descriptor is closed during cprsave, and reopened after exec. + This is useful for devices that do not support cpr. + The available backends are: =20 ``-chardev null,id=3Did`` --=20 1.8.3.1