From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from GVXPR05CU001.outbound.protection.outlook.com (mail-swedencentralazon11023094.outbound.protection.outlook.com [52.101.83.94]) by lore.virtuozzo.com (Postfix) with ESMTPS id EB28080CAF for ; Fri, 23 Oct 2026 16:55:20 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Y4LRJCdHP76/g4+wZ3K5Y2vjgcXPUH0mUZb45qNHXeprYulcYBQ/aRY6pxU84hoEzwgFVYMhSB4jEozza/bC1VSzhyGAEItP7rWBcxfaIKAaWRFc13MiJDm5JOLXn80UmWcS5rzFZ2ES16jN3mNb3XAzp8UcOUIj5sdmkDfiRcYyrjfc14i3mdQaKwxVPozFULDxgDaE/OK8+fUIweu+HBwx8b1bgZpQ7w7XNXdFTZfTfoNC6Ujjcj2DKqKDuTrxhlDOwxXXYThM3TI/JV+F2VFXMW4GrahRnevz08b4xBprE42mdcdpPlr7eFjEj4xMAKveAOlWXOeyryFHES2Wqw== 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=y27G4uoaHCHyAWCPO0AhuC4140b7UTm8EMXcxCUFUDcvTmQAUCTTW2ZXZl9VZR3Te81Xot/hC4oL+c+nlUyEmG+B8xTqM1iD1fK6sxx5XYDhaV2EmaWuYEue9fvdoG8wgyxOi0/ZpKOc+VSmfhap3DlDebnHLIFvuf9aUgaCEc43p66VHCaVU8X4y6rz8Sbir2+vJhilDqhFJNmbIHNWOmhu/J2l8nwMOyS/I6xdmZqK0wSA6lNSn+zk+VHfBs1XJ9KxcjLmU4erUD++kFhAKvkbkOoQDcSKSXOE3+nzkZepIkYgDeNHyhuKmumTGAfHpDBuJCsZ3hTsWlH0Fuf/vw== 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=qwudwSxOszICilTD6id81DHeaZBWtHRMfGGqcvBOpdqxT5ySgHobz1tqm1guFXyjmhk2QW7300Nowbu79oCcNz9dU9hIZr2NYE206CtcFC4q9KMJVwgZ4zouIiVn8cWHomTU1sFYspr2ozosY0KvasOJ0FbMwlt9Q8jg66Wd5Z038SMIr5lqR77aXKfrAcIA81S3FI8W9TwBAZqmtUWJtId5eWUSRUsJuXqsg29xQBhZq4doCNc/6xU2x2E54bFE4zPxd+zwiAfMkpfapvvv29anyRN18fNrcgmX6F8D3hvilK74N84LxAgHmkItXMR10RyYOXRWJVh1Hj9+lvySvQ== 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 DU4PR08MB11747.eurprd08.prod.outlook.com (2603:10a6:10:646::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.19; Fri, 23 Oct 2026 16:55:19 +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.017; Fri, 23 Oct 2026 16:55:19 +0000 From: Andrey Drobyshev Date: Fri, 23 Oct 2026 19:54:07 +0300 Subject: [PATCH QEMU HCI-8.1 v5 30/36] 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: <20261023-vfio_v1-v5-30-ba0bf3c6d122@virtuozzo.com> References: <20261023-vfio_v1-v5-0-ba0bf3c6d122@virtuozzo.com> In-Reply-To: <20261023-vfio_v1-v5-0-ba0bf3c6d122@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR0902CA0027.eurprd09.prod.outlook.com (2603:10a6:802:1::16) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|DU4PR08MB11747:EE_ X-MS-Office365-Filtering-Correlation-Id: 2d96e756-867d-49e6-bb2d-08df312656e2 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|366016|1800799024|23010399003|376014|52116014|5113699003|22082099003|18002099003|38350700014|10067099003|261009223027099003|261022105027099003|261021121427099003|56012099006; X-Microsoft-Antispam-Message-Info: N+fHJfls0AKipxesC8aXv1LUw2LKeBlUW7Thzwg943IToFj4oYk5Rwi43tqANutTxD6ifPQQvWUDT11kcrtXC50lTXdiIfyIdiEKxjpeq7fG3oTAOIDdKtc1Y6QxdhW11uR1jdk8AEXIldBsWu+cNXmZ6ENQeRN4h+WxwoeQhNkLc1aXMDh4l+T8lPIckEKw1bSmu8nt8c4ioIL15IPpcGY1ApE72mKqeBx++/m6SPvah+I/L8paapxTvfgWlsLzVIdH+8khnF0ChNnKxD15EWZhZLXZZZXVdhrBapdIaOhiVEliwnxz3SDe6Ri/5IwIOvHXhJEsPUTLfRKhuTys8xIe8cVumhS0dBWZA9RcsnqhUI9AAQ5xyPnZg0ZlPdohfRgCbU6PA7camIxEO7+dOYQMSzEYBZW9+G3YObYPO9LEbUgaKRV52+rkOwLSI7QxJtngGXFY0y2sqysEyvvFh0EIGGYFdIkksONTJ2Wsi+KKYPf4s9xCXR66+dBhxBQGluPtw32pBESNNlQx44eJMwevkGs3h1JqokhYaclceUFkmbobxw+1wfYTDlsAJTjfjxG0TIBF4YR9EseY3RurIFOhdmvF3FkGucrewpwOdDEPhJxqE5jGYKppyQQjsHncq1r/E9fEErxnb/N13nf47Z9H6vM7qKnI7sFQgM5BVUS3vTgpws8WPoYZ7WPUvSh2GSGMPPIdAakMGrtl5psnubg783Jp8+jtaYIT7jK9Abg= 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)(366016)(1800799024)(23010399003)(376014)(52116014)(5113699003)(22082099003)(18002099003)(38350700014)(10067099003)(261009223027099003)(261022105027099003)(261021121427099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RHh1ME9yd2JGeFEwY3JyK3drNDZoY1p5VnlROU56SHAwYk02TC9LQzRwRlBz?= =?utf-8?B?SXlWSGdWelhJOU4rd25hQ0U3K0p1M2c4TDFwL3JlZ2JQbHZYa1FWc3REWEJi?= =?utf-8?B?dGlTUE55VUNIbG1KcFZFM2d4VFhyOVNhQmk1QzBNN2JJM0dIZEdnSUplTmx6?= =?utf-8?B?dmIxbnJSQUNYUXdNa2JaNVZDdk5WZzhqL1pRRzRVdmhMVEl0dUsvS3V0azc5?= =?utf-8?B?dC90d2hOTVp3Y0xDZHNsNVhVWUgvM1lhZmxZM2pvYXlzYjhScTNOUUJramhw?= =?utf-8?B?djJkTHluOTVSTk9zalg0TWpzZExOWUROTnJPNkdsM29sV2NEV0tkOWlIaDdw?= =?utf-8?B?dW0wcEJCbVIvOHpsTjFtd1g2L2U0RXQ4QUIrcjRuS1o3c0pMTklJNzI5MGJq?= =?utf-8?B?TDFwbkRaUk40WnVCMW9FVEVqRmJKcTIzSDdPcjlqL0ZqWHBhcGxaM0JCQnVC?= =?utf-8?B?R01XZ0FlbVZtYlhZVW5iY1JBdkk3WVRjZDI2ekJpTWF1U1BTM0FISTMwZDZM?= =?utf-8?B?VlIxVkNVd1crUFRYZkVhREpWeXVJMVlaTjJ5NkJNYit2cVg4VFp2RG5JYUJa?= =?utf-8?B?Vm0vdjRjMWhBTmFOVUJETm5KdVJuc1pXOGU1a1VLc004V2FRSmlOTHBSK3Bq?= =?utf-8?B?VUFKRzE3RVRJU0NqNENucmFWeDVaWkxweWpHZG1XeS83VUs2WElvaDcySkVl?= =?utf-8?B?YUdkcHJoM0F2WmJrUHdQRWJ3R1BxNFl2eWhLelN6VlJQZytOMnNnaFdJVUJ0?= =?utf-8?B?dWRyUFlGM094Rk8xNkxJcGFSNGZVOUozaWxzbkVRUVhyQlg5MG1Ua1FpMC95?= =?utf-8?B?ZE1kc0F5a003QjYzekFCYWllc0NUZUtORnpicXVGa3hJYUdJT0RhWFhySUdY?= =?utf-8?B?UTFkMnF5QWxsQTFQUFUzZ081ZXQ5RDdRN054SFkwZGp4TkRXYjlrV3VJODVp?= =?utf-8?B?U2ZpOW1IbHB3Z1B3K1o3UGJTY1lsZlhkQTNVKzhGYUZzSE91Y1RibnViNHc0?= =?utf-8?B?bkcvYXgyUkd6NU1NYWlqa09xcHBVd3UvT2FHUkUvcWs1RldwMmZEc01wbElO?= =?utf-8?B?bm5pdzVyVWFIRTNYdlV5NUgzbEtsVDk1cm44OEFseGx0SGNkSFNsbHkxQklN?= =?utf-8?B?d3hTVUhxTk9ORmxXK3NyRmhJRXY1L0VmUm1sT25MNDNLWGlrYmJ6dWl1N2Jv?= =?utf-8?B?bDd6c2R1U002NU92TWhPQ0k1ZG5qN0tZS1l5ZVJlNCs2ZFRxUVpaWklPL3lj?= =?utf-8?B?ZnQwYXRUWDJXSmg5eGkwdjNSRGVhMm4xY0lTS0l3MFA5NWdYVmE5U0c5Nmls?= =?utf-8?B?R2JoK2EwazlpSFNXY2FSNmZaVkp1OUdMNFpOamREYXQyZ0docTlXU0hWMXJN?= =?utf-8?B?WkYvck9LY0Z4VHU1Y3ZuWU0wMUkvRzZhekNheVI1ZWJyL0JjbDNnblpBRDZy?= =?utf-8?B?RU81WS9uMVFCbjJHODJZbCs3c0xrMDZncTV4MHI5Ykk1eHcrTHB5THhGVnVQ?= =?utf-8?B?SzBWV3UwSHVxNkFPNzMxS2htU0pGa3NCSVRUYTJ2WHh3T2RHNEZ0V3pkQWpr?= =?utf-8?B?a0Q1cWw3akZJL0p5eHZKN2ZsdDFBQ21waVg2eFFwNmp0SmJnWTQrQnlkTTVN?= =?utf-8?B?VVpVMHV4NHh6eGZxSEl2RFlhVHpTYy9vMFVGSHNXdW5BSTdrOUF5ZDdsTmx1?= =?utf-8?B?bXJic0RjWEE4QzZ0QW9PeXAwTnE0REhJRWg5Z2VxVU1KcU5uR2h1eUFUZkJr?= =?utf-8?B?WThnZytQY0hOdDF0c0J1dGdHcEw5cm1RTTNUOWplU0NyRUJrVjlDaGlLcUtx?= =?utf-8?B?dnhZNlYrUms5UWtCV25aTEd1K2N4MzNIRVcxWkVPeG9wSFREYnM4TVlsaDdp?= =?utf-8?B?UFNqMkVkajBTdmgvVm9FMFdKYVdtU3UxeFVkc0tnUkhGbXJKZWoxOS92eTVL?= =?utf-8?B?d2ZyQ0ZpeVJDRGFsZ2x4T1JjVngyRVhBT3JTejVHVGg0ejhuVHJpbmYvUmM3?= =?utf-8?B?Q0VtMXdyeThtdXQwYjRLR1ZVMk8rNVhBK1ZmQjhaR2s2d25UQmNuQUk5S1kw?= =?utf-8?B?b2dJR2ZWWmdSbytvRFNtenltZWIwWVRYcGNpNTZwcmtqOGxCN3YyYUgzRnJY?= =?utf-8?B?TTg0ZGorNlJubDdyWm5RaVBUS0dQZFpSNmFaTzVzeHA1MmI0VFBEOUNIRThD?= =?utf-8?B?QnJ6ZWNWRm9CR3cvNEwxQ29qd0luZTRtVFdaSzN3UXVjTmJXaDNQZ3k4ODhX?= =?utf-8?B?Sjc3YjkzS3llSEVzZmtoSmJEb1JPRXJBUEVBVGNHMXYrSGJrOEFyY1NMQUpF?= =?utf-8?B?MlBJZXAwQVUrMENRR2ZGc1A2aWE5bEhEcVhvM0MvRXk0LzNvelRNTFdvYWpN?= =?utf-8?Q?baEr1wZ2ZPX+GibE=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2d96e756-867d-49e6-bb2d-08df312656e2 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Oct 2026 16:54:44.8218 (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: K56XxNKBi3/45aJw2tU9noMdIRESIO8Bkl6ZDi7/6lnH2LqUItOW5G0Y5cYuG2cEzDi2OqI76V9vNaHt6ocI3sAIw57XuxUZ3WU0BneAVBE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU4PR08MB11747 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