From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11023095.outbound.protection.outlook.com [40.107.162.95]) by lore.virtuozzo.com (Postfix) with ESMTPS id 7AC9F81050 for ; Fri, 30 Oct 2026 14:46:27 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mN9CJx9+IiWtxmg7oeZMagZdt5o4PxB57JiQDM+DtCrffpFvIXSlEkonLNCSIni9VoJtIiAr1qSfSwOKGGgou5TZTNZ9Im3dNstXpqk0l9u60BV6B6Nq5lKbrH/kwvaImb/fukWRwMHmyjaL+qSJTTesNxnrRTnoajqZF4OhbWdMdrTbH6BPIgxECSY988isThAYEZ+G3PXPkKAbTd0MaZiDHFUi+Hd87r3pzUGWO4Nu/7N0w/Fz/wIvuZvnj+xgXFF5eonjYUndt4xaAT9u9Glcr4qRYoH93avuIR9+exiT9k66KjQdqpiKbAr6RZRFa/DiFjg//8hxehiQ90J3uA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Q5OBkqDmoMT5hOFJsl+5qQusN1G8oqggsnrBlSYDb4U=; b=QCHY/MEqm67nlA/gaoe/diOOqWoMahlzc2tnuYZT/SrVlPMdPGXJQos4VPIP0IiVv3k2GWIxBnWkZkFiClHSXP7esJetjzSudGznjYH90ReYS1nm6eAyRQzNMAxy6g+B6zHOnvRCBlLWonCSyIme+iLsUheI5LsfHcrORu2XUW1byKpjXsR6b0s4PoZpuliwoGM90CUs0su5h+0BjVBs727PY9Ze/g945Vws+9AuZK5XdQ3lqc0Bx6khYtATJKRIeepOvI5jUiFYMVzMzuXWvcwyX26Ghhj2+YCrPQPqiZBxEHD6IzmHzm45TaRue0Oq8drQTXUQrhmbKdTG8wwteg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Q5OBkqDmoMT5hOFJsl+5qQusN1G8oqggsnrBlSYDb4U=; b=xY7+wVbJEjNBCmoFj7UCBYqOMM9024eyettCKdBVLx2viIBfqtVWsXkR/koWZrv8szVI1ey+V9l4qKKRymHZC7aCfWy/lMBIiH5nqOoxdCGc+9ZhNFW1nRCoPIn4iYVK5+uLysLd0WCaJtpY0+FQigW5tm+3TD+FnmOL7pFbrstTEI5OzEJmGPyoWi0owLZ99Uqh2aEflZtJhBO0wkPmpkMwpVE7bYmzUengirTB0+bPwulChslmE3RJm7+Ac1gWIH8qhe37RLV1vMkqUd0C4Rnr/dHhh0q9UvDkma35qZ8uajSk7YmuySA29VVG4ovNzZIIjAt9xGNqlv5tgp+qAQ== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) by GV2PR08MB9373.eurprd08.prod.outlook.com (2603:10a6:150:da::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.12; Fri, 30 Oct 2026 14:46:26 +0000 Received: from VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8]) by VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8%7]) with mapi id 15.21.0569.008; Fri, 30 Oct 2026 14:46:26 +0000 From: Andrey Drobyshev Date: Fri, 30 Oct 2026 16:46:02 +0200 Subject: [PATCH QEMU HCI-8.1 v6 31/34] VZ: migration/cpr-exec: don't exec if a vhost-net device can't be released Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261030-vfio_v1-v6-31-45de246bc92e@virtuozzo.com> References: <20261030-vfio_v1-v6-0-45de246bc92e@virtuozzo.com> In-Reply-To: <20261030-vfio_v1-v6-0-45de246bc92e@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR0502CA0031.eurprd05.prod.outlook.com (2603:10a6:803:1::44) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|GV2PR08MB9373:EE_ X-MS-Office365-Filtering-Correlation-Id: 695455b1-3767-4205-46a6-08df36947f29 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|366016|52116014|376014|261026121527099003|261021123027099003|261009223027099003|261022105027099003|38350700014|56012099006|5023799004|22082099003|10067099003|261021121427099003|18002099003|5113699003|261028144727099003|261026140227099003; X-Microsoft-Antispam-Message-Info: 5S4qS+Jszz5vnwltWGRrRDAXWeN9g5jo0MQlYDsC9yh1RpeUNCNvhG0YNEUo3I/fU2dJ20rucHBTd+L325pnEivqm37z2YbqseMoQVHk+Je5V7S5I+HwUCRjGB/9YWmQf5t7uvyPt4FegveXFKhMeHsskcQGtsBFzmO2cs6SRpXV573UjHm/EzeaTUiFuB9ZMlx2oX8FHsyXPMQLvv08/Tcv3rSPwVttCjWcWrEa8dv7tYMydISn7pRfWKHLX04s6V4iZ45gwl+pmcApzDEm0HyaldT2IUtESnn5/HnmoUxT5al41qbZBSvO5aHtJco6fBSIIHLHcgUi7UbGhqNqY53Xce1OcGV5lPU8lEdDeTZnEjTwMpLSIOUQrVOCuFjFYUNPcjRWOy0crPICTZMMOkPoOC8Zu1mszsrlxxxql9xtKv++NUPU2FEs1j73aisRdWf8r4EPRNHvSWWCyB5jKNkZClS/KiOap74vJ8JYo5aLrF5gZWqtpBmea6PbT+1IaOqcTL4UzwbtsXrVHHAg6TGoHkzJXfuyVTcBwFWqFu4BHFagAnEDkQQdITwgHNhkJgAsWy0g2069hj+pYy9AFfJGfy0uRANELlpdhA4ZKBHTInRwmPvt+jSOlQU2Rvh1Ab0GqwEbpKAMnd3ehTDH5UALqv4s6TQ9M2GzlvA9Qz62EoapxhYG8z6qIPIZoKESWuybN7b7BYPrL3Ydi7hAG9NnlSsj7OuRkaKwcEkW9fs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI0PR08MB10656.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(366016)(52116014)(376014)(261026121527099003)(261021123027099003)(261009223027099003)(261022105027099003)(38350700014)(56012099006)(5023799004)(22082099003)(10067099003)(261021121427099003)(18002099003)(5113699003)(261028144727099003)(261026140227099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WVBZOTNFY3JLOXltdGdSSDQySnc2UmlvUmg0QWpiRHp5SmFRZHQ0VmxOcHNP?= =?utf-8?B?ZXJnYjBTMGRCR3pLd0dOSGZ6d0ozZG0yUVJMQjhpeVNpN3lnTjVxNXBrQ0xQ?= =?utf-8?B?UVNDNWhJMVpZbDlOZ3NyY3JVWmJXdyszTTM0WE40d2w1Z2hQWTc5VFI0citj?= =?utf-8?B?Y1p0T3dTbG5UQW9kQ242Nlg0MmcxaHdjMmFGc3pUN2ZHbGpnNnBFUTNuSlY2?= =?utf-8?B?Z2pCZUZlaGI5T2pYNHpoa2FFeVc4R2ZkQ1duZWZlTlNKQWsyK0J1L3NyNkN6?= =?utf-8?B?TW0yKzQzU1Nyd3F2YmZCYnp2bDNLUFFHQmVXZktrY05Ialh1NmsxNUMwRFZY?= =?utf-8?B?UkhuVURmVUlJeU9URElTS25nNmpIMm5KZTJDSlVjajdUdUFaUkprckNrdTBo?= =?utf-8?B?c1JvUDJqdzZSMTNjRVRvT2c4UjhxV0VGNkc4aWRYVi9WUU9VOE43dFRjUENr?= =?utf-8?B?RkE1NURyVW5pMWVNWndreUJ4a3hldDNYTGRNY3UwUnJWakZJMGc1WFFQQzJ1?= =?utf-8?B?WVE0cVZCc1NsY3BySy92Y3NQeklGYXFLU09yUERZU0ZUODhtamxaem1iUG5V?= =?utf-8?B?MEFiWC9TY3E1UWY4cUVuME9PeWRpWWRWSUg1a0pobDhENjlDeTdsL2JINjJ4?= =?utf-8?B?V0J6WGNyWG12emZOcnR1NnlwQ29qeFNNamszRHhlVGVSb01RcGN3aWkybWpS?= =?utf-8?B?eTdIc24wdnJnUC9KTGxTZEZ0ZlVocWZWUW5NM05FakxGZVIyWlJacW1Pbk5h?= =?utf-8?B?TWx5QUtFeDhwTTlmeE50WnY0dU4zMzR2RHZYOWNCZ1laQTR3UTZXR1VubGtz?= =?utf-8?B?M2NIdExRcFdWaGEvck5Ja1Rtcnd5Q0k0YmswMGxiSDBLeDJ6Q0FFUE5VZ2lm?= =?utf-8?B?UmlVWGhEOXhrTjJ0V1VnZDZUbENTR2Vqb0tLMWsrNHREV1ZsMG1WWWNIUWk2?= =?utf-8?B?RG56L00wdE5FRTBRYmV5d0kyYkRLY1R0SzFOeWJyYlRDRlY0ZklYY3ZJcS9M?= =?utf-8?B?dXRVa3pyYWNZb0huenhlWUVzbG5HOXd2Y25zK0VRa2hyT2gxcEZHMUw0bFZX?= =?utf-8?B?N2NKeit2Tzk4MktiY2t1Y0Z1QzFXZDZqSVpFVUNOenpBcjFDeURoSlRXdzBx?= =?utf-8?B?cEkrVGFoOXV6dUdPRzJVNU03cjNGQjBSTDZlV1I0Y1pablRFQXdYSE5jUFoz?= =?utf-8?B?VmE5c3VXVnlQLzlRekVTY3VTRFpOMzhRRzlOUXl0NmhBSm0xZXZrd21pUXRh?= =?utf-8?B?aENseXpjbk9VYnFWUzVZTjczU2JKQWtQMGZDRzg3ZnVJMndSTDM0cVBqcWUw?= =?utf-8?B?R2RGUVBPWTZNQkY4N3N5WE05OWlpZUNwOW5BUDUvRWZtaExSRktETTVqTWxS?= =?utf-8?B?aTJvclpFOFg0aXp0YTZxbGtlb1dYOEovWUJiNWhiN3pmZzRoOVhHWnVqdXBx?= =?utf-8?B?emw1TU9jOC84NkpabWhmNDdRS3ZPcGRoVWdoVmdJSXdoYmo4cmFUMVdYQ3pD?= =?utf-8?B?clFIbytiL21raHhaYkxyTTVwaVhvNHJGVml5aGNKbGtva1hWMXBFMWJpS2hN?= =?utf-8?B?c1NlOHBuaTJDTGR0NkZYc012ZGhZUFNJOGdKL1N4bHd1TU9LZlgyWnEvZXAw?= =?utf-8?B?WVIyUGl2ZzNVSVFWY1FMWWxvV0Z5aTBtWWd0V09EZWVzMU96WTFrRTJlaU95?= =?utf-8?B?VGZHUWFaYmJqQWpRc21YNlE0aHNSSk5VT0ZjVUNnWnAxUVNNdjEzUmZZQmtw?= =?utf-8?B?T25XdjZuTi9paWJDWS82cllzNWcrMUNrcVVPcjFZREZDL3lFL3h0azZjcllO?= =?utf-8?B?QTl4ZnZXdUI5R0l2TENYOGZKY20wcmhOMTdKRG1zb3JlbEZ1Ni8ydTdWVVhI?= =?utf-8?B?WTBJaGVjREVQYkhTMmpTVmdMSjA1N3hXWG85aFFKRHRZNU95RTFFSjBxNzhl?= =?utf-8?B?R0RJYWc0TGZJZFdUek1iU2xYWDRnY1lNN3NweUxvOTBWV2YyK3NYVlFkU2tX?= =?utf-8?B?OEltNjlLS3RVa0YyR0lEZ0VKZEFQWWIxVTF5UmJCaGVIZ1JtR2FrREpqTy9C?= =?utf-8?B?aUhaWmR1YmdJNTQvWTNYQnNaeFJnVDBOMWVndGNFdkgwNGJKc3RnTk1keURq?= =?utf-8?B?VzRhdlJlaGQybjkrelpuOFBqNHFaTzdzbklDd2ZtWVRKUXhFZ1oyc3c2SGZh?= =?utf-8?B?QjRZdkdIdm5EVWh5TGlNVlAyL3VHdVpxS0dodkJ3L2luM0NLdHNsRlFkbExH?= =?utf-8?B?MC9NWHhxUU91UW5UTWpvTGd3TVFDM3Jzc2YrUHg5OURkNTQyZGVMN1UwWjJV?= =?utf-8?B?UGlMUXNEdGtPd1BhVWs2SFRZOUJ5UkVxU0xJaitKSFN2MHhITUFaTlV2M1cw?= =?utf-8?Q?lXktUaWn0ICaMdIM=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 695455b1-3767-4205-46a6-08df36947f29 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2026 14:45:53.1601 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: sBCtf9qyMaOsVdk1V2a7YZD4odO3ZWqQd1fQEP4Cnh2jeX2In9WCXWU4hYecIs5+w4ieD2CMttL86/kbVrqWZj0eWZPIDU5UnNcU3Lq5JHc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB9373 vhost_net_cpr_reset_owners() only warns when VHOST_RESET_OWNER fails for a device, and the exec goes on. But the new QEMU can't take such a device: it is still owned by the old mm, so VHOST_SET_OWNER fails with EBUSY, and the guest is left without network after the update. Stop at the first device that can't be released and abort the cpr-exec instead. The VM goes on in the old QEMU, with the devices released so far taken back. vhost-vsock already does that in its pre_save. Fixes: 1278e4830052 ("VZ: migration/cpr-exec: vhost-net: send RESET_OWNER before cpr-exec") Signed-off-by: Andrey Drobyshev --- hw/net/vhost_net.c | 19 +++++++++++++------ include/net/vhost_net.h | 2 +- migration/cpr-exec.c | 7 ++++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index fae6b060c6f..9110dc43d23 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -579,8 +579,12 @@ void vhost_net_config_mask(VHostNetState *net, VirtIODevice *dev, bool mask) * EBUSY. Called right before execve(), when the VM is stopped and the * devices have already been stopped, so nothing is in flight. The device is * fully re-initialized from the migrated state by the new QEMU. + * + * Stops at the first device that can't be released, since the new QEMU + * couldn't take it. The caller then takes back the ones already released + * with vhost_net_cpr_set_owners(). */ -void vhost_net_cpr_reset_owners(void) +void vhost_net_cpr_reset_owners(Error **errp) { NetClientState *nc; @@ -591,12 +595,15 @@ void vhost_net_cpr_reset_owners(void) net->dev.vhost_ops->backend_type == VHOST_BACKEND_TYPE_KERNEL) { int r = vhost_dev_reset_owner(&net->dev); - if (r < 0 && r != -ENOSYS) { - warn_report("cpr: failed to reset vhost-net owner for %s: %s", - nc->name, strerror(-r)); - } else if (r == 0) { - net->cpr_owner_reset = true; + if (r == -ENOSYS) { + continue; + } + if (r < 0) { + error_setg_errno(errp, -r, "cpr: failed to reset vhost-net " + "owner for %s", nc->name); + return; } + net->cpr_owner_reset = true; } } } diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index cdfefa81500..679edefa1d3 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -89,6 +89,6 @@ int vhost_net_virtqueue_restart(VirtIODevice *vdev, NetClientState *nc, void vhost_net_save_acked_features(NetClientState *nc); -void vhost_net_cpr_reset_owners(void); +void vhost_net_cpr_reset_owners(Error **errp); void vhost_net_cpr_set_owners(void); #endif diff --git a/migration/cpr-exec.c b/migration/cpr-exec.c index e4ea160698c..b41dcc46494 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -230,7 +230,10 @@ static void cpr_exec_cb(void *opaque) * Hand the preserved vhost-net devices over to the new QEMU: they are * still owned by this mm, which is about to be replaced by execve(). */ - vhost_net_cpr_reset_owners(); + vhost_net_cpr_reset_owners(&err); + if (err) { + goto fail_with_err; + } trace_cpr_exec(); execvp(argv[0], argv); @@ -240,6 +243,8 @@ static void cpr_exec_cb(void *opaque) * or the system is very short on resources. */ error_setg_errno(&err, errno, "execvp %s failed", argv[0]); + +fail_with_err: error_report_err(error_copy(err)); migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); migrate_set_error(s, err); -- 2.47.1