From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021123.outbound.protection.outlook.com [52.101.70.123]) by lore.virtuozzo.com (Postfix) with ESMTPS id 3178B80E7E 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=O4leyDpeQpdgcYMy3m5b7ybBPM5dX+HKdy7JOWBSb2Pj0yHmxF/68lzKJ9MJyz8ODxGdOQc3S0rdCvMq3lReKq7gqCjcPOtK48efCfjfujdONgixxvWEhct7I6MdIYofQ/kA0sA7VHlsedqcsE9jLmjqqLJgfybwNIzBZxa7W1KOJjkSJZIPHV3j3Tz8Mftv9Hh57Uoyjy3QqYNJ5ksB8zJQJBSRamQlv55df+K03QG+EyvE1X3BMxo16KF+3MRFlAIQYZQjQ4g+WVQ3csSFTKyVWAQlUQYJDJrFEFEQKfrthu8xIaTo55hyfw5tm3rlB0y75Fj2aV7atySEgelfjw== 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=WB8Sx8E7dZkIJ2v2A3PMYYuzUIIAmg+kPPFk2pNgQ6c=; b=j8xafPsEm1IPhiMBz0YL0wNuWrfmjWvXyGu4dhCGxuLFALRhS1MxePpRM6Tzeqs0kpLkQMAjO75xeKkEgG0Tzlom0ykTxN0Ov6O2CxPbIVetxqt1ids8PjfnK3flLPtaUlWDQuvDHNGnRnWTRpI3Z/g8QkRt0fHtPb/7jiHXYNXi3GGUr6LsiIDw6fauyWtTDboTY3RlD2tqC3SlXC822ir9BEtG4y7p40jTxeugk0/ON74/PbSOD86gC4bvhsOBLcoCpYV9XK6WYJzU02LrYLpxgHvbsRSOQadLBH1bEI8zLmvVFZtnSfIdPCb7MSk3FhSY6vKhu9yaxNA+2OSFvQ== 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=WB8Sx8E7dZkIJ2v2A3PMYYuzUIIAmg+kPPFk2pNgQ6c=; b=wBbaxDZ6Fb8SJAS7zgIUs5anDz/pq+DsIUc3M21Q7unigvdH7+kBym2M1x73j88YKOS0MYwVsdYMt2Y5Z+LsKlMW1H3xDX/piLuSrvodF89fGs1tu7aDrysfdDS8ZrGv7H3d3QPxNpxr/X733uArSPE6JjhtmZNLq6AsG9l8W3+lt8PHTyd/lN6ghTsD60JXokb1rz0nGXi5Mn1X9yP0h47C6auKCjVXGd7n78xFKbnuwBJHJG0Wg+5YphsMn4NumewEx/wwEWX/98Fvw64iuETCui4uBIncKPBhbA7ng9acKHZJRNEzp4beqq6Ih9Gs3BQfTc25IAZVeCJJDGbAfw== 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:11 +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:10 +0000 From: Andrey Drobyshev Date: Mon, 02 Nov 2026 12:36:45 +0200 Subject: [PATCH QEMU HCI-8.1 v6 30/34] VZ: migration/cpr-exec: take the vhost-net devices back if exec fails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261102-vfio_v1-v6-30-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: 859a0cfa-ee24-4423-b3db-08df38cd29f5 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|56012099006|261009223027099003|261028144727099003|261026121527099003|261021121427099003|261026140227099003|261022105027099003|10067099003|18002099003|22082099003|5113699003; X-Microsoft-Antispam-Message-Info: pX/RHC0mSmK36xgV7vyOW8Q8cwT5JJOM9CaNNVfrnt5u1rBTu42vSS0l+hmRBWq1QEFZB0mwoeE7J01Pf5YheKkuACKMjoc8lNmLkNwnZLSZH7B+GDGmJ6Z6gdMeEo3+smnvmutA5oez3xxY7f2+bFF9lnaKDqd+ILZMqLUE93hXbGzocrSLmZZAndH7qctS7P5qRGlIOQZYbDOftJLA1CTOYk9NxPRERfLOK6Zxhb/4Ho8eQvlQff5rykDWG9KL/EmE6IHVWSZOKHSl1V0mAVgQRn/f07J43VAcn+pPq2YiE06v1zinq+mSu557zsAHRq/B754vTnfVuG/3yW3PjXX99QD9s4j03w/4pZyGyWe0HaEUvTcLmQWyeC3FINDo4O6ITBFs9vulHTYcCqqrWEBvZYtXMeES1Zr4Sj6x6dugSyrbzsZYixFzrlcYghPJjAEi2NsXbVEtoog2CFL3p2bBPvcGmFgE4dj0WUQ1/LB83S3lHSd8a6vj/5Wedc3EwG2bRH1A6W7oSVhNnjNM0PqqJeV2GLOAZss2dR1NX6NZqiu9XxuxmfcsAqIHpuPGGwZomVNZY85WNNn6ySanciSjxjn8qXB7JbEuwGMewx3oRNQyDZTAyz9+eratfl91YWMQDVbf2GHwpBEut9ifjofn1lTBHkEKsSd0wF7TTkgD0JulEcnRmQ/0hlkM2Y4LMYdMqnHh/dsJGk/yxSDIeRdXzaMgslB1fDhQ9JdvFyo= 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)(56012099006)(261009223027099003)(261028144727099003)(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?TlpWbE5VUDdKdkpRZFYrMEI3SUVuZWxSYXZ5OVdUTzVaYm1rd1YwMEFLdmV6?= =?utf-8?B?NlM0UVduWHdwaTZvRG9sUVk4SWtMaStlU1cybHBIb3NGQnBhNlNNYmpmaThl?= =?utf-8?B?eTFiVUs1YmpCV205WmNDSUhmd3oreWljMWFOaWtVOFozNjE1b0R2VzlzRi9M?= =?utf-8?B?eHp4SEx6RXcxcnBHT2M4azducWdVZ0N3REk0YnUzVFc1d2xZVFRHSUhFT2w0?= =?utf-8?B?ZE9lRXNkalZ0Rm45UW14elFnZ3BlWVFZVnVKYStnU3ZieDlUZ1FPUlFtekxu?= =?utf-8?B?dm5oci9iNDB5NVF5b25YalFYSnl4S3pRR3ljMG5PM0JpR2NjbytMa0syMFdK?= =?utf-8?B?VElxTnFPSGJXOENJNDlUSTU5MHV0N2d1WlJ1OGlGY0JPaWhJTlVMcXYvU0x4?= =?utf-8?B?RXN3VnBtVG1neUtxbXV6Y1gwSkhUQTNIdUc3d05wVVc0YU1uUFJpYTJMaC9l?= =?utf-8?B?NEZpbUs3Z2ZLV1Q5S2Q4eFpIOXJZTmZpU0hqUkhHLzQwQ3g1ZlR0b2ltTnNz?= =?utf-8?B?OFAwaTlCWWlZUGFXVnJzOWFsdW9XekR5NzcrRmwyMWh6dzZSYzlpbGxVSjZv?= =?utf-8?B?WFUreUUyMjlaZnNyUUhLZ3drdzhRekRpU3lmVjJUMGczbnlxUmR4eVVKUDIw?= =?utf-8?B?R3RQS0tKek1TbHpEK2Z4bHpYbkZuc1Q5ZzRzZjRKUGhubGhOdFF4T3A2WE9o?= =?utf-8?B?ajNxK0JGbHNFMWtPZ3RKb1I2UGZ0Q1UwTHJ1S05YS0NEbFJVN0F5ZDhzUUJR?= =?utf-8?B?TzhQTE1weHJZUFlGQ3NpTU5BckpEWW1NR3lnb3JyakhXQUk2Nko1ZVpBeDZT?= =?utf-8?B?dFpOTGI0U2g0cXQwUEljYk1UbC9uR1cyTGo1c1Z2SFp1cWREczBUQll1NkZO?= =?utf-8?B?ajFERldiM1gxcUUwZ3UwMDhkWmllQ056c3JlS0F6Nlk1K1Z5YkZHK2x1RzF4?= =?utf-8?B?blQxVXBIdkQ0UTNnZ29NNTBlNzRGeXNPbW5NNEJRMWkxL3VqNWV2U1M0dXAw?= =?utf-8?B?VkVFN0c1Y05RUVVjTmd3djg1Y1dBcWt1OFlDNVRsQUc1QmlKY2J0d0ZORzhz?= =?utf-8?B?LzdTSXU2eXAwc0FjTlJsUHFMOVlHQ2lqVS83S3lQUjY5S0gyWStJaERjS3g1?= =?utf-8?B?MndsYkRWemt3MTJmOTNxYjl4eWtsaS8yeTh4VXRGdTQ0M2lxLzVQdkc1Z2N6?= =?utf-8?B?enh4VWE4N3prUndoTVp2TUZndGQzTm1nYmdzY0o3NHZncnIzc0JDaCtVcGRq?= =?utf-8?B?LzEySUJkWitTQ2s5UjdhWWYvUUR5a2krQjhtQ0hZVFdXSkJ4TUdXUmJrQU5p?= =?utf-8?B?TjU1eTdPMysxWm1RaW1qaEJBN1paaW9adENTdy9Ndk9rdlZOU2ZMcnNHLzlP?= =?utf-8?B?Zy9nTUhqc0h2bkU0NXplZUgwSHpmejlBYlpjMnVmRkZBR005eXRxWUFZbFRa?= =?utf-8?B?bTVxd0JEVFgvSmJwbFNNMlllK3hYTitVWWhFbFhtRjZLaFB2VG4vSWwzb2xU?= =?utf-8?B?Zi91K3RQQ2V5MFBFSjFCUkE4VWNHV05MbGl2SC9NODhTRG90SjRLOVluMENk?= =?utf-8?B?T3NoR0lpR05KVFV1aEl2YndIUU5CbE1EeDc3TDBXUFhPdWdZU3d5Q1ZMcmJn?= =?utf-8?B?OHlMdllSNG5VN004K3p2MytVOURzVzhCa0wwSlIxZHZ6bkI4bE1kWGRHVmJa?= =?utf-8?B?TVhScmZXZTZ3czg5RkViOW9YUGo2R3BQS1NMY3FYOWJSbklPZHlyZWlTd3J2?= =?utf-8?B?b1JmWTBHWDUvSFd6aXphNFJhMTVOdVNVcHp6M3k2aGRmdktFaUN1b1NuUnQw?= =?utf-8?B?WCtYM3VDc1lVVVF6ZExrOU5ucjJLWi8zZk02WkRKUitha0lyaHllRXh2STli?= =?utf-8?B?YXIvaDF6eGIwbTVHWldDSVA0dHdFNDc2dUozVTc1VkZocWpjTi9NOGVWUkRL?= =?utf-8?B?UHZPZWU0TUlJS1ZyTkRZK2JOSkM1ZjN3S2pWMmoxaWVnMS8yZjR3UVJPWURE?= =?utf-8?B?R2FKTzBPZVkxeFUxTFVtazl3bklLMXRiQmlvalNHSC9QT29NSGN2a2c3Q2ZN?= =?utf-8?B?WUsrTzdwRWdickNPWjNTaEFoUHJiQlI5MTNvTExxUnFGYkFxRFZVMGw1ZWFq?= =?utf-8?B?aVZVZlVhN05IMXZFbitoTkowN1NjbXJUUTNNU3ZzaEpweFRTYmNQeGVnSER3?= =?utf-8?B?R1l0VDJzMzlqdW1PZGQwUUpRSjlnZ1Q2eGRXeTc5MlVBVk1iOUp6VmpaR0lv?= =?utf-8?B?SWFheGVWQXR0OTZia2c2VHRRWDFudTlYa3dWM1lpYjFYVzBHNWFRWHFGbUFr?= =?utf-8?B?RlJlVWpxNDR3UVVkQ3ZCbHEzdlVMN2hEM0tiN2ZKZE5xSUdWbFNzRUR5U0FG?= =?utf-8?Q?cacs9hCxyFtG+m2w=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 859a0cfa-ee24-4423-b3db-08df38cd29f5 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.4650 (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: +nM6SDTiAgeA6m7PGdtQI3F9XGQbrgmS5qehObZmg6//wQ3UNUMYbCoq+CStRnRldNFqBfAMwMB9QXShFuvcsSOoFxHGwSuH0ON/MHKgJ8E= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR08MB8199 Right before execve(), cpr_exec_cb() releases the kernel vhost-net devices with VHOST_RESET_OWNER, so that the new QEMU can take them. If execve() fails, the VM goes on in the old QEMU, but nobody takes the devices back: the kernel refuses the ioctls of the next vhost_net_start(), and the guest is left without network. Take them back with VHOST_SET_OWNER when the exec fails, and set the vring call and err fds again: VHOST_RESET_OWNER dropped them too, and vhost_dev_init() registers them only once. The devices are stopped at that point, and vhost_net_start() sets up the rest again when the VM resumes. Only the devices that were actually released are taken back: vhost_net_cpr_reset_owners() marks them. vhost-vsock does the same in its CPR notifier. Signed-off-by: Andrey Drobyshev --- hw/net/vhost_net.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ include/hw/virtio/vhost.h | 2 ++ include/net/vhost_net.h | 1 + migration/cpr-exec.c | 2 ++ 4 files changed, 54 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 56c697f4bcd..fae6b060c6f 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -594,6 +594,55 @@ void vhost_net_cpr_reset_owners(void) 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; + } + } + } +} + +/* + * Take the ownership back when the exec fails and the VM goes on in the + * old QEMU. VHOST_RESET_OWNER has reset the kernel device, but the devices + * are stopped, and vhost_net_start() sets everything up again when the VM + * resumes. + */ +void vhost_net_cpr_set_owners(void) +{ + NetClientState *nc; + + QTAILQ_FOREACH(nc, &net_clients, next) { + VHostNetState *net = get_vhost_net(nc); + + if (net && net->cpr_owner_reset) { + struct vhost_dev *dev = &net->dev; + int i, r = vhost_dev_set_owner(dev); + + if (r < 0) { + warn_report("cpr: failed to set vhost-net owner for %s: %s", + nc->name, strerror(-r)); + continue; + } + net->cpr_owner_reset = false; + + /* RESET_OWNER also dropped the vring fds set by vhost_dev_init() */ + for (i = 0; i < dev->nvqs; i++) { + const VhostOps *ops = dev->vhost_ops; + struct vhost_virtqueue *vq = &dev->vqs[i]; + struct vhost_vring_file file = { + .index = ops->vhost_get_vq_index(dev, dev->vq_index + i), + .fd = event_notifier_get_wfd(&vq->masked_notifier), + }; + + r = ops->vhost_set_vring_call(dev, &file); + if (r == 0 && ops->vhost_set_vring_err) { + file.fd = event_notifier_get_fd(&vq->error_notifier); + r = ops->vhost_set_vring_err(dev, &file); + } + if (r < 0) { + warn_report("cpr: failed to set vring fds of %s: %s", + nc->name, strerror(-r)); + } } } } diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index a92439d3443..421f7139cfb 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -151,6 +151,8 @@ struct vhost_net { SaveAcketFeatures *save_acked_features; bool is_vhost_user; NetClientState *nc; + /* released for cpr-exec, take back if it fails */ + bool cpr_owner_reset; }; /** diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h index 39ce7ad0e3d..cdfefa81500 100644 --- a/include/net/vhost_net.h +++ b/include/net/vhost_net.h @@ -90,4 +90,5 @@ 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_set_owners(void); #endif diff --git a/migration/cpr-exec.c b/migration/cpr-exec.c index df11b0c7633..e4ea160698c 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -253,6 +253,8 @@ fail: if (cpr_ram_rdonly) { cpr_ram_restore_rw(); } + /* Still the same mm, take back the vhost-net devices we released */ + vhost_net_cpr_set_owners(); /* Note, we can go from state COMPLETED to FAILED */ migration_call_notifiers(MIG_EVENT_PRECOPY_FAILED, NULL); -- 2.47.1