From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021103.outbound.protection.outlook.com [52.101.70.103]) by lore.virtuozzo.com (Postfix) with ESMTPS id 66A5080170 for ; Tue, 8 Sep 2026 01:07:56 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mfw2psQCdvatjT9qgQiz2uCsBRqSWrITpFQLKgN6FOJKvYfYMoVFGXO6HZVb1OsfoOWv9GZ1eiagl9GR447pU+sSSkBo59blNlESzKUY2aGrj8A4oIDT6dAxl8c8jtq5lmM/Wsoy3ac0nDDf25SuJO7v0/acDmu3SbHzkjFmEUZ9zazEoSFA3ipVctR0JR8sxrgn6aZ8ccSvJzvW8k+XmR5LVTmTo3naU9Id9UJb55BttZsZNSohSOVo2Og//1iUGllVPnwI2TL4ysuHkaw86sg8Qy9ZYOuISH0LjN8K30eBAKd7anYGLbDzJxG3x/Za0/vCOPEnd/XJfuf7SiKfrg== 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=iAxl4ncvgqmomlq1/SW7S3b3hVtfq3RMRWAUOGCrWR0=; b=vp/eQSyHSgrPt5aheR5nG2Z4kJmNw/x3IN4WvSJ2iM++ztTjN01ntRYt7A5MzeloDky3DfNZlw0+9XMxds3Sk84jkUg6JrIjfTrwc0yW0FMC6f8cX1yJcXKQjkwPA51l3Z9eQ1yxe8JZb0DDfD+SoFFjYh8WyYMk2QeqpMfPxg9hzvuQ4yh7azWI3dG8P1mf4HvZEEXAOLVsXa4JJ2Blumt8cAwhXopRTs4jay8iVMOuIoo1pxL0vpyNpUQU4ywRxPoKzCXGWv8aDQXkvcAiqA5eBht05fh6u0DfEhkuK0ykrnLmI/6DsSjX3a/pgMKzBpwfLLuWu4syDah1xZOepg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 130.117.225.111) smtp.rcpttodomain=virtuozzo.com smtp.mailfrom=virtuozzo.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=virtuozzo.com; dkim=pass (signature was verified) header.d=virtuozzo.com; arc=none (0) 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=iAxl4ncvgqmomlq1/SW7S3b3hVtfq3RMRWAUOGCrWR0=; b=ycGe4OuX9z38IDVv4FCTIIyPvEapDFF5nNaYy18q+j50EbQ7umV6XgR0u/ZpRiSLdC2b6u5JS1q3l1WvzoqtZJoWC77x+a+4SweHm+85L6WDBycodo9ajKNreqP9sfvykDgH02Vv/uApYgdIzDjT+fP4WJIoQabcQXrOsQzotlq2WpA+CYiATIbIVZS/wqdk2k77ZrZBrKVHUlQLM5HuPbWz6vlhAZhyIM/EB0uxy4g70tDN2DMPzE7vbg/hQ1XUQCiuI2KKXdqhHAOdUQyo1Z/jsFg2p+gJQJa8PMnk9ljKl5zOsMY99joLqa7fLWaCloKaCp10mnfZEyRzXBecBQ== Received: from DU7P250CA0021.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:54f::10) by GV1PR08MB10750.eurprd08.prod.outlook.com (2603:10a6:150:165::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.6; Tue, 8 Sep 2026 01:07:51 +0000 Received: from DU2PEPF00028D0E.eurprd03.prod.outlook.com (2603:10a6:10:54f:cafe::d) by DU7P250CA0021.outlook.office365.com (2603:10a6:10:54f::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.15 via Frontend Transport; Tue, 8 Sep 2026 01:07:50 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 130.117.225.111) smtp.mailfrom=virtuozzo.com; dkim=pass (signature was verified) header.d=virtuozzo.com;dmarc=pass action=none header.from=virtuozzo.com; Received-SPF: Pass (protection.outlook.com: domain of virtuozzo.com designates 130.117.225.111 as permitted sender) receiver=protection.outlook.com; client-ip=130.117.225.111; helo=relay.virtuozzo.com; pr=C Received: from relay.virtuozzo.com (130.117.225.111) by DU2PEPF00028D0E.mail.protection.outlook.com (10.167.242.22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Tue, 8 Sep 2026 01:07:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=iAxl4ncvgqmomlq1/SW7S3b3hVtfq3RMRWAUOGCrWR0=; b=MVDCQtcJ1TRO fRLasayjKOpRbTVVccrgxB0VcEMDrTROASnwDXYN/1FJeV5oogHgq+c+V102Eo0IiiCNeho/p6dPd AVRfQ898vQCetV7WecXiph51wNQqBwITGN2aWD6yU3boPf5FvV29+rsFsI2Ugl6oI2Sf+CLfE3KlN dhi/qlc3KXodwOZZ8HyqYeV9nAISJEgVnqe76qAKDnJRjuMCRfT8YQvprFE/SbLXSZiMhbFyWyFO/ qpZ2Gaj36bwO6EFWIn9+Phe3EecSmWH2EKMoffQav4E0OxJ5jjl92eTQ7qqhOh/pmsjlhxSg3vHIe +dCypNBgajMjJvprgDiq1A==; Received: from [130.117.225.5] (helo=vz9-demens-1.aci.vzint.dev) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1x3kGt-00DU8a-10; Tue, 08 Sep 2026 03:07:39 +0200 From: Andrey Zhadchenko To: svt-core@virtuozzo.com Cc: den@openvz.org, andrey.drobyshev@virtuozzo.com Subject: [QEMU HCI-8.0 PATCH v3 5/5] vhost-blk: preserve the uevent socket across cpr-exec Date: Tue, 8 Sep 2026 04:04:55 +0300 Message-ID: <20260908010455.249679-6-andrey.zhadchenko@virtuozzo.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260908010455.249679-1-andrey.zhadchenko@virtuozzo.com> References: <20260908010455.249679-1-andrey.zhadchenko@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PEPF00028D0E:EE_|GV1PR08MB10750:EE_ X-MS-Office365-Filtering-Correlation-Id: 5e7f020f-728d-4bc5-f77e-08df0d4599b4 List-Id: svt-core@virtuozzo.com X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr 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|376014|36860700016|1800799024|23010399003|82310400026|5113699003|57112099003|10067099003|22082099003|18002099003|13003099007; X-Microsoft-Antispam-Message-Info: HH3s3cr3lmedhm/bB+G56FAywHPWUHUp0nov8ubogUfi94AEqHEAU/6PvOApP63NPI24C7vyI10jll7n2pv6XrSfG1yEDBWrqHsSt5wKpVs1eyNQwkjTihZSMhBKlhS3nja3G5rhUEy4a5LzAeJ/JJ0v0iRJsKxD84LairILHAWETUDpoDvgGilY4D0JeJ8K2i+7Gd42xt3kUn6+6B2QThwo+WYLwUMaOQamvZRQ6UsIlp8YDMU1n0dv/Fhm8QqK6+b/xBbm9YWqsnJeDBrhaDl2RQK3x2ZGUp1snaPiHRUNgqYuWnaOv252o2uFBgovOnXWf5R9tm0oqI05YdWVWIglXQHE3ix1WR6i1xWUaNRnYxoVJZh9YeTtTskHOEE/Y/kMyi5qUKEtEQOQPVKwGXLeykizDVZRoz5wY/XCLi1J3Xd01I4o/ojSfpjDmhuZd50+rl5kRM4oUFxz/OtczMS5ToO8mEJE+a95rkX3Oia/oDuwQSwYAS+xnZRoXz9vwRDFelvr94PKaijNQzKh3wySeej1dklx8d0UbpZeimGFr3NQvQvfE+QNLAYqeeRKcd2KGJHqlJfJ4X4J48KL9nz5k7Omjuc0AGBssSe9DtlOuOTQLGcz+w1MPNnHV8xHHhRljOv0vu1a4wG2iWnUKsiwPdNU4yQl38vPnDn6Bsbg8Xsg4cMw8jDSCUgZicnfPF5yhwe5MrBj0jCJl64hRnWjS352BMvJQ0ssC28tBgRYIwKE2q8KYCe4T+NodbKEfh8ekvD5eenHQYmki2Nc+N1x9zTBUxmrR7q+BuKJTD5bSeO+Tuva00AAvTn6V0EJrBXJX14Zha4s0TpwGjbYlw8+IhMndoLSZLs6t4aWfm1dDaqVU5p8WgvIrAKOoBt+cc5hnFw9QbR8Bt2QwjT0ySUvAvzLk761xNTPVJaPjSE= X-Forefront-Antispam-Report: CIP:130.117.225.111;CTRY:CH;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:relay.virtuozzo.com;PTR:relay.virtuozzo.com;CAT:NONE;SFS:(13230040)(376014)(36860700016)(1800799024)(23010399003)(82310400026)(5113699003)(57112099003)(10067099003)(22082099003)(18002099003)(13003099007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: SMpIJhITC1uAAZNaddq1l0v1pCGWtIpV79UXa1CZkFzP+YVow/Dmyh/+rnrZ5dECwlHbiYZ9gkXLnjzkBrTlVCGvTB5jxV3m/ZGs4SiJ35ab9gJ2J7uhxSx9QP8UC9tv23/eRp4B3spp4G+Iws7BfMeFSwJWmCOkhhADv3M/OXLxUWg9GlewoEwceyFF8dCaohE4ssa4Xj3eXMPWFhw7vjkujV/BVK6YpAma32knf+/77aFUqbs1faQMrpZOjMD3rxBJwu2R/OcyFPlCwg1MUd99xWW9JijoB3BPtBKi1aWWtXYU5IeM2U5pisMn6Epxi7HNSq5Pik+K8n+uE4/cLaKu57hLewb7hHTC39mNv14NBVGjp/EQ/WG37dHhhcglu+Ea83+N1USZBT1/FkJlqEmcLaG+cobHrL6uPs1rTu3cX2qZyGBLG5k+WZDQg3aq X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2026 01:07:49.2139 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5e7f020f-728d-4bc5-f77e-08df0d4599b4 X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0bc7f26d-0264-416e-a6fc-8352af79c58f;Ip=[130.117.225.111];Helo=[relay.virtuozzo.com] X-MS-Exchange-CrossTenant-AuthSource: DU2PEPF00028D0E.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB10750 qemu-update uses cpr-exec migration: QEMU re-execs itself in place. A plain monitor fdset descriptor like our uevent socket does not survive that (unlike the cpr_save_fd()'d tap/vhost fds), so without help the resized-device notifications would silently stop until the next full VM start. Preserve it the same way the other devices do: on cold boot cpr_save_fd() the socket under the "_ueventfd" key, and on the re-exec'd (incoming) side adopt it with cpr_find_fd() instead of reopening a command line fd that no longer resolves. The management layer passes a placeholder for the "ueventfd" property in that case. The restored socket is validated just like a cold-boot one. Since a unique device ID is mandatory for FD preservation, block CPR migration modes when the proxy has no ID, as other devices do. Drop the saved descriptor on teardown so it does not outlive the device. https://virtuozzo.atlassian.net/browse/VSTOR-143437 Signed-off-by: Andrey Zhadchenko --- v2: - old one dropped, setup moved to libvirt - added new patch to support uevent socket cpr v3: - use the proxy ID for the CPR fd name and block CPR without an ID - validate restored sockets and improve failure cleanup hw/block/vhost-blk.c | 77 +++++++++++++++++++++++++++++++---- include/hw/virtio/vhost-blk.h | 1 + 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c index a69bdcb551..fa951da47a 100644 --- a/hw/block/vhost-blk.c +++ b/hw/block/vhost-blk.c @@ -29,6 +29,8 @@ #include #include #include +#include "migration/blocker.h" +#include "migration/cpr.h" #include "system/runstate.h" static int vhost_blk_start(VirtIODevice *vdev) @@ -248,12 +250,27 @@ static void vhost_blk_resize_bh(void *opaque) } } +static char *vhost_blk_cpr_name(VHostBlk *s) +{ + DeviceState *proxy = qdev_get_parent_bus(DEVICE(s))->parent; + + return proxy->id ? g_strdup_printf("%s_ueventfd", proxy->id) : NULL; +} + static void vhost_blk_uevent_detach(VHostBlk *s) { + g_autofree char *cpr_name = NULL; + + migrate_del_blocker(&s->migration_blocker); + if (s->uevent_fd < 0) { return; } + cpr_name = vhost_blk_cpr_name(s); + if (cpr_name) { + cpr_delete_fd(cpr_name, 0); + } qemu_set_fd_handler(s->uevent_fd, NULL, NULL, NULL); qemu_bh_delete(s->resize_bh); s->resize_bh = NULL; @@ -395,25 +412,71 @@ static bool vhost_blk_uevent_check(int fd, const char *src, Error **errp) static bool vhost_blk_uevent_attach(VHostBlk *s, Error **errp) { + g_autofree char *cpr_name = NULL; + if (!s->conf.ueventfd) { return true; } - s->uevent_fd = monitor_fd_param(monitor_cur(), s->conf.ueventfd, errp); - if (s->uevent_fd < 0) { - error_prepend(errp, "vhost-blk: unable to obtain uevent socket: "); - return false; + cpr_name = vhost_blk_cpr_name(s); + + /* + * A unique ID is mandatory for preserving the uevent socket across + * CPR migration, so block CPR modes when it is absent. + */ + if (!cpr_name) { + error_setg(&s->migration_blocker, + "vhost-blk: device ID is required for CPR migration"); + if (migrate_add_blocker_modes(&s->migration_blocker, errp, + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1) < 0) { + return false; + } + } + + if (cpr_is_incoming()) { + if (!cpr_name) { + error_setg(errp, + "vhost-blk: device ID is required for CPR migration"); + goto fail; + } + s->uevent_fd = cpr_find_fd(cpr_name, 0); + if (s->uevent_fd < 0) { + error_setg(errp, + "vhost-blk: no preserved uevent socket to restore"); + goto fail; + } + } else { + s->uevent_fd = monitor_fd_param(monitor_cur(), s->conf.ueventfd, errp); + if (s->uevent_fd < 0) { + error_prepend(errp, "vhost-blk: unable to obtain uevent socket: "); + goto fail; + } } if (!vhost_blk_uevent_check(s->uevent_fd, s->conf.ueventfd, errp)) { - qemu_close(s->uevent_fd); - s->uevent_fd = -1; - return false; + goto fail; + } + + if (cpr_name && !cpr_is_incoming()) { + /* Preserve the socket across a future cpr-exec qemu-update. */ + cpr_save_fd(cpr_name, 0, s->uevent_fd); } s->resize_bh = qemu_bh_new(vhost_blk_resize_bh, s); qemu_set_fd_handler(s->uevent_fd, vhost_blk_uevent_read, NULL, s); return true; + +fail: + if (s->uevent_fd >= 0) { + if (cpr_name && cpr_is_incoming()) { + cpr_delete_fd(cpr_name, 0); + } + qemu_close(s->uevent_fd); + s->uevent_fd = -1; + } + migrate_del_blocker(&s->migration_blocker); + return false; } static bool vhost_blk_open_backend(VHostBlk *s, Error **errp) diff --git a/include/hw/virtio/vhost-blk.h b/include/hw/virtio/vhost-blk.h index e3ad92bc6e..2d3f7a30f0 100644 --- a/include/hw/virtio/vhost-blk.h +++ b/include/hw/virtio/vhost-blk.h @@ -47,6 +47,7 @@ typedef struct VHostBlk { uint64_t length; uint64_t backend_rdev; QEMUBH *resize_bh; + Error *migration_blocker; /* set when the device has no ID */ } VHostBlk; #endif -- 2.43.5