From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11023102.outbound.protection.outlook.com [40.107.162.102]) by lore.virtuozzo.com (Postfix) with ESMTPS id 8D457802BE for ; Fri, 4 Sep 2026 19:04:57 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=phAfisv7LV5qKboGtlVDxjz2QCz2NnDuTSQtm+WGSTw3v0XvzaAdu+XfB8HTlWJRCp0YvM4qdDMx6QkVHQxMWh6oq2ZWQNOmxnIBc86qdRlsHBKAbsLTI1A5hljsc4rvvD/gds3m/fAq40sh8Q4Jx2BnNpSFLTb+43lsDGTZH33PJMvnKQ8InbuKaRB06wMwgj6RuEL2AksK6mc9BeYnoqHuaSp0I3wefjZF6s3nRrTAV2RjDQKTkgUwRsmtnVMMUvrH8JuC8L+Zo5F1rl3A6tM9VgNUmnKbiDSrlyPtUpBM7Y8LbKqGXGLq7db1uxi4yEy/j2Sk3qc5nhm7uwLbLw== 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=fStg72lUrZh7JY1uhGjKnOP+gyl/cG76dvykDJlJuuc=; b=fySjALAvvQK6KnNXBBSCG3UcSgKaQORUrCVlInW3S752pVfZraMKKv1FnYoWoVXDw5QxgoErAO114H2hoDXb7qoQnTkupoIl82q1GT7gF+eGH1WKOw5c1G4KKbA9gTOgaIxFrinIthM8PCQ0slurX0R9nP4gYlH3EgoPJYkcyjXCtO58ZkmD/x29aQW1/DNbZhTqOKTYuB3hdbSd1Rywdg7r2VZ2/M34S7LOGOGmbWPY8ZhxzdqZTVOBdwtJuWSI8HeVvNGV9BUp0PVHa2YLiied1P3+HEIQ58hCxeh+QzHJhtqncfTSXkbhqn6ocpFwecmO9rtkb1eZClJeYCSlcA== 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=fStg72lUrZh7JY1uhGjKnOP+gyl/cG76dvykDJlJuuc=; b=XVkJVwzfxs6Tos3y8JA+mVuXcYQ4cTLFBaszdmOLouSVuCk5ZO2b4MMYWeB0qSm/xpFBd7rfpIAn9uuXs/i1jmGdNFf812g+5U0YTVMkinGQ1diaPTQuGzc7HdLXp8fKFu2BdHJo9PJkccgcmnoM3Kw/mHRO1FmgsCUAF4Wk6uMfT3VIV9Jok0OC/6SOtoTOWtMduDVwf5yJq+4o56yDmNbWdPV8yIw0wtkByGGs6rJgkYmU8ZiZ1KFoYBKGw1GR8biJ+uTHATTh6HMhgomn1itDEzrpcSl+/VN1kqtruJ6ToV7ihRKI30vTvP8bQc6wfSKAo62dYfmnvKRkDZ9+KQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from DBBPR08MB10650.eurprd08.prod.outlook.com (2603:10a6:10:52d::7) by DB9PR08MB9827.eurprd08.prod.outlook.com (2603:10a6:10:460::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Fri, 4 Sep 2026 19:04:56 +0000 Received: from DBBPR08MB10650.eurprd08.prod.outlook.com ([fe80::1b2a:832c:d136:a37c]) by DBBPR08MB10650.eurprd08.prod.outlook.com ([fe80::1b2a:832c:d136:a37c%5]) with mapi id 15.21.0382.007; Fri, 4 Sep 2026 19:04:55 +0000 From: Andrey Drobyshev To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [QEMU HCI-8.0 PATCH v2 04/13] usb-host: preserve hostdev FD during CPR migration #VSTOR-137800 Date: Fri, 4 Sep 2026 22:04:34 +0300 Message-ID: <20260904190443.795902-5-andrey.drobyshev@virtuozzo.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260904190443.795902-1-andrey.drobyshev@virtuozzo.com> References: <20260904190443.795902-1-andrey.drobyshev@virtuozzo.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: VI1PR07CA0215.eurprd07.prod.outlook.com (2603:10a6:802:58::18) To DBBPR08MB10650.eurprd08.prod.outlook.com (2603:10a6:10:52d::7) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DBBPR08MB10650:EE_|DB9PR08MB9827:EE_ X-MS-Office365-Filtering-Correlation-Id: 8f649691-3190-4a82-a6cf-08df0ab76843 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|52116014|1800799024|23010399003|366016|38350700014|10067099003|22082099003|5113699003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: xFKQTj43c3vQgUJ6JCcH98dB1uQrcqE2iPwoA5teNYS1swMxX7TS7AkvKD90JOltSLTQkDC1qs+rvt7XbtrOEr7nGqvpW9YBImax4z85KPZnDLnyMNwawQGoKWdrjabv7R6mN+qQHcdKPdunoNWfpA6SObDt0eF1YY4G9BQ+ZHikSJpUF5jV+6hQ1/c7TfNE4JjG+Xj/VHSYRqikEDgtKksA5w+3XXW+46wH5MycG4VY0DX+rhvGNKf1+Odt4OUK8BOnMypk+aOqU+0+Cn3QltZhm+ZcntyEoA/4BNvV9eZ1yO5EqpY02XbSVHn8lz+bGJGAjcGesNCvwOUPWG/iL9I6VBwjg3YKi8Elnr6XhSGLsuCpxRSP633NMB5GG4VXuEwoCt9kUMqxMFJ1bmJb1h0Rc+c40Qt2eaxzAkAA0fYkOSu1T46nN0oRj2tZx3qzoA6xFeWeFwCstJ44c0UD7IRxKEca71hYGEH6ZZaRgKloIS86FfO6oJqCOjqp6fR1FkTDkbgHaLZLqHE/Piz1Y9Nql8dRPCNyvCQihNjIgPhUj/0gyxByZ5Y0YCPqOdDzUAvx3eO3/QP74q7UVtp8hVeR5j1pQy7s4iSaifQeBRTvy6quP/+rdYw9X1LH4MtbJbcD5qE8HgSvBoJN+P06rc04IdyGZGHklh4V5laGunC8zIj8o/F1tAUdOahoni/vuexcEa3+L8HBeE5uvE1RbxmVAxt3NQIw35qcG4belxQ= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DBBPR08MB10650.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(1800799024)(23010399003)(366016)(38350700014)(10067099003)(22082099003)(5113699003)(18002099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?DcCMrkD89qFb+zvEiYMna/yi4cg/QgLmk0AoEAuSNcz7OufizOf3Lkdb9Xok?= =?us-ascii?Q?8RiRh16d+OGI7H1raeb+F5sSPxEp2KJmkXxITjcQvkDB1TZCL+uZrMG1ks0a?= =?us-ascii?Q?e0EpILCphPVMMb7Ip203Ox7SuYNDq9CF5EH/hNXDD1NDdi1XwWdeIT9dO4GY?= =?us-ascii?Q?+oO1BVDpEhsiNgpJtjrvNgxpp21styeOMTK/rZfh/tY84IclviDJnG+1IXFU?= =?us-ascii?Q?XtGk6pHM7dY64WwqvvMtArkuuHukYX3guBvWgop1gm1quiD+QLV9Bq2ls7eA?= =?us-ascii?Q?U1PtzquIlQG8pFP7R+B1Nrr6jNd1B6KAoiDjIN5Ji5jDXwHkxr8xJc2k98J3?= =?us-ascii?Q?sI8TldTjipqU66WxMOGIQUUg23iDLiVIzzSxkzN1AYYZcGDE7yjQ4PgxXXbB?= =?us-ascii?Q?qtTfeEFuAMQeW8wKewhL1jhwHuGkMgA3eaB1kczxDChEkTikL+6aOwNj+DO6?= =?us-ascii?Q?FxvmX0HaI4f5mmA6bha+vCo9u5lcHN5Ufz2DaE4FP6qtVT8bcQ5xN06YO3/1?= =?us-ascii?Q?vRzRuOpAtSNCsY1EeKlgB+MFjpAeLYo0Z/BU/Yp099RI7TwWX50QYj//55KC?= =?us-ascii?Q?6UmGTaAuaSfoTJ+UJoPBTJ4rECpzpgZNcLMPfJjLKXppvmmgvUsZLJzloeyw?= =?us-ascii?Q?7PaB98lkN10d5waQax7kZrDZ3ftAdnZWxLzuFrZRsv1nyhsPGOic7RmcJSJS?= =?us-ascii?Q?nj5sDbI5cnMW1LESFcdnnovpihcoC9JRCMwvu70ysr+oB4vBYqmw/xwQgoCU?= =?us-ascii?Q?TdDpofH0kQ+fDvHa/IjWPp8h4ncMfedSP+xuyobmD4yTfbsxUWJ5uuxFwmum?= =?us-ascii?Q?Oq75rCTCZzlTEFgziFYWOieo4gCrVtaXKdtdPtEYYKiIu/jpnqZfo/4NNRPk?= =?us-ascii?Q?MYcxUoOU/jRl90zDUKWNOTFIIRncmvJekjVxlh9Cw3OkkfPPVLtHWMECj6wZ?= =?us-ascii?Q?lwhFMmU/z6qSyHQ8JnFxrbcl0MCMboh8WWQLkgyvvJPOTziz0eiG8oY62n8/?= =?us-ascii?Q?00qlxZD7Cew6xbS82y9UTa+MrZsPI4VQvVE7esdWgwWVyjMWwWIrSWlUJeCv?= =?us-ascii?Q?c9/Pmks1s5lU1edNYnXRplNSY9CkGxJIvm+Viw0ETh6vZvVsAwTdyY6Mj4UQ?= =?us-ascii?Q?mjWONFqlbJ1sSoqs2KEgHhmVPzTGvfvttW135IVLgJ1Dp8tKgYYNifKqYKVo?= =?us-ascii?Q?kET/POiFQJMM4ZYHE8DZiDRNGR4rW8/uTvuNIxXvQpKPj1vJje87mPrEHHZR?= =?us-ascii?Q?Gub0zwkGAVq9QoYX9XDvPbUQeHa7I+vmMxYGgxDyo8wiOPx4zWtPP/FkugY+?= =?us-ascii?Q?XD/rUNyRSIENxMh0sVl/Xbi2PX3jHWtzTkuA/qnAlKteQ+GYS00fFiaUXBiH?= =?us-ascii?Q?PpI9627i8b4Domy1ComPVHvX4u2KkUFihAyCGQGlCu8UNdEWRUZxpsQ69Slw?= =?us-ascii?Q?gpI9Ym0uig4Q0sjEsrq04rPkrmzhZEQroyLijaagFp0c3ouZFz5AgnjJkojm?= =?us-ascii?Q?aMlfj60KldycvJgbUyX09iOJfnszuTiQAbmz3rH+k2Mso30icbiKQw81Qls0?= =?us-ascii?Q?UwkKfegeMpSY94DFux2zX292a3g/6MSryKQiJBBdyl7NYtLUBgJJwOEfrFjh?= =?us-ascii?Q?REUIglNMTdmJscK0mRIyDJfpdQhfOD6bWc2VAvo59geYmPMfuHSTubCeTkya?= =?us-ascii?Q?QnlyS1hb5vkl70OwqNt8qwEiZbzG8F5gunGYc4zxWpotoaCGG5vcJAT/NVGW?= =?us-ascii?Q?kvNT2Amk6AlxOfIlge6FeQkP53Vw47g=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8f649691-3190-4a82-a6cf-08df0ab76843 X-MS-Exchange-CrossTenant-AuthSource: DBBPR08MB10650.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2026 19:04:55.5953 (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: 6DSVBjY+Nr4MoiMwjw2SLl8tToYfUO8nVOCnSiZcUNwoGBMwS/h5KCif3Z2JZJqGz3FpNMKc5fRrKkHV9cBo9roLX3sgLHtoT3HFXjuNPUQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB9827 In .realize(), save freshly opened host device FD into the CPR registry, and then reuse it on CPR target. Also, add deletion of that FD from registry to usb_host_open() / usb_host_close() cleanup paths. For this to work, we also need to skip the .post-load() code which closes, detaches the device, and then rescans the host bus to reopen matching hostdevs. For the CPR-case migration we don't want any of that as the hostdev FD stays preserved, and the guest shouldn't notice the switchover. Signed-off-by: Andrey Drobyshev --- hw/usb/host-libusb.c | 53 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index 86f96087085..eaacfd34c54 100644 --- a/hw/usb/host-libusb.c +++ b/hw/usb/host-libusb.c @@ -47,6 +47,7 @@ #include "qapi/error.h" #include "migration/blocker.h" +#include "migration/cpr.h" #include "migration/vmstate.h" #include "monitor/monitor.h" #include "qemu/error-report.h" @@ -947,6 +948,38 @@ static void usb_host_ep_update(USBHostDevice *s) libusb_free_config_descriptor(conf); } +static char *usb_host_cpr_fd_name(USBHostDevice *s) +{ + /* + * Prefix the CPR fd registry key so it can't collide with a chardev + * label or netdev id in the same flat namespace. + */ + return DEVICE(s)->id ? + g_strdup_printf("usb-host/%s", DEVICE(s)->id) : NULL; +} + +static int usb_host_cpr_find_fd(USBHostDevice *s) +{ + g_autofree char *name = usb_host_cpr_fd_name(s); + return name ? cpr_find_fd(name, 0) : -1; +} + +static void usb_host_cpr_save_fd(USBHostDevice *s, int fd) +{ + g_autofree char *name = usb_host_cpr_fd_name(s); + if (name) { + cpr_save_fd(name, 0, fd); + } +} + +static void usb_host_cpr_delete_fd(USBHostDevice *s) +{ + g_autofree char *name = usb_host_cpr_fd_name(s); + if (name) { + cpr_delete_fd(name, 0); + } +} + static int usb_host_open(USBHostDevice *s, libusb_device *dev, int hostfd) { USBDevice *udev = USB_DEVICE(s); @@ -1069,6 +1102,7 @@ fail: s->dev = NULL; } if (s->hostfd != -1) { + usb_host_cpr_delete_fd(s); close(s->hostfd); s->hostfd = -1; } @@ -1130,6 +1164,7 @@ static int usb_host_close(USBHostDevice *s) s->dev = NULL; if (s->hostfd != -1) { + usb_host_cpr_delete_fd(s); close(s->hostfd); s->hostfd = -1; } @@ -1218,9 +1253,13 @@ static void usb_host_realize(USBDevice *udev, Error **errp) if (s->hostdevice) { int fd; s->needs_autoscan = false; - fd = qemu_open(s->hostdevice, O_RDWR, errp); + fd = usb_host_cpr_find_fd(s); if (fd < 0) { - return; + fd = qemu_open(s->hostdevice, O_RDWR, errp); + if (fd < 0) { + return; + } + usb_host_cpr_save_fd(s, fd); } rc = usb_host_open(s, NULL, fd); if (rc < 0) { @@ -1757,6 +1796,16 @@ static int usb_host_post_load(void *opaque, int version_id) { USBHostDevice *dev = opaque; + /* + * For CPR migration, device wasn't released/reset, and the guest + * is unaware of the switchover. The detach/rescan performed in + * usb_host_post_load_bh() only exists for cross-host migration. + * Skip it for CPR. + */ + if (cpr_is_incoming()) { + return 0; + } + if (!dev->bh_postld) { dev->bh_postld = qemu_bh_new_guarded(usb_host_post_load_bh, dev, &DEVICE(dev)->mem_reentrancy_guard); -- 2.47.1