From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11023129.outbound.protection.outlook.com [40.107.159.129]) by lore.virtuozzo.com (Postfix) with ESMTPS id 7AA8F80170 for ; Tue, 8 Sep 2026 12:55:17 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yMrKZYAvpxHls5FfIJ2MQc4/0SA2txQtcLnng9pO6d5qE9UItjdyl9XstH0YTz9uwpaABgaEP6u413cStWEZ139g7/z8b00G/yI0BARGvm6s8fvez4nF4OTBLWbx4PuZq3rxulFUPyDBfYFiUaWUNbxQTOmCBrNAhNfYSz4/eW2BsPgjjKu6ZIXFEKrAISdvUw18WRdhSuWQ/6fuDk8PndYN99Vo7MmT5jlAxxUfgHjBFGwoKkdZZ8pzdhw2GvT6HAKKJuugl8vDcQutSFMQSc54LrYr8r+XQIdafjsUPCYbuDNbs7Q198hzYHj24Xr0XhQHJ6QDIFYHyHjSJXqe/Q== 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=odnQtztGyQFNkEsxh/sHnuJSmiPHXaUeyPv+8OOS4Do=; b=msEFBBQV4Z5BkL7JQZ35QXpfoms7uhEMCKXV6H0a0LCfmaVYutN4VLheeXkoyUlMTppbrNuswanwkiPiKBpXu2CD2ze+AIxd25R+5nVLNUcL0kGISAPUwwbaYnDXkyDdpyBXrjizABnhhS7mRS4/otPEyv6KCe2ti32MqDJqrBa6lT5xmEiCqTUH23f4lEdlDN2oTPWvkbxKJL5InSN0oAstLfvWJYPUFdySRM5fj15oC4oOMAKllLz4PYdmP18VoXQshllztzEywrEosR8HgdyMk0ZpONnjyoxPTbxvr418nq3hMCuOOzxOOjYav9eT588wnjuC9R4/orvZTc9cUg== 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=odnQtztGyQFNkEsxh/sHnuJSmiPHXaUeyPv+8OOS4Do=; b=vkdpyjzlDMwM3KXH+xSKt8Ovbh5XtvOulcNQxg5XBF2nMGuCXwxDsmmEoxGw25HF6EaHLrgqHDNyJIorlrxby/Qdq8PRW/sa6L9IR4fRIMo9JG9YUlRpgE4KcNjzWwfWVld35q6histWLxUndOpZBa1KfIqE3dT9dFvwJul8+WuI8sa5Lqtxs00hn+zqzACPdYLrUcwuoFhKMJizIQfZumNZEjE8tWDHehL/gV/+gRd5DUGCI9P9mOu1ns8VE+OIo87V7rjkdF8Gs2+HeE1dz+Xfd7LMhec0S420Lv69Yokp0sJRcs0150Q1jJd5YX2+7ebiPqmyFD6rn2im7cXjmw== Received: from DUZPR01CA0071.eurprd01.prod.exchangelabs.com (2603:10a6:10:3c2::16) by DB9PR08MB6460.eurprd08.prod.outlook.com (2603:10a6:10:254::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Tue, 8 Sep 2026 12:55:12 +0000 Received: from MAD0EPF000008B0.eurprd04.prod.outlook.com (2603:10a6:10:3c2:cafe::3e) by DUZPR01CA0071.outlook.office365.com (2603:10a6:10:3c2::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.6 via Frontend Transport; Tue, 8 Sep 2026 12:55:12 +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 MAD0EPF000008B0.mail.protection.outlook.com (10.167.241.132) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.5 via Frontend Transport; Tue, 8 Sep 2026 12:55:10 +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=odnQtztGyQFNkEsxh/sHnuJSmiPHXaUeyPv+8OOS4Do=; b=C/ZF+s8JDG/y EoXuhZRAzvjUse0L+Z4PB0U76tIDfc9HJbIfzr3EKBwW2URy40Gkgpxv5pFK2O9sKgvZ/3Lm30TXt +pqBCy4nFf2yjxlMsFJb8ufgNEgF92h1vqXRYdgDrDJvb3FNhcS73+K5Q6Qq3XYew8GWUk+u/bCg+ beFO29JXtj3M/197JtJtZnORxAe9Iro1Wndy0FPulCQjKmv69KQ3UCpRnRJqta/IgQ49Tu1w2KFdA YNZ+rWWhDvCCzO+INdb6wQ/SXrpfEQ5nl5PT/KIT5rBuhSyZZFGU9G2mEuc5/X7uq/iNocGhOmKBB dQSg7CgJRHEDE6v2iNf2YA==; 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 1x3vJP-009opv-1W; Tue, 08 Sep 2026 14:54:59 +0200 From: Andrey Zhadchenko To: svt-core@virtuozzo.com Cc: den@openvz.org, andrey.drobyshev@virtuozzo.com Subject: [QEMU HCI-8.0 PATCH v4 5/5] vhost-blk: preserve the uevent socket across cpr-exec Date: Tue, 8 Sep 2026 15:52:08 +0300 Message-ID: <20260908125208.278402-6-andrey.zhadchenko@virtuozzo.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260908125208.278402-1-andrey.zhadchenko@virtuozzo.com> References: <20260908125208.278402-1-andrey.zhadchenko@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MAD0EPF000008B0:EE_|DB9PR08MB6460:EE_ X-MS-Office365-Filtering-Correlation-Id: 1a84e5b9-d195-4001-b4ff-08df0da86a81 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|82310400026|23010399003|1800799024|36860700016|376014|10067099003|13003099007|5113699003|57112099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: y38L8JSukbLoMPHaFUz1bHXKoR8hS+eL/qIWY5nLhkUFXJP7mBuxpjDF+EY06QqvYzNYZ0q3GFEZzdAezKETAw1QN/NPsahiiZEHoLdaupFSNf+h/2zs/heCKSfp7QyWNrOSVZIOhfrELAipKS9TYAQmPj4EE/f1nUBeaoCLNFIObLZGXCG9gh8d2lXc1iPtRxPYc2ABPL1eEp1r01WIFuUDiArplj2cmJJ+w0lqpogxJSYntKVXPY+vgYwdvIl5N/UgnTHigLdIQZLA9w/cqVfh3LoGxZtD0PtG0O6tLUflXwJOo6+tT8rJZ4rt9Mw3a2dzrPpiSqNyXEcsNE7nLMckjjkQL4c2e1jLm00WnI8Ux82xauOSD+iq2APQgFv/3dmHowPYkzSnHD44KXAA6B0xpUmaw5Z1YD9Wg6nZbUvvnYCC85Euzpb3lwTg03Ik0hCDgJuCczPAKsrky6zgfEirkXQ6EGZgBnMIIBTTJxB5F92OgJUlUiWR36WYgJ5qv/M0+gpP/Bb0bHtZH+EED1w/q9zhukdNbRpkCyulTrq8+p3qcGv3+eXlLppDBCHA4aNSvI5IwufeRqL1PzFcKbUSlyoj/4WNNuaRMlYyO7O+FDEJl41IOYUyBgsdsHuBIMSLs2LtGHX5lmPu6btR2wsGVU7TVCB6mYGfsFaGx39AldME/9S/I/1tgQNMhc0iauQMyoxKtfa3hPRpsqwgwtzDZQCCqjGvGtWGSkzg/5Na0vn07a+hqdXEUKSRs2a8u1d+QEdclYQGEXPBsNDGIIpuRLjKxPjrPEAxkeo+IUxPPCHnNp3OO3hF1MvJd6Czr9rZgVJanjAVrQwREL3BlaBmtWp7DSHUmzWEM1CffLXtua3HuD/DqGG5upN5MXr2VzwqYRM361r/qYTYUAsQECSaWRjCawgxSL+A/PH6S64= 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)(82310400026)(23010399003)(1800799024)(36860700016)(376014)(10067099003)(13003099007)(5113699003)(57112099003)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 3imqQoOTYJR3ctbUMAHhwhSoGi9eWinJBwEhpXRuxvuob/DtUyjBWshpzO3P+Spc5U9MyjiE9j2q6UG5dtu0tP5ZEkCes2vD72Iq48K+pwJ6VfcdI55HgfDp0DpdtUodTe8yHURXJ2WfLylP2FcENEvmz5r5My5rCr0sZJP3xF4TM7qNdEwKGcdiLdPM0tspHRnI0TNK/QyMZXvNNq2NZqO1Ri0lpVRnnseaHylaJuRobovaIWF+UChlpvwvWFZo3UBXy2WZ/4sZPBUT8siFOrHP909GnfeLR6VS6opPmTVTu9x4+UJlEVm5UIxj4anOlHK5yxZSNH2SWZFF4XXmRdRQCaPUAC9MyAT6TgVm/lzdKJOmpm06KfrBNLOXGYZnUJRRrHTt07UXb3oKVC5WUX9tGqK230KsInkJSkBerrKwvYHkydk81u1CRn+k7m0w X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2026 12:55:10.2408 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1a84e5b9-d195-4001-b4ff-08df0da86a81 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: MAD0EPF000008B0.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB6460 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. Block CPR migration modes when the proxy has no ID or we disabled the socket after the error. 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 v4: - split cold-boot and restore socket setup paths - reject restored socket/property mismatches - block CPR after a permanent uevent receive error hw/block/vhost-blk.c | 107 +++++++++++++++++++++++++++++++++- include/hw/virtio/vhost-blk.h | 1 + 2 files changed, 105 insertions(+), 3 deletions(-) diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c index ef46c55665..abddff02c6 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) @@ -250,12 +252,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->cpr_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; @@ -263,6 +280,19 @@ static void vhost_blk_uevent_detach(VHostBlk *s) s->uevent_fd = -1; } +static void vhost_blk_block_cpr(VHostBlk *s) +{ + Error *local_err = NULL; + + error_setg(&s->cpr_blocker, + "vhost-blk: the uevent socket was detached after an error"); + if (migrate_add_blocker_modes(&s->cpr_blocker, &local_err, + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1) < 0) { + error_report_err(local_err); + } +} + /* * The uevent socket is created, bound and filtered by the management * layer and passed to us via the "ueventfd" property. @@ -300,6 +330,7 @@ static void vhost_blk_uevent_read(void *opaque) error_report("vhost-blk: detaching uevent after the error: %s", strerror(errno)); vhost_blk_uevent_detach(s); + vhost_blk_block_cpr(s); } return; } @@ -395,7 +426,41 @@ static bool vhost_blk_uevent_check(int fd, const char *src, Error **errp) return true; } -static bool vhost_blk_uevent_attach(VHostBlk *s, Error **errp) +static bool vhost_blk_uevent_restore(VHostBlk *s, const char *cpr_name, + Error **errp) +{ + int fd = -1; + + if (cpr_name) { + fd = cpr_find_fd(cpr_name, 0); + } + + if (!s->conf.ueventfd) { + if (fd >= 0) { + error_setg(errp, "vhost-blk: a preserved uevent socket exists " + "but the 'ueventfd' property is not configured"); + return false; + } + return true; + } + + if (fd < 0) { + error_setg(errp, "vhost-blk: no preserved uevent socket to restore"); + return false; + } + + if (!vhost_blk_uevent_check(fd, cpr_name, errp)) { + cpr_delete_fd(cpr_name, 0); + qemu_close(fd); + return false; + } + + s->uevent_fd = fd; + return true; +} + +static bool vhost_blk_uevent_open(VHostBlk *s, const char *cpr_name, + Error **errp) { int fd; @@ -403,18 +468,54 @@ static bool vhost_blk_uevent_attach(VHostBlk *s, Error **errp) return true; } + if (!cpr_name) { + error_setg(&s->cpr_blocker, + "vhost-blk: device ID is required for CPR migration"); + if (migrate_add_blocker_modes(&s->cpr_blocker, errp, + MIG_MODE_CPR_TRANSFER, + MIG_MODE_CPR_EXEC, -1) < 0) { + return false; + } + } + fd = monitor_fd_param(monitor_cur(), s->conf.ueventfd, errp); if (fd < 0) { error_prepend(errp, "vhost-blk: unable to obtain uevent socket: "); - return false; + goto fail; } if (!vhost_blk_uevent_check(fd, s->conf.ueventfd, errp)) { qemu_close(fd); - return false; + goto fail; + } + + if (cpr_name) { + cpr_save_fd(cpr_name, 0, fd); } s->uevent_fd = fd; + return true; + +fail: + migrate_del_blocker(&s->cpr_blocker); + return false; +} + +static bool vhost_blk_uevent_attach(VHostBlk *s, Error **errp) +{ + g_autofree char *cpr_name = vhost_blk_cpr_name(s); + bool ok; + + ok = cpr_is_incoming() ? vhost_blk_uevent_restore(s, cpr_name, errp) + : vhost_blk_uevent_open(s, cpr_name, errp); + if (!ok) { + return false; + } + + if (s->uevent_fd < 0) { + return true; + } + 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; diff --git a/include/hw/virtio/vhost-blk.h b/include/hw/virtio/vhost-blk.h index e3ad92bc6e..059f1ebc70 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 *cpr_blocker; } VHostBlk; #endif -- 2.43.5