From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11020109.outbound.protection.outlook.com [52.101.84.109]) by lore.virtuozzo.com (Postfix) with ESMTPS id 25EFC80182 for ; Tue, 8 Sep 2026 11:11:49 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KqrPJ2NheJKApZSl+aWi8zvoeRaoZdciQY1nrsER8aIBmYsiAQO3fqd1904Xdli/9cv19UVuix9DGRowemdLz0gsG7VW6wK+F7VFhVaQU4FKfS1gc753fh7XH8ggKcMuv8L7rl5QtbWDwMAs7DdVW4lhGh3gRG9Nccov0GlUATv9Qd6LcqqJ5bl+Jr14hsLxKC1ZWo5fURL7FhNTuon0YFNmqehKi0etFAnMDZtO30z/6ZSgDBVyht7RTrr6QVNNE0qvETN2AuLO2t652nODINA40sNhJPg2S9H1ohg4tKZaUEKWM5fPjgrsQ5ikc0sRG8n07Afc/29ak2+FVivHqw== 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=W0num3JfN3fmZtV7i+yq3flBsX+AQmKHZMhRYCJewhk=; b=JBCKMMuQHlKDpDkDTQVZ/JLAjpLlgmBV4vuBXMacfTWfmMbve0l0JHm6ju/Yg0nEruJ+WAIRDsimN7E8qLsWlUo14CkCrTcaVJR7dCOuyzEtnxKNqfxAPXauxDzekDPy4vghhjyF2uN1FtwXC88lLLtLEYDlWC2JOLjZ00/+zmd/AU9gRxhz30nz9SFYi/Pra+kLZicPdBxLL1rbNfX4n3RpMyl943tN6kCzL2Bn+fyoWs1oLsPsBRVu3XwR5u0/Y03oucbkPtzqpxshzW1thPVzaYjLYHMORVxQ7LqFxY+84NNwsUD5zs1UwA8MX3reEJDhILWfOiH2FpTZ048nTw== 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=W0num3JfN3fmZtV7i+yq3flBsX+AQmKHZMhRYCJewhk=; b=JXWxliqWh0AJEcfBHbxV4+zu7rdHeEzSYKTX2f7j1zFVptHMwndYtFqJC74wdXKpB1dVYBR4ui5hLe4KeiYVVdyq6f2prQCdGcYhNCMItja+Al6f7hB1UCdmjwRLmeQlshBigQ+MrFfSl+z7YDTSA2drrX7Xq+hE/NNK4A+01PMxnv2bFNw6Lx5waQBaVSiGA/76ALOx3jTV92VASIz507+xteB2XDA2A9EcIGLtZXXYIEYiv3JLFFVRHpuaJjW9uSGTLxdrhZTsVIxi+5wPAcqNc75aZbEOQSVnrscKMeBlGMR2hiYzernhMartuTPZAmgKVITYhrgF1hNdNsG+TA== Authentication-Results: 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 AM8PR08MB5777.eurprd08.prod.outlook.com (2603:10a6:20b:1c5::15) 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 11:11:47 +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.0406.005; Tue, 8 Sep 2026 11:11:47 +0000 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: Re: [QEMU HCI-8.0 PATCH v3 5/5] vhost-blk: preserve the uevent socket across cpr-exec From: Andrey Drobyshev To: Andrey Zhadchenko Cc: svt-core@virtuozzo.com, den@openvz.org, andrey.drobyshev@virtuozzo.com In-Reply-To: <20260908010455.249679-6-andrey.zhadchenko@virtuozzo.com> References: <20260908010455.249679-1-andrey.zhadchenko@virtuozzo.com> <20260908010455.249679-6-andrey.zhadchenko@virtuozzo.com> Date: Tue, 08 Sep 2026 14:11:39 +0300 Message-Id: <178886589979.877345.13752100828965601105.b4-review@b4> X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIVP296CA0065.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:35a::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_|AM8PR08MB5777:EE_ X-MS-Office365-Filtering-Correlation-Id: 84085bab-843f-42c9-2afc-08df0d99f873 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|1800799024|23010399003|366016|376014|52116014|10067099003|56012099006|4143699003|5113699003|18002099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: J1r4bJ0PyEZbqTxMhIE2WsDC7i2wWLfodELfPKi+sHkKguHS5Bmo2iIyLB+aZA8tKAQcdKeJnxw5UFacDeSLLHwtpTUMKLcm+HPLmd9RUUL6k2YkGvEm7snNpGAWrq9zZGIC6p0Y7N4Pd7JknQNGozC+8NLN5aRVj+r5v/69Kc0ckE9VhLuGeUTcvl+Yx/I6ime8RJXa36agI+lyFExUJ9lzNc+WaI1bnN2oWEYDwukqN9AWqAqALygpDdJ8nMZTCGCOIhUK41VvHFOgk3rTMg7btKB2/OcFPOnfqKSrBdqVXJ9dRicQ0RQhF17NRfLcolCit3J/Sq30IzX0wS9eJjqmOYtqKMCQhJWXckAmJATW5xRqY+U2/60di30OSqaGi97O4BP4cPPUBigiV2gJFYfNkcaKeaudeg2hm2tABnElLFHTJB8mUx46vjsfo3T0H68cwnSG8FT7mOzVk/hD26OeSjSYZO89Is82ki0sWUo1vkVdIk372ss7ZxGk9TcrxP32gklzumK7k+SY0SVZTNpvuqls2KMKD7sPnZMNEAbr3UU4zIgQk3Bx8pFVWh78QICEBUuKSK7Rq8WoteHb91LU1NesjFqS3zvca6lqr0mNrwYjBpeQ5KAUBt1Gq/++X5wG4CnDNBO+MjRQPgLZVkYBLIBas0Q0Ni2xUtb0BUgFiccWo9M1bAG/88XTU7YbW9MPaE60Q97YzLPho10FD22EKNroGfsJaiq2YRWA3gI= 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)(1800799024)(23010399003)(366016)(376014)(52116014)(10067099003)(56012099006)(4143699003)(5113699003)(18002099003)(22082099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?aXMyUXVmS3hZRlAxeFIwczMxMythbmNEZzM2Y2I5U1NOQmxhNHNPcHNDU3pz?= =?utf-8?B?VUR6MHVWcXVqRnQrdU5wUVlPVnhsbHJ5VGVqMHZMcUNTdXdFY3BJN3JiQi84?= =?utf-8?B?OWJDeVlZb2RYYVZrZTVvNmFVcENWUXNsOG16akphOVk3WVNHRUxYT010b3hz?= =?utf-8?B?U3VVbHdpLy84VU1CZE5NSHZFVHlKby9NOEFyTkxreXpLQ1VObE9mZFdvSnc2?= =?utf-8?B?aDE3Z24xZEc0VllxVlFUcWFkcnR3M3daUnhPL3BlRFB3SjdsN3V4ZG1YcXNt?= =?utf-8?B?NXlzdC9YQ0hzU2VCbStTanhXRVRySlpTd0pjb0Z1NEtpS1k5eGhzZ24wdnd5?= =?utf-8?B?TmZiNmJOZHN4TFI0ZHdTdlNrRkl5OXh3L2E0aGQwb0ZBdGxack9pcDVmcld5?= =?utf-8?B?TnN6b3RsSmcrSXJVUTVMRzhSSmRrZ0hIYURwamUrSFpzZ0MxVjhSRWxxcG0v?= =?utf-8?B?UG54OFVJbW1peHBCdHprQmFuNFp4dDBXc0wvTC9zbDhUTlhRMEVib2FCY0NF?= =?utf-8?B?a1Q2VHNWaDgwWGpmdHROTHZXcTJJSlY1bC9XWXFpMXpLdUZ4djFQcmFVdnpG?= =?utf-8?B?UmRydG8xTEJ6QjdzeklMWUNKWTZ5di9GbC9aOG1JL251UkRabWhkVHVlY0xW?= =?utf-8?B?WDF2TzhvdVFlZmVXWFVST2o2Zkx0S0ErcUhSYTdJUFdIMVVHSWJsc1BaRmFW?= =?utf-8?B?WWZQamN2NjhLY0FMbHdCTXdFT1dVSEkwVGJ3U3ExdzhDYUxqK1BuY3pPemxx?= =?utf-8?B?b0lZTUJBOTFjdmpyRnUrV0RXTHdLN2VJKzQ4ZXdGS0ROQy80OFRWUHlYNVdl?= =?utf-8?B?NVlBV2dVQnlFUzBuN3AzcjBtYzJ2bkZpYStCdmVFYWdWODlwSGgzaHZ0dnNC?= =?utf-8?B?NkNuZzBjQkhjZXUxTGpFcm1DcXNENlV0UE9qQklqZEgyTE4vY2lDTHlpVnVX?= =?utf-8?B?bjdQQW11cHF6S2s0T3JtcmRWU0VCdVV6ZlhLRnJmSUpvZG5yUUNFWk1WOTA1?= =?utf-8?B?TWZpb0JieGpYWlM3WWpqZlB3ZGwvckJZeGZkZEZRWDB6WjYzVFJQREhSWmhz?= =?utf-8?B?OVV5VW9yMXlCMW1sc2U2YWM1UURIV1lxVDdWTDVWR2xNeDNtemhBWUdSYlcx?= =?utf-8?B?VHRRSE1lNkpFYVg3UEFSalFQRUh2Z3RXWEhQY2RuRmY5U2Jldk1SMTlnSWV1?= =?utf-8?B?RHRhZ21oa2FmdGs1VncvZUtPUWo1dFlmQml3VS9Yd0ZjOUdqSFNONGI2RlVL?= =?utf-8?B?OWV4UlYvZldUS2crWTkvS1o0aXUzb0ZtVE95S2VHZXl0OXpaYXJnMlVNaG5Z?= =?utf-8?B?S1NPbWxENlE2V0J0OU44M3ppNHhYVlFWR3UrUGN6NmVWZjZxKzFjVXBjRTUv?= =?utf-8?B?dnRvbGt4VTErRVdoUXhnQlNmNWNKeTQyWUdnRmJtcGFXeGRHaXBXenpmRktt?= =?utf-8?B?NExqSUx2TUFXcXhxUlB4dkZGbXlNaDNoWVkxT2p5MjF5NFJucENFTWllSTFv?= =?utf-8?B?R2tQUWFocHR2MzNXT0ZMRE5YTGxhZkM3ZS9pTXN1VTV5aTVBT0Vpa0VUd2h2?= =?utf-8?B?ek05VjR2VnZXUVYwazdsYm5qV2M3WUQ1N2lRMER4OXAxZHJFWkNWeXUyNTdX?= =?utf-8?B?bnV6K1IyMXJEY2tuWnFFR1pwaVcwRGd6T0tOaUZlNDc2dmhFcGFYbTJtQmVC?= =?utf-8?B?d2lTUFQ4c3lWaTBjdHFlZ2Y5MFBwZURIRjBTQW12eWhubmgxVkl6SDltdWJi?= =?utf-8?B?YkJQOCttK3hjVDgwdjNyRm44R01pcXZuTHVHMmNTSjdQZ3k5dlVkd0JVUzc2?= =?utf-8?B?N0p1MXRKd3RrcEFYTkZaNnJhcWhWdVRZT2ZFOVh2Qk5wVE9vZVRERFJUR1kr?= =?utf-8?B?UTg0c1BMY0tEVEdxVk1rRUkrWnFwNUExaWRQb3dXTEZXQmNxcFkzQVdjRjBp?= =?utf-8?B?UU45dFJOeE5rYitxRlJRM1cwM2VPK00xaGh5cmtFWGpwNmNmOTNidTFxMW5H?= =?utf-8?B?SXlBOE5NZnFTTFB6cTlzRi9lSTlJNGpNaUljZlhFQUJ4Sk1tbDkxckFuWXZN?= =?utf-8?B?cUlNU01pR250R3lUT2xQNmtsS2pTVElvS3Q4MzdVV1c3Uyt6WmhpNWdoblVr?= =?utf-8?B?Ty9jVlltR05HeUwzVlB6dml5U043eW1TbjUyWGpmWERmcm1yRmUrb1AxNVhG?= =?utf-8?B?TWdFbTZ6Z0JodlF2c2xrZEhjb3l6R3Zocmhxa0VmcmxhVlU1ZzhwV3N1cFlD?= =?utf-8?B?QjFGdmI2dklvSEphdUhKMVhmUStpb2plazZVZzV3d2V4L3krNGlqeVhFV1Z1?= =?utf-8?B?ampiazZsaE81R01hb2F2NUdraWxXSUduM2M1SjArTHpRcWxDTlVCTWFPdDRO?= =?utf-8?Q?DBAn0M3x5C7M4vLg=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 84085bab-843f-42c9-2afc-08df0d99f873 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2026 11:11:46.0892 (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: TITxzSTDN5vFwGMyBSMsDjckDzz231gJZOeikgH/aQZgpmt45neyQ1nxtsDqKTzbIo9c4Vs0ZwHAuSoSzQr3v1zNVumecGXIwWQyW9KeFyc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB5777 > 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 > > diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c > index a69bdcb551f..fa951da47a6 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; > } On CPR target, if libvirt (mistakenly) skips ueventfd param in cmdline, we return 'true' here, socket remains open, and there's no resize detection. I'd prefer spitting an error loud and clear in such a case. > > - 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)) { Nit: on CPR target, s->conf.ueventfd is likely to be a placeholder string. > - 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); On cpr_is_incoming() && !cpr_name, we're gonna add blocker, goto fail, then delete blocker. Redundant. > + return false; > } Consider the following overall shape (designed by Claude, so please recheck): static bool vhost_blk_uevent_attach(VHostBlk *s, Error **errp) { g_autofree char *cpr_name = vhost_blk_cpr_name(s); bool incoming = cpr_is_incoming(); int saved_fd = -1; if (incoming && cpr_name) { saved_fd = cpr_find_fd(cpr_name, 0); } if (!s->conf.ueventfd) { if (saved_fd >= 0) { error_setg(errp, "vhost-blk: a preserved uevent socket exists " "but the ueventfd property is not set"); return false; } return true; } if (incoming) { if (saved_fd < 0) { error_setg(errp, "vhost-blk: no preserved uevent socket to " "restore%s", cpr_name ? "" : " (device has no ID)"); return false; } s->uevent_fd = saved_fd; } 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: "); return false; } } if (!vhost_blk_uevent_check(s->uevent_fd, incoming ? cpr_name : s->conf.ueventfd, errp)) { goto fail; } if (!incoming) { if (cpr_name) { /* Preserve the socket across a future CPR migration. */ cpr_save_fd(cpr_name, 0, s->uevent_fd); } else { 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) { goto fail; } } } 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 (incoming) { cpr_delete_fd(cpr_name, 0); } qemu_close(s->uevent_fd); s->uevent_fd = -1; return false; } Andrey -- Andrey Drobyshev