From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11023136.outbound.protection.outlook.com [52.101.83.136]) by lore.virtuozzo.com (Postfix) with ESMTPS id B856280BA1 for ; Tue, 20 Oct 2026 16:31:04 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W3oq/g+AiaNtQgFiVxRKdTPC++bB7ogosNg7rEJjyg846LBq/ZLQPClvXSy3bJDY8MAGjFjSpVRNuv0LSozWEevP6xyeOFYeunuxJSHZoWJmIJ8Wr0LgsGQKB9N1pn/TVADSW7PCiwx5V0uiIEmu6WeK4sScXUObmDCVTko+I5Brfdxc4KjDrGHbsX5kMiHfouoPZIeUVwC60AZGPJZ3DLkLoW5/hpos6TeHA1ck3+6mfMkWOjYT7bcNMwqS+MZZdkpbopL0ASKQ5QZCo4WiwzvoBRkGX7ubaCrKNLEBm+ufpEVkH6XKP50v1IKEM6aSekX2xowL777cmica54mkyw== 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=SGmwToBEiPiJIHDVCgpq2TrNS5uNGMURwUSv7Sxa1x4=; b=S04IjgrS9yyUgyX4emRW8OJ1A1XaV2rsG170lYnrItj0oYERL/2J+gV47h7iW8xA/OJdZuy0FLtPqiBnYkoSVGRBpmSEaXnyBtI24LpggvAxBKb60gUYkgpHd0H3I5LxgEKUXn/TwRRWMOMbtxoBxO42d999dDo6Y/Bhpdnk4SiE9AxNiANzT+jIs5GdfOhoxzh2YO1/b4eoTczN82X8En7ztRUrX7adv2udCy57atUtB3GXPwEPmM9xQKwXqp17ECnICRrUOvgq3PdtZQD5T/cMsahGcjrMEurC/U3EUrzB0aUeOH6DOpY8FZu1o5bNM2JH0WOMW6oaqlBOQBAL3A== 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=SGmwToBEiPiJIHDVCgpq2TrNS5uNGMURwUSv7Sxa1x4=; b=gTEzDXfAVmvbKl0K8OYklJRR2xd7Glb2RooqFrudGBKbHriogf45DO9mdf5ZXkv05aDxAN5CJlfvrcyU/Vitkb1OdU42i3sr/Sbw2KyNJXBOAJiZ69IYDI8hxKy+OI/oBCu+Bi8s6pzhE6uw9u33aDSyf+1wM1Ypa3qaCYLnMjpDLMVSUoHe1b0HPKJQUF8f6+HgDhu7DW0YisUamjoTSNtppv1W/ZPQuh8DCptTP1Yt+wmbTvuyGE/rFgqL1adW4yiggw+leKLh4Krn4YSEfHkUpatoUNyAY7nqMZQj7DeUrJfrLkY48btxo4Adm99daxCxxSROj2GH3c2Fs472zg== 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 AS4PR08MB7553.eurprd08.prod.outlook.com (2603:10a6:20b:4fb::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.15; Tue, 20 Oct 2026 16:31:03 +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.0546.012; Tue, 20 Oct 2026 16:31:03 +0000 From: Andrey Drobyshev Date: Tue, 20 Oct 2026 19:31:07 +0300 Subject: [PATCH QEMU HCI-8.1 v4 27/31] 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: <20261020-vfio_v1-v4-27-83a5668230e5@virtuozzo.com> References: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> In-Reply-To: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIUP296CA0056.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:34b::14) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS4PR08MB7553:EE_ X-MS-Office365-Filtering-Correlation-Id: f2683940-34df-4e17-22c1-08df2ec7865b 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|376014|52116014|366016|5113699003|10067099003|22082099003|18002099003|261009223027099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: 3xqB8lFD+ec5lguLbgUgdNomJMzlUdM1y0UdpCd+o1cwK40iMJTbwlj33dLftzDweoVJNJDx9m8yUTLgMiAIk4BBrwrv8mGZjdzMEQGKh+zB7PnekQQ89KMdZi8pk78pC5eJkiMPDU047/NCpGv7HjOlJTkBv5uIqUYLfH1wjIcibdzyc7wYsp6UfW5+P0f2wSUpSdxjyaZwgYeGklO7o9BGuOfsP9TmFj46k2lZuopz49m0BtCmpoOTcA5Rn9B8Tsc030xH5Ho6AJ8UOIv9Qcbji0hsA8lVU+aeQTe1vFRc7aMleZKPmKL81fEsJJmaYUMm4Yi1PtLXjHZaO1EULGFIj7Me/RuaH40J1z1OZn0e09SLFDYQnmfqbjty2GoAVPfHUTBuO+cE3Z1bX0a99cEi6T+PdiTwNV7NrNofVnqNakJFLI+stPczDP7visMHTYnUyygm/z/uGRD1S/7U25Jkg9PVMmUuamdXE9KgQaCugnmOnj68RMc6S6zw3oH3m9vsWY4R7gxurnSwnfapmzfxleRN5mX0mln85uBUL34YEo5ck1/DYEil8TnyFYBACQiE4WkmVNfscGuhMftqTtTbt2IWzbvMtcmV7tEdpB4IWgLr5VER2oKH6svQZSTTsd9drluIEnWT6P7tA3dp2pCVxlCadoUqhfL4d5BTbEukPftm66W/sqf8hfXz37MOK2BDmSh4i0NvXFKFqwEAbbX6to8PZVpTKVX6eSddYus= 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)(376014)(52116014)(366016)(5113699003)(10067099003)(22082099003)(18002099003)(261009223027099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?eDE0emtPbGRBR3RrOGdNV1U4S0JQOHI0ajdUQUUvSXd6cWtyMC8rVTFFUnJj?= =?utf-8?B?djZ0amViSE9GanloSGlQaXNXNTF6V3VYZ0VQNDRhMy9DMHpBNnNSYWpCNzd1?= =?utf-8?B?SGtZSUVLaU9hWUtOdnQwa0NaQ0NWVGo4SlNIMTlzSUd4czdFQmxkRDdVY0lB?= =?utf-8?B?czRpSUJ4eXNCSVMwUDNjYy9FZFJjN2Z4L3FoWmVRYVRHMlJWNDZqNndvYXNQ?= =?utf-8?B?cVloSFhCTnU5aE80dHptNWR2RUhZaEJtblFIcVk4UUpYTlFLa0RHb0d2dVU1?= =?utf-8?B?b3JMTUNuM1Y0aWR4bWQvZDNkTXdMc0NKc1NubTFQUzNwYjFrLzZEbEl5TXFD?= =?utf-8?B?STBtdlZvcDRHeUN4WVcvbEJBWXlmRWdKbzJDZFNPSVNvTElsS3hPQVMxb0RQ?= =?utf-8?B?eTFvUnk0RXRWOCtrVDZJM1RHcjVIb0U5VS95bEpaSm96S3IxelJmYlRxMVI2?= =?utf-8?B?NzNXcEQvVEZLRkhjYzFpd1Y4RUE0aUZoWkVMNVIvU1ZSUGVVVFlySCtRMzJ6?= =?utf-8?B?U2NLeVJsMDVCT3U1VW4vaVhhRWVDcmtLWk4xN1haZ0ZrWHdjZ3MzTkpnS3Vr?= =?utf-8?B?QVpkUzBpODhsOGFNclpPb0kzTndxQjBzci9NLzhxUHlhVi9saUpxeTdzb2dr?= =?utf-8?B?aEliOFF3aUxnSG1jWFRYc2orWHBVZ0R0VDR0Nk9UTjlOdUQ5Szk3ZnByNmN6?= =?utf-8?B?UWZDamtzeUc5TTNMNXFCOG05VDU1YnNVRExzVktRclJlMmF1M05PdXV3OXYw?= =?utf-8?B?SUI4MUZjaWlGblVHK1J3MUlCaUxGRjhWRlVvc0lad2NSVkd3RGo5THFMUWZj?= =?utf-8?B?SFpEZ3ZhbWQrK0JCUnNZRVQ1VWUvUHgvbDQrazQ5QzdONnZvWlFWWEp3M3BY?= =?utf-8?B?TDI2TVVoMEMwb3lFVzVocFFyaWRPODRpMFAvbllBSnQrc3VNT2tQeWxnR0Ew?= =?utf-8?B?TFJSdDA4Um41aWlpVFhETzhQQU1sUm9qcU1HRjI2QWY5VVBHNFZqSzFKWm16?= =?utf-8?B?Ry9NM3h2S0VTOW9HSFpST0x3aXBuQzJWWkh3aGlKTC9VR0ZqVTU5SnIzT2hw?= =?utf-8?B?VjFtY3RlLzNpaEJsaFQxM0hOeC91bTYzcDBHU0ZaTjRpdlFoa2ZVVWl3UzNF?= =?utf-8?B?Wm5LcGVBMjNkL3laTDliWTRFYXEwbnVuU0l6djdKZTB3NldIUWhGdXBGd1ZB?= =?utf-8?B?MFB3RTVyQnYveHk1ZEZkQ2JnaFNVcVM1OWhtZ0FJT3lZS1RhcGpESzdJdkNB?= =?utf-8?B?dWRheFVjL2sxRmhJYk9jZTRDQ0hSSGNvYVlCOFIwSUN1THZSVkhBa01MUit2?= =?utf-8?B?SHRXdXpSeWIwQUhjQ1crVHJ6L1hXNS9YTjlmN0tlTWpGOW5jVjlSZU4rWjlP?= =?utf-8?B?RFdpT2FlbVNrMzZpN2tQN0tsMTE1QXYwL05MSExjbitESkRUWjdOVG8rVHZt?= =?utf-8?B?aENTTS9sK3ZlNm51ZFkrOEd4STZSZEk4TWxhRTF1Kzl4SytwTWprVXdhbjZ1?= =?utf-8?B?bjZNM2U4bzhYSWQveFU0RWtId0N5dXVaRVVZWkJUU0dUYmhRZnBwR1ltOFNj?= =?utf-8?B?Nkl3NEZkTFRFS1hCWGl1ZHd1aWlpRU83ZCtYM0w1R3cxRW1WYjFMQ3hzbzg5?= =?utf-8?B?bHRyc0VqT3lERW5Rd3J5dmowN3NnL1JVcXQ1L1VuY0ljVDZ1UkpPQ0hwTHZW?= =?utf-8?B?VnRkZUpQM3pUbXBpaFMvV2NKd2JPclZLK3g5UGloYWpBZmtBZHprYXN5emZP?= =?utf-8?B?STFrODZ3WHRKYjFUL2Yya2x1Z3RXT1lpeXJlV2Z1M1JQbFFZNDQrM2FmMzBq?= =?utf-8?B?dTJtZnBBVjB2Sk9CZHp4NmEycEswd1NLR21UNWxnc3JrdFpaZ3RuaFczbmVp?= =?utf-8?B?NjRPc0k0UTZSVjdqU2c2VVErM3NhSHphQjM0TWc1M3NaeG8rY01xb1d4czV4?= =?utf-8?B?c1psdmJjWkF1STRyT3o3alYwYU0xSS85YTNYZnhRN1R2VnhuYVd5dy81NlNM?= =?utf-8?B?QUVPNGl5UmtEaXdCRXVTTVRlRFdsTzVtNklzOFhpNU9vTTNia21wUVVoVWZU?= =?utf-8?B?T2hVN0xsRm9Pai92cnBXTktXOXduZk9lU1pYdjBzZmtTdTdmWXN6cnFCeUJG?= =?utf-8?B?OXRNWEVqY0xjNTdsaGRjaFROR0s5bS9wdUZKSzJGSXZsWnNqR3pGVXN4ZGFq?= =?utf-8?B?UXkyblFWZmlPb0JiTHhlcTN4V1JrZ3g0Z254a3RoOVYzc0dtelFZd2R6bE8x?= =?utf-8?B?V0p3UjAzazNTVEpEUVpFUUFSSDNtNWhGWUZiOWJacGYva092bjdmZ0NKTklG?= =?utf-8?B?UDVDczE1dWl6b0JHTHRUMHUwQlc3STk4Qnp6akF1ZEpnampkSDlUU0kxOEtx?= =?utf-8?Q?cSqTFhutRAXcx69A=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f2683940-34df-4e17-22c1-08df2ec7865b X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2026 16:30:59.8624 (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: rqG4XeNG8tt4wUaOKkGTcUyazgibfDV7D4RVF/kHLFaWBMHcWZibFD3HIKVPXfX5bHDntg9JQ+EAR2d5DW9JYmJezfkrx1rChmJjN3U0j6I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7553 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 dd2ff9b26ff..21caa614a13 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -251,6 +251,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