From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazon11021129.outbound.protection.outlook.com [40.107.130.129]) by lore.virtuozzo.com (Postfix) with ESMTPS id B8DF48122B for ; Tue, 3 Nov 2026 13:58:32 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W2b/ac2rNenXbaBZcbnsh/FlYHzTdCyXfLrqLLDcv8SW05mkU3eWn2pHLGrX6fke435eEtrMWov9VJAXUjBtwtPweJe2nBAXEAuGUfvuOwTGPV0jzjpZkOxruCe9+G+ktcykAiejZkrABd0DXpq5wtcq2gLnnBwbMmLYw0n63ikrOa8li9taAKLZ1/06v8B9nhckh1lE0IZo9RisyPxtXbKjNkdHUksj5EHuE7XWStuBuJ/qXKzU7Zo0vCCLuYdX9FV0w3n25g9oIqcrGeVXJUp3I/mIWmosxwwM6MC8hjJQLk3ydNlfJt1jAongSr4sLD+meaTD9rtUlLZSEuetWA== 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=TNprL6sZyXfoWDKQdDQWrFrYdq9k8d5wsZgYbbqinbA=; b=eP9y5UeOhj3iyuCu1iK2/5zOW97NJfSRZTbNJD1yrt0cVyEGU3n3kEUAFY6hj8Z2QHUMHdTWyocUCbj+skMC0kX0XC6I3Np5VPwzIm4heJh+yR0guSS3UpVZwAvOjNSZ+RDy/bLGtClp/S5U2Vmi3Vg8+FOvF7jVtmPn9kWhZljT2T7g1tq/S5zyZ97Ay/1GJe+dJ2AMA6ZQG+1UTT9hyQSC4aYkZZMMLUhERCSq63/gFyXA7AhXG7DWgG1n1MrSr3lBJGRChMuCDry8oOuK3C/mdFVT8o6I4pOZzR+FFYqRihDRKtpJlicYOD5lLFqaxA28FkCEOPesKP+N5ui9hw== 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=TNprL6sZyXfoWDKQdDQWrFrYdq9k8d5wsZgYbbqinbA=; b=h1NJ04Sr1vy5pboGQ3If3+8O6SFbuxv9aveoRkj1XZZ7rd9k+dgydPhbM5ACu7TWJDFtEnECQPq3Ih/bxGL6jDMhxgov33r4geQxXqxMf0HH8AsfY5npceeedPlf2v4Uo+mLChHv/iKDMMfajaJo21YgLijFYa07JY8CZyKNO5Iy2eIHYIQTOazfCB+QmajnuX3A4X5o4Tq9qHZZ6xDhDw+q7eXY3hTp6MtvS/oHR7qc/31pLth44dHDHiNdQsPKv4s07ub+rwhy0QCMbRf1iCVelR+D3N1zq3yATpQpwscHVyq05A5qYKYDTFWzA/vcK9aU3i8nu+QCGZwUvh4XSA== 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 AM8PR08MB6338.eurprd08.prod.outlook.com (2603:10a6:20b:369::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Tue, 3 Nov 2026 13:58:30 +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.011; Tue, 3 Nov 2026 13:58:30 +0000 From: Andrey Drobyshev Date: Tue, 03 Nov 2026 15:57:47 +0200 Subject: [PATCH QEMU HCI-8.1 v7 32/35] 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: <20261103-vfio_v1-v7-32-4467fdccbbe6@virtuozzo.com> References: <20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com> In-Reply-To: <20261103-vfio_v1-v7-0-4467fdccbbe6@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI4PEPF00000153.AUTP296.PROD.OUTLOOK.COM (2603:10a6:808:1::86f) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AM8PR08MB6338:EE_ X-MS-Office365-Filtering-Correlation-Id: e8db5c41-f8b4-4c48-87d0-08df39b26ac0 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-Transport-Rules-Loop: 1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|23010399003|366016|1800799024|5113699003|10067099003|22082099003|18002099003|56012099006|261022105027099003|5023799004|261021121427099003|261026140227099003|261021123027099003|261102123227099003|261028144727099003|261026121527099003|261009223027099003|38350700014; X-Microsoft-Antispam-Message-Info: dUBb+eKzHFfycquNV99BAaWZowMdlk0igPNt4sSjOWb1EaOdqSb1IrRtcK/Hx5wGCL71RKyONVJzX9CxlST1HeDSPz/VoyMZFpt1ACoT5aIdKI1e7QN/9swpVGgenkC1Rut4mGDSJAsNsqpElyYTRWncxAz1xx27vC7j9gF/oX5E/coZLP+gaf7PBLInCgrm/T3bIBKNtS8I7uM5eQBZ+ciJkP/ZzlW2i+DMRhNIIxeUMtg5oBihcKeipJtp29xac/qBEYMW5Jw2uMLg221echCiPK9ue6odtAjPuQOkI5Tj5pm/E41msIoi75lJInw25xLxq5sGwSo0m2wDtc7TypEJbhEGCyxGxPQswsr24CbgNrVjbCeKe0ovoVRE98L6csHT7S4jasnaXo1i5ZwzphU0lMKG6O0BP01UqbUPRT+euUlMk7HNrdCBofU7xhU841xRTHxAKlhV7oySg8/d1z6Ucm03GEVrwRA9sKuxyNF/Zk1d9obJsvCmjzqpPkbF1Evz+ZNuVMavlt+wfdwHwlL7SQcRPGu6Tf4+kaSiEVGh9141kV84Dl3XnOQMSXxRW+GATP2HKkHxldvkWs/47aHpa+3u0zf52Qmune6eMJ3Lp9Kz0NL2lUwfamrjZ4HNXr7hKbZFCimvUZ4FrwgpyrQw2MinPnXjJlAiwUVu6/WF6XnWZyRHOyK0vwVwdVM/jorJsg6iDhwXyhNHTudLqq8BsN+RDGcZnbkcAQ7dZ9I= 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)(52116014)(376014)(23010399003)(366016)(1800799024)(5113699003)(10067099003)(22082099003)(18002099003)(56012099006)(261022105027099003)(5023799004)(261021121427099003)(261026140227099003)(261021123027099003)(261102123227099003)(261028144727099003)(261026121527099003)(261009223027099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?YzkwV0dKb1p3NDdlVlhoRzc2cWJrZ0tFNWpxNUM5VXdOUDFFblFGNjhQQjRJ?= =?utf-8?B?R1VIeUIzSE9PeCsrczBuVStGWjNmdFZxRzFMeXFwN0hPYUtZZG5rY2I3UEs0?= =?utf-8?B?K3o2RDVRMEpMM0lvT3k5eFJMZVArMkJ5bjJDT3ZMWld3N1BPQ1Z6ZVBROG1V?= =?utf-8?B?WStQWS9oTVlMSG9MS0NrZ3h4VVlOSy9JUEh2aGZaWm1LR2dvTDBiOCtKL3VT?= =?utf-8?B?VWZncDlxNnhoMExvOTVaR1g2Lzhvd2FmaW5aSjlTdHQvZW5HWmR1cDRYTUQ1?= =?utf-8?B?emhxamZrYWpxcG9hWXMvdmFHVEtHSko1QmswaW0wOFk1WGxoMUZ6LzdDait6?= =?utf-8?B?U2pvb1F4U2Zkd25LN2JXY3RIQkRrbjE2d2NlOTFURzR3bW1PMzRCWG54dmJ6?= =?utf-8?B?ZXZ1V0pVaVc2c3BRVE10dFo4M0s4YjJOMExyS0t1cytqRDlkUkN2Snc5d0FI?= =?utf-8?B?R3pCSG5kTG1lYXZFaWoyQzlCbGpqTmFVcFNSaDc5dFdCK09NTEhka0F6NUVm?= =?utf-8?B?NnVyMUpSb01JcXM0a2ZxMm5hVWljRkZtQ3J4L1B6b3hnQ2R5dHZPd0MvVmhL?= =?utf-8?B?c2J2TmFwcm1IZHA3MEltZ2lqVFFOTThhVzNaVDQzL3hoMzZiMnM5TkU4K1J0?= =?utf-8?B?S0Rsc1JONFRpQ0RZdVI0MG9OYTBGL2F0aVFLbThCeVpta1RKRHEzQ1I3VDJk?= =?utf-8?B?V08zRUoyY0doTHY4YUlHY2ZpT0czR2dVVEZlbnY3ZVM4c0dSRVV2c0NSa0J2?= =?utf-8?B?WkpKWitiYVNYT1dZWGFHU2Iva05xV3hTZTQrejJINDdTTkhBc0dnWTNvODVF?= =?utf-8?B?TEdsUmlQQmZBSHR3QWU5aGpEcFFNQ0pLMW8wUWlPb0dBbHRnVllOYUlVL0c3?= =?utf-8?B?c3JtNFNZMjJ0Tml0L1NGMTN0V1BSNXJHRS9YaE9WRlBqUHlxVkgwdFdMQ2JR?= =?utf-8?B?Q0ZKSk15WHgyMU9QSmFDZnRPV1g3aDFDNStmT1gzOTRSVHlMN3ltVE1KSENQ?= =?utf-8?B?R09JYmV2SlR0ejJjSVVjOGcrTGt6RStVcSthUTFaSnVDcll1Y0ZTS1NOZ1Y3?= =?utf-8?B?RmQwYkI0czhURXZDWVZ6M1pBNkJsWnVWa2ltdTFZcmtSdUJsSGNwVGdYRXNM?= =?utf-8?B?cDJnUXh0cHNLZ01vVVBwSVpjU1JYOWZlVXZYeTJIRTFuRHJQUjRadjNFTkRC?= =?utf-8?B?Q1M1UE1Mb3RkWitBQWdvY1drbUt2dElubkU5RFNLK09teWJHNzR3NlhwaWFq?= =?utf-8?B?OGMvbnZjeC9iUzhER1dUYXlVdXpIYUFqTit4dThJd090WEpwZnh5TmlFdzdr?= =?utf-8?B?dXV0QWxXQmhhZFN5T0pHQXU2N2NuK0N3cTdBOWJBenhlLzhyYlZIVmVzRFMx?= =?utf-8?B?MmdLY2FUWlp1RzFncUJQRGd3Ritmb2FRWUt0WEZMN3FyZjFJZUpxSWdoYk9x?= =?utf-8?B?WVBqd1ZLYVBvUkhwaXpidUkwdVd5WXZBUTBpaXNvbGY0VjF2a2RUSmpobHR6?= =?utf-8?B?d3ptMWpiOTJRU0JWdEpFZ1ZrQ3BDZjI5c0krZTZCcW1TclNtLytxR2pqVEhx?= =?utf-8?B?MzlLSzBZY2dMYTBWUitXUVdicithbnF5MFFwbDF1K3lQRDVWMXBMSGJPRkR5?= =?utf-8?B?d1pWbW5JamNBSllSTWhzZ3JLWk1kbExVd2tqcDgxOEpvb05VQjR6emVNekxE?= =?utf-8?B?VG9FeEMrTWVmM3BGU2tVUU41MGpaekRIR2JIKy9GRkJtV3Z4ZktySzhVNFNO?= =?utf-8?B?MkxMeEtjTnVIMXNXamd2MUtEQ2VDSjhmNk14NFArRi9CS0JXcmNNWFMwUTBV?= =?utf-8?B?US9sVmpnSEpteUhFdE1DeVZmanRENEUyeG1ZdXRPS0JDS0hYQWNUTTgzckQ4?= =?utf-8?B?YzgzQlVpdkIwaXRTcERYbFcvL1BDNHE4UjE3clY1Mnl5enhNdUExZTYrZDBz?= =?utf-8?B?VTRwcUpvbys4d3RXVVk1UGRSSElmdVlYdllIdUdDYU9HaXZnQm84Zk9rS3A2?= =?utf-8?B?UW4vT1JIdlJnci9QZXBTdnZMK0p5dG9FNmNyKytFUDJJVDMwWWxzclVtYUdh?= =?utf-8?B?RjZIVWtoM2JmMkJ6bG16K1hHUFhlM3JFdWYzSjJjMDVRVDh5eUpWbEMxZFl0?= =?utf-8?B?MUdQYS9tYVRaL3JvaitNZWdPc0laVUt6NnZHc1lhbmdCdUxSdUk2TDVONkhj?= =?utf-8?B?SkxCYUhSdWFjUnZHVlZTZjRVUWFTcENlelovQTdZTGVNdGJCN3oxLzJhNjJ4?= =?utf-8?B?Wm1qVW1HZ0dVQkpWdDNBWEtlQ0dGSlJLeE9lemZORld1Z0tseWdodkpJTWxY?= =?utf-8?B?WjdkNXdIUkhQRE5HZVUvWXQyR0ZoTVB4ZW9NTFVUUDgwZkpFZndGYWxQT01Y?= =?utf-8?Q?wHE3y61OIzIWVi8M=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: e8db5c41-f8b4-4c48-87d0-08df39b26ac0 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2026 13:57:36.8843 (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: RFllxTL3pzJ2cq9zajj4E9MPkgU/o8kxAB35PMLNa1zUgdNMgx17U2E5NMi7Cg4sXBe4k6hQ7YdVxPfRsGDR2B9G0zoDsXQ4rbL0y0RAq/A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB6338 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 d853945b81f..c0bdda931f9 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -236,7 +236,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); @@ -246,6 +249,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