From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazon11021072.outbound.protection.outlook.com [40.107.130.72]) by lore.virtuozzo.com (Postfix) with ESMTPS id 1A00780B0E for ; Fri, 16 Oct 2026 15:26:22 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K35bHlRowG5wUg/oLzY804EIWXVIr1RljJv0JB+A3ZEQZ8O5m16wNM0Y+DiSq76Y5NFYAsro1R7T4JesFGyhSnb/fIEhvQkWHVjjUdrJ5U8hacxa/I6uvahyz8Aq9G1z4iAIMsCX3TeQxnxIjI0lW8ngynxk45n767RAhGN8x3uwWxST2UA/rdyJJiGGDOkMrSVVX53FmyVzpYawX91kU+b1ZuIA6TyiV9BsUP9sGxQFjjm7GC5YS9jk1d/qxFIQ8vdsyUlziNdZPNO5V9esEBmyDEbQnzpBy2YiDCSvNXgPgAKYN8Q7VS17FVVNCZB7nhGlzBOEkwpS0Ot4MNUHhQ== 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=8sWHWS381EUk6ncn6cZyLZ6XN0AgfJrNGCXmximT5Ys=; b=fkYQZa5eJoFq8y4EkRqw5xaDDM85qrpbGqL7JsGgnFroTfWhRmDAxP24LvJwQUWECOExdUA3+Vc2iVYZUuhpullXJ+bt/FgUSehxQQxpA46j4JaZ9MZHV0xP3Qs4h0Rm5DaJdGdnTE0RvAO3ZGxukMCm7wKfJjNJ2rwTZaK1DqqQVCraWx32ReELmhjmKiTesoBEhU99MI0lrK79OgtkSTPjGaJ4LV/Pm6DXErpMiH6vSvk8rOZn2LZFNNFX3mQ71OMTKC0hiCut5agTE/WYXfB2Ve9eLH0MF1HRHdypdDAFWjfi5C7IXrUcX+Tj61/32EGGK6SnPl4I06Snd5sYrg== 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=8sWHWS381EUk6ncn6cZyLZ6XN0AgfJrNGCXmximT5Ys=; b=tgSh19VGnFPQQxNYvZLef+oZIkK7aZ97MoUnh590j6NMcg1hNeu0s4Pc/K9hXZKd8ISLGdwPlJ/rFtvfH0RX+pkpWdcPHZ56yfhKjF2RSL8zHS07D0IcJh84F9EBDvFf4AUnwaSIcaNf3jDsJ6rXjuYSNlwVaHosR4as7EJKJbFmucPJXg3MzlWZz5tAuIThoUI8v3ji7ieeckqeEIwVg9If9NXr3uJFJKlUACDaqI2AAizb6tU7S7/fXyIEe2W/SVoDuvO8P1sKdSIAbSATyZoAavtjSZQp339GV87T2c6Ce21UN7omhtX4GohxA00kgPMlzElk+GzwNIA2PdsJGw== 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 VI0PR08MB10941.eurprd08.prod.outlook.com (2603:10a6:800:250::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.7; Fri, 16 Oct 2026 15:26:20 +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.006; Fri, 16 Oct 2026 15:26:20 +0000 From: Andrey Drobyshev Date: Fri, 16 Oct 2026 18:26:23 +0300 Subject: [PATCH QEMU HCI-8.1 v3 25/28] 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: <20261016-vfio_v1-v3-25-47487cb5a8e5@virtuozzo.com> References: <20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com> In-Reply-To: <20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR10CA0088.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:803:28::17) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|VI0PR08MB10941:EE_ X-MS-Office365-Filtering-Correlation-Id: 08894d70-6835-44cc-dfbc-08df2b99d1ff 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|52116014|366016|376014|5113699003|10067099003|22082099003|18002099003|261009223027099003|38350700014|56012099006; X-Microsoft-Antispam-Message-Info: 5AKX7ai/CHQ44obLhUG/IgcqigL0wlOZlSb+CaGBYrbm7fVDvGEzansmQTw8lznBP236WCh4MvetQJOSae//LuycwYMuM3nUnjetGCSkzT5RzQUdn3YsiS7g7Dn4HSL0DaJhK0kyfW678QrUw3oZjb1mGiPOrazrE6I/Tt1BgnFE5Pfxky0X51x3PO8KzesnWdRwm6RncdxB8o4LWUT7lKDCYUk3VvySxItuGr/UYTdSjaEjc+S9SJ4zGWaFUhoO80uhnIlDZ/m8gVdmrCTBnxfit0RedXg7Z6fnBq8GdRmF2WNNAV1Y4hw/j7qxrtn5F+U2VMF1jFgrwwVujhLSG3ZMX+pIRrFVT+ZY8ejx2aZ0am0WizwqYO4QFyDuMnhRhR5cmklhMOuDM1epy4JWHtsZ3FJ48m1DfvXCPHICPOOUqNFInsfIuOKNuyBxRTEksKIs7Hp/GsFSO0Cf1cymFKW+2UZgZxKoJrg2lEBp3F+sX5X1R2ZstKO6/vS5mwvpe0xQRAfPTKgIdLLBB34r7c+gWsliBcaE4+jN5rzVDF2V68R5X0EpLP3c70znpD1ghhz3x9ax7B1C+sVD0/wxvLEW5V1Djm7TYANwpyXiQRnlgH4yFe9SY1ZZlfLM3Ty3SDJMR64SsnWFCvw3auRhmEF5Zo3cvn7i13UTGqwetzm/grW6a/ULjDQvO+8dhIMbDLS3BAnAQL/0viKNKeigmbZ2Gm8Xf7FKs2gvsJLxP9Q= 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)(52116014)(366016)(376014)(5113699003)(10067099003)(22082099003)(18002099003)(261009223027099003)(38350700014)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Y3ZzUWkwN00rWWc5SlM0bU8xTUhWR1MyV0E0OGtqTCtJMlRNenQvN1RORGJm?= =?utf-8?B?clp1bEtXVms5aUNQSE96eWUwM25xYjZRWDBNZWxvdDc2SjdTNkF1TU5RdGR5?= =?utf-8?B?NmdCRmhhUTNkc1lwb0taRHR5SzByU2M3NFhMZkt6b3dNdmlacGlOY2lHV3Bw?= =?utf-8?B?bkRlekRFTlRvM2tOZGs1UGNVU0YrbG5GNGFoKzkyeVJpRFFGbmYvTkNSYzZK?= =?utf-8?B?RTlJalIzWU5mTFJieXdVMTZvWG44dkZ6RDc2NXV3T1ZOZjN6cjQ1b2M5NnJu?= =?utf-8?B?QVd3MmlGY1o4d1diUGpoM2cyUFhPSmxyOHpQOXh3M3JaOXNJZUl3d1R2Yy9Q?= =?utf-8?B?VmtoZk5OdXhuT3BZNEkzdXZ1L1RxRXU4TjlMMWVrR3E5M290YzcrUnNFcVp5?= =?utf-8?B?eEp1SjNzSUptQTVNQTlnTjBDcnFOWGFCTG4wYWhBUW5PMGNiMS9mK3kvTXZx?= =?utf-8?B?aytmTW1jNzV1TGpCL2xiVG1mcGxlNS9aQWI3cHpIYmsrWWVLazUrOHZzRDBV?= =?utf-8?B?aUxHdGZNaU1zeUdBeVhGMG4zMHdKV0QyLy9aOU9UenhPY0szSEZMRUFkMlEv?= =?utf-8?B?emdDZGdpR1NaRlpNaUlOeDRVdG44MGwrdEY4SVFaK2h6b2J5ZTVDUWovMVZM?= =?utf-8?B?SGR2eFFSeVEyMVBVd0ZrQ2lUUkd2aS9sZnhHMGZoYXNwRTlsSlJ4Nk5HTUZK?= =?utf-8?B?dmF0bmhzTlFsVVZjSmJtMjNXaEd0UG44Z0gwZURPWjhLbStJTWJiK2dmNm9R?= =?utf-8?B?cG1NY2ZYT3pSQW94dExMdWxnTDFNKzFxM1Y3djhOOW9LbVJHQVViZUZld2Jo?= =?utf-8?B?Q1M4ckdVOVFneVFLKyt0R2hQN2lodER2Sy9XdFk2ZmJKTkpNZnZmQkdWcThr?= =?utf-8?B?M2pzdGFUZ3lPZ2JMcnJIbWluYk5aRi8vRzBocGgyRTlPazZjeUE5eHlCRUZQ?= =?utf-8?B?bGNsSEdCUWhwckdNeHlKUDMxTExhNkF0ZUdSUC9acVBsOEEyVEh0a2k4VTd2?= =?utf-8?B?WUN5WTFLM1dabDlBdUJETVI2c2pKMzl0a0JlZktxUUNNaVo2ckZTY3BLMEEr?= =?utf-8?B?NXh3TG9Gc3Jxcm41Y3drQXdnZlRWdGZJYTFsWWJzU09hczFkaWFWVXE5M3RD?= =?utf-8?B?T3NZbCtkelhjSmNHQ2s0QWkvSGZSNUh4RFVyanNxTlRnR3FJV05sQW9Uc3RG?= =?utf-8?B?cXBPcXNlbFhUZVdqL1drUG5wR0xOMVBFUEh4cmVjNU9INnpQZSt3NnZRNWhN?= =?utf-8?B?NHVKSHVVZkFnSGNNMmErTDVzNm1uQ0N5dEVsSXF1RGtGYUlBQTJqS1MvNllu?= =?utf-8?B?Tm1XZVRpZVo4cnN0YTNTK3NwMEd6TnZUL01SWjBTbDZJbFFvT0QyY2huR1J5?= =?utf-8?B?b3hUZGFlbWdTOHhSWFZoSDA0QllsWU5NWkJudC9PLzAwQW9jRFdHMVd4UENI?= =?utf-8?B?cmhXR3h1ZEpRaEMyNUlKL1htall6aThsdnd2U3MrZmt6L2lzOG1lZHBIREs0?= =?utf-8?B?WGk3T3oxQTl6YS9PMFBTd2piVk0xSlV2bTY1cEZPeVlJQUhnU1RpY1E1T29J?= =?utf-8?B?TVk4K1lucGFRQm1FWTlHL0h3bHdJTTAzSURTT25SZGVaSHFJak1ZbFJsK29u?= =?utf-8?B?d0UwbjZPQTJLT0lCMmg0bVI4MDlkNVVLN29ONlFiY3UzajErRU1yUWVLenBZ?= =?utf-8?B?bEVRRlpYa2dlYm4xVW9aQytYVUtKbmNqeEh3Z3VGTlpZSTVEOEpLRXlqdnU0?= =?utf-8?B?c2JOR3VFSlZlMmJsa01GWTJLN0hJZ0w3SCtDc2E5MTRzdit2bDMyTmJUU2gy?= =?utf-8?B?cDVtK2RtZjBPMkZqekRYTW1UbDdsUFExNThHTEkxUkZndUJlNy9UdGh1Zzdp?= =?utf-8?B?N3JOdDk3bUhXMVVQUGM4ZXRmblVrS1Y1Q2pLclpJbnEyemd3cDhsaHVCeHVU?= =?utf-8?B?U1hwSFlNWGQwYVRWSUxJM1hlWUdPRFJjNFdsb1QwbGdrOVQyc1pmVkNxam9K?= =?utf-8?B?OVRpZlQrVkQxdFhCN2tDblBPRXVWVVYxYkJMK3d6Q3hQZHNaWWZNR1FRMGtn?= =?utf-8?B?a0ZaTE5hUTBDblBKTy82Smd5Zk9ReDNENityQmpyait1UWJyRGc0dDFMbVRZ?= =?utf-8?B?UlM5RUhJT1hvNGpGS3pZMkJuU2hLK0k2U0t5UkFneWdiSGV2V0V5WDhFS0tK?= =?utf-8?B?Y2xYMU5ScE50elJxeGhjSkl6R0VRTStWc2dQbzk3TFZNNlU2YytBeWhjRHBZ?= =?utf-8?B?QXdqWFFxSVJGWlFvTXVYSkdYT2Y5NzJsWGYxL3JUdTQxV2IxeWJyUHNYVWhs?= =?utf-8?B?NlgrS3lXMENId2tHT2lHMDFWQ1NhMnY4ZndDRmdMYlRpbXlxR3hiSkZpNVFF?= =?utf-8?Q?K4nS2zUwhBoevpJM=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 08894d70-6835-44cc-dfbc-08df2b99d1ff X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Oct 2026 15:26:16.5376 (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: wsQ2VyUhMKBzMyvbhBIW11r4xsuHKjcKitz6q/dm8qWW2GYzobVDfwqbyeV/hhc83CcCw7qcxNwLeajTPlpw7VWprSFjpL9b7SGTE+ARG0I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR08MB10941 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. 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 | 28 ++++++++++++++++++++++++++++ include/hw/virtio/vhost.h | 2 ++ include/net/vhost_net.h | 1 + migration/cpr-exec.c | 2 ++ 4 files changed, 33 insertions(+) diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 56c697f4bcd..ae98574fcfe 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -594,6 +594,34 @@ 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) { + int r = vhost_dev_set_owner(&net->dev); + + if (r < 0) { + warn_report("cpr: failed to set vhost-net owner for %s: %s", + nc->name, strerror(-r)); + } else { + net->cpr_owner_reset = false; } } } 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