From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023115.outbound.protection.outlook.com [52.101.72.115]) by lore.virtuozzo.com (Postfix) with ESMTPS id 32A4E810EB 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=yDg6ULds5yMTSpCuIcrDhXJ82U7ApGgDvUNxbRGsSHbYwQj3jIuOaerTTP2ORpkx7fN5+FsQBzTFXp/5SnAXwxaFFIUzaiRYEPtX/y+8Ph/h+lKdY49LSXkpJvyK679m4Ap4fN0ilGNz7K9LMzw7hZn+ZAaEBXvh7rBS2qhQwrbifwgihCRFkDDqwjxVKGRzOWjSU+gNkBZ7L0sbGz7biggmcTrfab1MxNsUE6sEL/e+H0C+c3fE2o6w8wtk8EnGIBlNNv8WyJRxBgbQWFLgGSWvz+mRCMDKXLqvNTXEfpsebtMGVTlKcqWlgMGbylwpcmgyOViv/YUkj8TTBC+2sg== 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=ToTcpV24c7D/pU7phBXa/rTWhf6fjbR3vfD/CDJR8ug=; b=SFJcCs27dnbncHUPJHvEVGhj7hIOvA71xbu5TiVv23937l7yd8cuWKiQRajVmVN4UCUiAl92teK5cTgIFZKcz6tgqK1yrrKgvCuCVjvtSvLfLyaKTrHV4Uzgh56JxVddsAvnffr1popGZHCtEUITE7tnl07Fh3lXChaa4WAhnLbG7yYiknyyaBZ/EUgcvwdV4oSitQio27V9+FnKLaEst//Gm6FZB5xp80w/UUNouw5aiUeEn/Xz/tHMt+6BRyIShqU0KR3dLeF/1j1eLe31uHqZOeJkjgJwVrBZwX7nT8mmkUHCGibB5mnqUAETNXSFZpcWqg0lSZiGAxMymwnsIw== 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=ToTcpV24c7D/pU7phBXa/rTWhf6fjbR3vfD/CDJR8ug=; b=vQ8ep7LRmfQTs7oZoQGjQ9IO60jbZyHFaE39oZdyY0xW+WiVbp+3cNw29jAWqaUjeWZLBSRGu628NdAo50+LmMGoB6UTprLbTHLXMKG0Of/hS7/7T3mAaVuUkr5FhMKorEkGNV3bSzcBB8zHdFeMogiWFhqhWel2tZOn5kMrmOPWWxU9pQn+hiiarCTw0HoPhxTOdAwEg60c3bHmjT00LxpUWxJ1h40DM/rM1LeOp7kXLqifiOzs84OjxxcTNgFNAcwndfAccwpQDtyA6V0OyKbIiXXgETBnjs7hKpohMcMX9QVNdC6DZKUTpJFlc9YOY8EjNLugonPDSgmjUUbiRA== 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:46 +0200 Subject: [PATCH QEMU HCI-8.1 v7 31/35] 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: <20261103-vfio_v1-v7-31-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: f5160fa2-319b-4c95-f8f8-08df39b26a82 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|261021121427099003|261026140227099003|261102123227099003|261028144727099003|261026121527099003|261009223027099003|38350700014; X-Microsoft-Antispam-Message-Info: 1mU016jAycL+ZpT5l2gdFW6O4S6l0U08fWPrsTA+J7dNLNVgcDChVnT/Y5+2aSeGVUesMn3ODsSCScp1WZO/zDgEyQppDWHjJ81/5APGJylYW8h1HTsyYW00EY7WFZeyXWC/YrOoeslGORb5WCSXfZ9BzacGQH2YrNTJxt7FRO7J5WWuKUUbPhtvcayNmOfu47x/FLbqdXoNUar9fZgrEL1q5dycUmlREVfTgeyAHhAXJyImudVrmW9wbuZhDTb9Rwhr1nahQAPyx6l6cPosQs5GiF3o//MxUHioLAXpSXkALmvPWTj+JXlFW6pKSMyjZv1i+ry52Ex/3gF5Mk1weOrKO0Fsf6Jx9ngpSuLvfaBvIrHJAsFFL1HZcVxny8iZYx0CasirwOcf1n2W6f5Nah2NB202Kx9/zL5C1Opx6peaKRN0rEHQLtejPfAkKuyNd3EUw2jk9WVHfKsnMZHkG6VyYixY8kSvpWfdW2mR6gyXij/8cAr5vkdbmfpBYrAIwG4r85j5eYHerRAPpil6vhXZq/JEJdC9lZQDysBCdOb+WVATT+fmYWsjSWkGZeqUXekb89WHFvlMPSXKibjLu8b6ii84zMWTMyufBsYjwAL/A8aTeFxQ1P4VodaTSxRJeOlvpIDSny2YMGGqnMMN+6d9UnOaKFVYRmkhuh7GMR7ArfX5ApKX6xYEoxi00modA/6SEhXM0jn8WeHmXO5ozW+v8IrG87Zv/8ciAD8sH/0= 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)(261021121427099003)(261026140227099003)(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?c3dHN3IwclNISStseDBlWWRHVklocjgzT2xIK2xsTUZIc3puMFUvaVZGL2wr?= =?utf-8?B?MlNadUhMc0VCRVJQemdqRkFzWThwcnJVUWVjMTByZXBNT0lVUGFkQjZLcnZP?= =?utf-8?B?YzYzNWUzN2Vkb2h3bytoNnVwK09FOUhSSXJKbHgycklrVngxUWUvcXNHQlJM?= =?utf-8?B?YXgxUmVFREsrQWJJQmlnN2VXTFpkYTJuWUpLeFZScUtIZEdETDgyTmZQR3hv?= =?utf-8?B?dGFlNzUwMVAvSG5pTnk4ODllNHlHQzBMMG11R1hUdkxFS1IxakQ2Y2xkd3Q2?= =?utf-8?B?eHlkNXlINmxpTnNaRGdJVmFzRzVwWXR5OXlON0FmVjBDWFQzWUNkTkpiaUFM?= =?utf-8?B?MzNUV1l0cDZBZXVvSDNxdFNJbzFSZDV4VU0zdHZrQWxrcVpzQzBCZUptTVhF?= =?utf-8?B?VFRMa3hpSHJyUGxpSXpGYklwL1ViR1FtYm1iWDBCeVhHaVdDM1V3Nyt2Vlk0?= =?utf-8?B?OSs0T0hKdzhIREs2aEFlc01MVUJtajZIdDFIY2ptMGd1VTlzOXR0ZXIyVThk?= =?utf-8?B?cU11UTd6VXVDSDY2WU81ZDVNMTNyS3lZTjNsQ25FY1g4am9JZ1pVY1ZBRzVr?= =?utf-8?B?TjBGSkowSkl0bGlTeUV6djdEanhseWRXK293N2JyS3RaRWpJNzRpQ3dFUFdP?= =?utf-8?B?aGltdENJRG1jaysweVhrQ096amJZcytiOUx0dVEwZC9HQXhMTFI3QjZxTjdJ?= =?utf-8?B?K1Exb1hwRkh0YkczUEszNUNRbS85OVVoMnk1QVJBTkdMTk1zR3R2QndLenJq?= =?utf-8?B?NVJUNURRWXE0aUluZThwSm5KcHlCeWJjT2ZkcnZTd2V0cjUwaU5icmR4Um03?= =?utf-8?B?SjBqM1kyZW8xM0YzVjcvYUo3QnZHaUlLVjNqUEdMcE82Z2JFMTh5UWFNQXdo?= =?utf-8?B?QUZseTZVUmZvdWdSa1gydzEzUlVyaVNQLzZhVlpzTzhyTEdaSFZtbHI4REUx?= =?utf-8?B?ZWtvNWdyVWhOdE43WTJ6amI1TjloYXRPNGxlaG4ySTlrcjFUMG1NakQxSnZR?= =?utf-8?B?REN0dWRTOHU2V0FwVkV1U29maEhtZkxEUUl1dkNoMnFZSFZrUWo4d011SzBs?= =?utf-8?B?UmRPRkxhTnd2bENucE43YUVxNVh5b0FuRDIza3I1UythcDYzdGtHL2dJWkRE?= =?utf-8?B?OE1vTkU0OElJSmtldDhRZExMZm0yTE9ERlByd1ZuckppSzVyaXpkMkZxVlNs?= =?utf-8?B?REtMSE9XSHJtSDYzSitVV2JqbVdjb1VjMUsxelhMbm50VE9DTktEbE1rbXpN?= =?utf-8?B?WjR0aWZVTzlUem1IMjc3dzUvbnJ6emhQclNqV0tMMG93d1krdmJiS2V1ZExH?= =?utf-8?B?dWF4QkZPMHFmY1FtbHhWM0cxamZRNGpXbUlzdDNINGVUSGVYc3o1c1pjNzht?= =?utf-8?B?ZHMwZlRKV3VoQXJ0OEYzc09rWlV3V2RZUzJJODM4ZkhTcHhnMDNyRjJ3bWhu?= =?utf-8?B?end1WUFXWHp2RmNRelNubmFTZENtQUFnVVJWRkZZaVZ2YjNDWUJ6Z2RCRlps?= =?utf-8?B?YWdwMXdUTkJjazM3cExjYTVDcDVjWWVNY3NIZ3o3QUpQdFZ4Q0svWlBSRDVj?= =?utf-8?B?VTVCZzRvY0hEVjh0RHJiS1RCeU5WdkRXWi9FTDJhR0JadVRLZGMvODg3RU1U?= =?utf-8?B?WUtMR2dzSmZnM0NQaWFDU3pqeTF4YW1zZDdyWnlhTUE4enNHVUFrWU9QTkp3?= =?utf-8?B?WHpoWmV4aXR4QWFSaHRzY2ExS2xBVTF1Q1F5MnVaUWR2UFhlSHgxZzdDTXcz?= =?utf-8?B?NkN4eDVZY2dvR3R6YytwbFZmWVVnYXkweGdmZWlRODlkaStOZU9wejdOZFRl?= =?utf-8?B?cEpkNmMzckhGYXQ0RVVRRHpGbzFGalZrSXpTVGt1NkN0bkR2eUl5NWVHSlE4?= =?utf-8?B?em5ncmJmaVJEU3hrTUZwMUtGSlA2YkVLenkyc0hRa21wR2F0SU5yS0tyWWRM?= =?utf-8?B?LzNhcHhqYWQ1SzVzYW9VVk1OTkN5U2dzK1pqNE51c1VueVpjYzF0U1FpbkVN?= =?utf-8?B?MGxvMS9nRUhrZ0VNMlQ4ekRXNUE3ZDhWcHFTQWU5enRYSStLZ3FCdHd2aUd5?= =?utf-8?B?OFlXSkRMYzZ6RjN3N0ZQK2gzNHd3eHdFcnBMZFhSN3ZZWENnRWQzVHBpNmR0?= =?utf-8?B?N3BOZ05LV3phNTgvQjdKQ3VlUUtNN2R3THBSOXVGME85Um5YTWZYSlVGZ1Yv?= =?utf-8?B?bjMxeXJvYm1peFk2L3JYRmt5ODBUYjdXdE94SHM4RE0vWG1DcmtiM21Vb1RP?= =?utf-8?B?U2VwUFJ5elk5UFdBNjQ1ZFU0UUpFTlB4TnFDU3lUSnFERmIvT0ErUHZ5UXUx?= =?utf-8?B?VHF6WUtBeGhDNmNYbCsyNTAxcEd6NmlUK0RYLytJWjIzYlZMUytVVjBaakFt?= =?utf-8?Q?ESpH6GOCsQuAYIkA=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f5160fa2-319b-4c95-f8f8-08df39b26a82 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.5220 (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: 4iVP70WteHd3bIutiiHw/Ry/U4188lo3Lf57AAHiGYXi1/Uueb//10sbobHXXoRITpqdNrqcEVz7rITCXeB97y/wJ/cxMlpUdnWi/8kST+A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB6338 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 005d0062271..d853945b81f 100644 --- a/migration/cpr-exec.c +++ b/migration/cpr-exec.c @@ -259,6 +259,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