From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11020074.outbound.protection.outlook.com [52.101.84.74]) by lore.virtuozzo.com (Postfix) with ESMTPS id C2B8F81098 for ; Mon, 2 Nov 2026 10:37:15 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=E8JV9FRT1d8Cju5GBSJ+spBwsehJu2hHZn1Nt0TgmRMDLMl6lthPlp89z29+kLaLI050XUX/LIEgDGjU2icIHfXKTfAVgsL9eO/2DozpsJWoihkQVG8hi3VIegxoPEP2VyWRvAngo86gmsaacDB70fNW/YtgMF6I9M3l43u8i9y2ZQ2z7DABdK2Hw2uw0Im1wlyINA3oSxrEPd/pmc/DThu3NyeHpJtntm/zIQjC/5V1R+rc5+VWDYQHMIxaX/R5+YfZKd6mkrBjAfAjcNPs4Tn5EirYWeBYV15P6tykPKCBoj8U7aQeSRfKt/ml1T9mdc/m4BetCROyJMlZlKsCRA== 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=oyDN4bNBZvOWDz44HEXoyn4knl+Kk8jMYdAM4rjo67GQZpdmI9PLCcyFPmxF/W6LFA/Rp2fJSiK7x3c7E9rfUbmhwH0oimphkuEzGCmyyliP2lc8GpvPIpOMs6KmyBLA7NpGk8BGoodp2MYqAq5DPXBNu7CkvRLe0o22mMFrMbPxj71623b/a14ZsAs8zUMeuevY5y09kv8kp+RPvzIPmQC0G5VE2kRQ9IVGikH2S7Rt6cz7DHMnUJ5tQ5VPgtaboJAnIyL6d8SzaGeZt8iPHn/LrZy1vh0KwAq7jZmXpGKJNw2WIiZxDouu4rOzfBZQd8Ctu9iHTswIt+tP+vOXog== 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=TiDk84JV0p5VZVx1m+WIJoq6psuKtcK1y0kC2LfGj59urHvLt40O0cO/ool4KN5j7JWESaKhZXLU0M3fNvSEdKMfhkyigLT1JiQj2tsvm2TH039xj+NvOgeYp1UhxNGmaHr9j8f8yucezDY/JJ6eK0PkkIEJcm3Hgj2p65aTmLdq+hJyUr84IYOLtZI1zv1IX7xLmDLYIB5bRrJpyTguyquAUHrwlGFpHeG4jdQe8lxJ4Sd8AYLTfeYj0G3gexyz+6HRTEvrz1WWVLQvfZB1P+lpvysbSBKnqkIqYIunVqrlY9R6DkYBbpxklQSZ+A/ZY26ogmQn9d1l7i6bniKvCw== 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 DB4PR08MB8199.eurprd08.prod.outlook.com (2603:10a6:10:381::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Mon, 2 Nov 2026 10:37:13 +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; Mon, 2 Nov 2026 10:37:13 +0000 From: Andrey Drobyshev Date: Mon, 02 Nov 2026 12:36:46 +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: <20261102-vfio_v1-v6-31-9bc7cabc850d@virtuozzo.com> References: <20261102-vfio_v1-v6-0-9bc7cabc850d@virtuozzo.com> In-Reply-To: <20261102-vfio_v1-v6-0-9bc7cabc850d@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIVP296CA0048.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:353::18) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DB4PR08MB8199:EE_ X-MS-Office365-Filtering-Correlation-Id: f7302447-f989-4388-b473-08df38cd2a30 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|1800799024|366016|23010399003|52116014|376014|38350700014|5023799004|56012099006|261009223027099003|261028144727099003|261021123027099003|261026121527099003|261021121427099003|261026140227099003|261022105027099003|10067099003|18002099003|22082099003|5113699003; X-Microsoft-Antispam-Message-Info: furO6h4fm3J4ca2Yeypdg++xxTqBV8V03f7AczVrAebdGxY2f1AlromKDqXhzZgFpeY7WICbggA0yp6c25FfRGnzbHzRSnAFJxr0EdJpbc9/gv+o5Y5/Pk+7ctXeLeDP/BtG+8igbJhNmmndT1RCBzuziidKR3uO46GpUubVSZEoBZuz+kJytfPpxWgZA5WpLIWHiEUkINSo0GPk9P81B0q7dFwAbiZMJn1EB48GBdvjQ0gAeahNNYtgMpVSs4uWaiAbmmn6CgkgFTwga4z5PYcjfQuQgRRBH6MYJY94i0vJG4LnQ8aqRMOfiIpg+vNFxNzEyJcAFOIVtK0BX8X+vI0GRpTE48yV44BFB5mMg8Gpj7q30HxKHtHF4Ij6vrQgVN2568v8/VhCJDPhY8blkCB4xSufyVFckNUr3WIsysy2Gj0kwIHQ89v+O8t2LSwlOImzQ7W/R4sNQQfIAcbSP5JOqPlQbfF+mcA9xo5+eYbxgDeLVus4ArlrE/N8pqW5eIAT6M7K3PNCn1cOAkMCCLAij2KYJM9SmMh/C7HJqhYEceChpYTACR2FHTQf1JAGP4UUqYjpMEPwNe05dKRF1+svS+gHKAAtH5Q+zDoZR3Ze3hef7CQRthVlrzu/6VfSbXnhUVf8p9Qt5p69YdiBoR28J81eeXo9rxtjK9GjpMnCJYfPW5tczN4TfBh1BQASg8fm8DfBwdt03qGOZ3O6nAC6Ytr0WzAiyDdKcoX13xc= 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)(1800799024)(366016)(23010399003)(52116014)(376014)(38350700014)(5023799004)(56012099006)(261009223027099003)(261028144727099003)(261021123027099003)(261026121527099003)(261021121427099003)(261026140227099003)(261022105027099003)(10067099003)(18002099003)(22082099003)(5113699003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?d2VrRmpWeGpqYVZmYnZjektSM09acTR3RVgycVYwbkN4aTRzbnM3K3dCSTc1?= =?utf-8?B?bGVqWmtvdDRWa2RoTFBobVByL29SWmpUd0J3M0cvVzlxQThQNWpkRFQ0Q1dO?= =?utf-8?B?YnZ1WGE1QW8zTDRhSk9FL3JIUGNHblJ5M29NQXFKMGJ2ZzVxY3BjVVFyaEx6?= =?utf-8?B?dnNRbXBsTUhuU1g1VXJhUUJnU3BLOHRWWGVyUkFFNHhyb09QOEMycDBMbjRQ?= =?utf-8?B?VkN5NUtpRjF6MnZncndkTGVWQ21Dc3pnVlMvYk1aNUdHZjM5N255MFk2TnZW?= =?utf-8?B?VkNVTU5ibXdBNXhxT1owL2xrY2ZDWmFZOVpseWdJWnJrYnBCUlpPUTllaFd6?= =?utf-8?B?V0FnUEVncjJEalpzU3lqQnBPNExJK0svRURSWkJucEtBQTZtRHM2RjFaSmt5?= =?utf-8?B?b3hjOVNKc2taay9PTUxISXZqMmRBR2VzWG5RSUxOOEN5TzhiNCtVZlpJc1Nk?= =?utf-8?B?OHc1dFhaTTdGbGRtN2lpQnJiOWpHMGxQci95bHYvcFZqcnR0VWpmbXZ0ZE9t?= =?utf-8?B?dnNRSGVTWEdEbXNKWmZ1ZFlxUHBpbG5mRVlzYU11eWlNbmRjNHllRjlMV2h2?= =?utf-8?B?WEhJNWJvL3o2UHdyTExsN3p6MVNFSHdsZzlkYkgzOHo2aksyNW1kb280eHI2?= =?utf-8?B?Yk43czlxei9ZTXFERDlKeS9tR0NScGgzRS9qQ3hPSXVPR2NFV0hCZFR5czNV?= =?utf-8?B?VkU3cEhBbkFCdURrY0FpTVZweXFRV1RZdWllZS9Sa3RZNEdFaVZ6S0VhWWFn?= =?utf-8?B?MnluUXhRTnQzbzJ2Sk1GWWNNNWRKQnFWTDBHRytGUWtPbjBudGFaQktIbjRZ?= =?utf-8?B?ZmEzMndteExaWmlzM2Y1OGNOamN4UUFXMEFVRUpQcWk0c2JoczFrVTRrRDNj?= =?utf-8?B?Q1FIK3FJUTRTRnN6WkpHOEErV1BRRUswK0VsSVdJdFdRNzFSTVFOY0lyZDJh?= =?utf-8?B?NFpwTWZ0eUdqVFdCR2JXeHZaLzB3S2U5MlVWV1FwNlNNWm01OXJXQW5MNlZQ?= =?utf-8?B?NzV5c2RsSktlNXl6dUZIRE5rbFpiZTdFNys5ZEVCV0VmSCt5R1o2UFBJR1NR?= =?utf-8?B?WWppL0xaTHFYWnpjMlFtSXd3NWRKamU4SHJKZ283R3dRZ0V0TXZxK01NeUJx?= =?utf-8?B?MGxpbVpXbk1kc01EbVRuVzJwWUxWbDdxZ3RLQVBqc1Y4TkFjSjlNS0F4bjBt?= =?utf-8?B?cWNRbWZLUGh2dTJrRkMwOXlLS2dyU0xFbVd4ak5XdEZIMitrTEViUWZ2M2pz?= =?utf-8?B?NVJoWWFDLzVsanZ3cE1zV21oVStXeDVEeTRKZnBwa2pKZVFzeXpSbWdSZDh4?= =?utf-8?B?TXRSNGJjeFduaTZkb1VwQUVhdTVPekN6ejVqN3EvamxwM2pZZW9YV25BTFgy?= =?utf-8?B?Qko3UjQzYUdPTkhWNDdVRE9XOHZwLzZ3ZnRYRXp4SXR0MDBsM1d4UjBQY0lp?= =?utf-8?B?OE4zbmpKQXJXREhFcDViT3dCWmxPRlhueGpJVndXVktMc2piUTlqRTRmdVdn?= =?utf-8?B?T3BTd0d5SmVuQkJNaXByb2pIQmt4cDZyMmRYNm9ld3hNeGJIUlFQczRlUHU1?= =?utf-8?B?cGJNNGkvUWx4bDhHQU5STVNmbnN0dVNMbGR0dzh1V2dzQ3FCSXg3TFRzV1c2?= =?utf-8?B?WVJBWVV3ekg4NXYzZkwyWmxVRXNVYWhNMjNGTXlDR05IKzk3RWQ4OTRkVVV6?= =?utf-8?B?QzFiOXVBTjd0UElzeEJvR1BwTGZud0Z5bXJ3WkVtZjkzeUhTenUzSXdtd0hr?= =?utf-8?B?V3BOTDN1RUxNZ20vQ1FmdHZrZ1JjK1J0eVBOTWFabVRjSWZtb1pSVlB1ZXVl?= =?utf-8?B?TUhtVjA3RG40UFM2aFF6c2NZTGU0MzB3bFZIWmJrK2V4U3hrc3JqbjJGUEE2?= =?utf-8?B?dzIxaFEzeDFhdDlxaXNRenJ2QWJ5bmY1cTJQN2puOHZUZUFwSFRyWW1jV1c2?= =?utf-8?B?SkdtTlBuczhvR2FqUSs4bGZ5VzhKb1UrdGlkS3ZCYTVoYnNBR0dKMExrV1hs?= =?utf-8?B?VVhwY3RyMkRweW81UHUrWS9RdjRFelNQNHhRQlZSUm0waVZ1VXlJQ3pzNEF1?= =?utf-8?B?UWRQckNkSG9udDRWUCt5KzB0RGdBUXlQZW9pM2NHRDc1U2NiaXg2eXZTZGJr?= =?utf-8?B?MEJVendrMGdhYmtvZm1HME91Mk0zVkNMaXZjUjVydGdqcFhqT1BKbzY5M2I3?= =?utf-8?B?Rk1MalcydCtqWHM2UmsyYnRDdmFQbkNPRGF6dlUvNzQrWDRFVjFYRDBoM2pB?= =?utf-8?B?ZVl1M20zQ3NOUUFEa3Yvb09xUENGd0k1WUppczlCM2U1ZzJabzE1S3lITExn?= =?utf-8?B?dWhOL1VHV1FlZTU0QitFWDNIbG1SWjBodDZSb0VYbkR6U2lhbkxadVdOWWNy?= =?utf-8?Q?7XNvEzO6yRcMCjAY=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f7302447-f989-4388-b473-08df38cd2a30 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Nov 2026 10:36:33.8311 (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: 476F3vIAVmWaKEL3qRGD0QBSZgFxZE78ikIxV6e72B8nQpecvTDUnEQQNkV1brfnCRhUB41pwf6w7q9FB7mq2iP+jBOFj4bVW1wXHFQZT24= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR08MB8199 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