From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11022099.outbound.protection.outlook.com [52.101.66.99]) by lore.virtuozzo.com (Postfix) with ESMTPS id A564780682 for ; Fri, 25 Sep 2026 14:11:29 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RZPXIHpHc1Ujgr7pnAcFCIAfRItvqEg7hYQi7aVi1Rv3w1h2tdaY9XQ0rPjFeYO2zqDIUrcGU9BN6TJ1n5wX+L+eQj8qKipXW70fzQ6S+nT7CZaiOMfi5rlKfpJQx5vMxJW4slRUabZRk/3MFmIfrxYtTPAkdOLkLfObN1rfeQGHSqzLRROo4DqTthda2LKiRdpKwGcqn94WTzk7Y0TBBt9e8CTXvE9o4fG0hO9+Fy9X8Wgxf5C7VDZgMiRD/U+jNE/5rcinf02l9UDwIA4HNqauXd/v40HqhjbuWadvRogX2a68mspZUZ6YAByti+MMNpsRryKEtN02ZIlKTMNGkA== 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=o0dul6NKm0cSpNn3v8g42v1ZxLtOiFim0kP9UTB7S50=; b=WjqUOmXly4eUvLIrWflUJcsLK1OAofwDrbEeleu+JMx6rETrfuNPgUH/MgT5RlVFG4a93UeMetpN/EdJqEReEiKBFraQAjP85qlwgBMDFJ/3W2L78Jm6tQ9whTqUuRwNlJAwgODWRRJvh2YSPsNTOwoTBCzCBUywDX3yJcET+9/2rPHfaNPLT15/LUwDLyTixu0OTPUKUvbSTHPf5jZmi+Hk75m9/B+L49dGRSbhWGs6LhH4fTUiMkyO2xMhOuYOYcqWcOOTNnDs2Jy0Y7yn9OlyxDaUtTEwvR/7AlfoWvwi6aiA2FDbiC9z6mRpoGI3OmWBaRRM/YKcy7Zqzl7+PA== 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=o0dul6NKm0cSpNn3v8g42v1ZxLtOiFim0kP9UTB7S50=; b=Kaal+71z75qoAqMC4VdaDJ843MW7ZBdQQ27dXsOENYMD3hxgy9BoIjnNrHo3aF49lXs66dL41TIRCvT1pO7ITDtzAlSkF4XeOtGm5p4lnblFoNmSbnYwFNaoFzNaGh4A85SCNiBQw+HBaBVEZHYcG/wNahd2hMPR5BQYh4TZY8IEgwvPVJH8OLkQXk4IFSO+Gg+heK9bfUA2fVL3TIsX0j+HYkbLa5ltUQ/eHPhWSVsCxP6UcxYDlu9vI3Q9JLaHQMCE8K5PvHPPjcDdW9P+1QsoQxCuFs7la+MzFXbcha7jbwr8NiMFj62UENV0/ukKDqphIFEx8OksX3QuEsyWsw== 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 AMDPR08MB11336.eurprd08.prod.outlook.com (2603:10a6:20b:716::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.18; Fri, 25 Sep 2026 14:11:28 +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.0451.014; Fri, 25 Sep 2026 14:11:28 +0000 From: Andrey Drobyshev Date: Fri, 25 Sep 2026 17:11:12 +0300 Subject: [PATCH QEMU HCI-8.0 v5 03/13] usb-host: preserve hostdev FD during CPR migration #VSTOR-137800 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260925-usb-host_v3-v5-3-e5b21724db4d@virtuozzo.com> References: <20260925-usb-host_v3-v5-0-e5b21724db4d@virtuozzo.com> In-Reply-To: <20260925-usb-host_v3-v5-0-e5b21724db4d@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR06CA0178.eurprd06.prod.outlook.com (2603:10a6:803:c8::35) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AMDPR08MB11336:EE_ X-MS-Office365-Filtering-Correlation-Id: 7792a226-8d92-43e9-8c37-08df1b0ee403 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|376014|23010399003|52116014|366016|1800799024|10067099003|56012099006|5113699003|18002099003|22082099003|38350700014; X-Microsoft-Antispam-Message-Info: UvS6j0CUNYsk9FKQ4OaQSuiOb6/D20Ci7DkUYlALEOWOipi+tPgxojNtOuV+T9Id7RK4MghLMRpklUZ7VE/sQO6QzxR1fcDGbz2OA2midUKaMlr+1MlcEl6YK0t1PIQpMCvcjTFgJxISn7C/s+F1CfvMzQ+woa4bDJVNb2tRo+0MXiQNjuFRjsyuy+0udNkiuYAtu/NAoqA1fB6NKuUC1JWKKdg1K6cYmHsXN0QH5ed/drSiDUDa3GQJOYVgsIbdBi6RAB8Hc6Ib5z9LWb5D9wY/BBJbtqq4/Pc8QkgN4C4bY/vFbtY1zjiy5aJTJ2eVnk8/bxxxCAW1cboukchPB6gu3tW4YxPJT9X8TEMQNy2kvOT6YO4lCkMQiHdrIz+BY2aoXRmJdFQ3UzmxgP2lNCQ6vNxwFNmeYXaFlUGB/mStX5z+uhSGVjQGOswlspe0CDmK+LXRuiE9LN3ofePKLtKpeOQFcYfZFYbGyOHJf1AJKubMW9+LhupVZMVPfJ0/b3sdFLHWSoT8x7k0V0ogPxM3npnpw6sj4j3aYLzkUFdaCUgtRHlWwPlgVjaMs6uVM2GQn1UbpPxndC789cnWhNzgVssGPPJstY7W+M2L61NCLlxzHqKJMT54Lt5QL9+Vv9aqyKBgTAuxDXNK2jeYhDzVlxhgB17MY91fV5YgHemLvRijIPn5wLF6Y72YkcPinf5gsk3pXjyr0pQtCWQamvD0nA3yq94HeKSnMCo+qd8= 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)(376014)(23010399003)(52116014)(366016)(1800799024)(10067099003)(56012099006)(5113699003)(18002099003)(22082099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dEZlNWhIbzR0SjVIREtXc0RSNGZUWlVXTzh4YW9JWFpPSHEyL092Ulo4SW9K?= =?utf-8?B?Z2FBTG05K1R5cCtyYi9XODFDN3lCbmZHYXBWeUY5dmhZTmVuOVg1d3E0RHRs?= =?utf-8?B?b0Z1YW5UaGxocm56a0pmai82M3pYazNCVmlKZWF4dDcwZ3hhWjdZNmxaS2VV?= =?utf-8?B?S0dGMDVpS0hMOGE5a1hlYWx3bzY5eitQaGhxVUlRUDNZUjNFVGVnWGdsUzQz?= =?utf-8?B?WjhQYnJON0IrSG9Xb1BYSk12NHhOWGVLYlN4WEFMOTZzbjVVeTdNNk0za0sz?= =?utf-8?B?SUkzUGxaLzNUdEJHTnkvUHE0Y3BlUC91R2xaVjB5blJrck1jamlKS0xLMFNr?= =?utf-8?B?VjBxajBRNGo4azZwb3VUMG1sNU41ZTlXVnZnZHM0UWlEVitDZVZtaWdrbVhF?= =?utf-8?B?NEFYcFlDbFNLeGIwZU4xUkV6NnBTdDc1VWs4Q2dkQ1RndWxUdTBDaU1ZSlo4?= =?utf-8?B?SHU2U1lib0V2ZVM2OEVFNGREb1UvUWNjN0JTNGJSWmZ6cFBvMGdBdG1jaGNo?= =?utf-8?B?cXlmN0xieVR2MGM2VjNDeTRRUE1SLzFaRFBQUTRtWU1RN1ZUc3RCanpBMFVS?= =?utf-8?B?R241Sk9TSkdvVlJJeDNJNzRuWlhpcjEzc3lUYWczbEV5ZCtXeHNBdkd3d0V6?= =?utf-8?B?VVZ3eDN6cHMzODRlSTF1UmZDK3AxNDRTamgzV3p0Q0Y2Q1NXTUQ1U01ieTJ4?= =?utf-8?B?R09vUFU3bU1zYVFmWGxMbWNkd2tUVkJ4dDFMZGMwMUFmWFlKYWRLeXlTOVly?= =?utf-8?B?Y3lTYnQvWVVQMkhaUExwZlMvSUFpUkdwRzB1cTlMbkxlelZRQzVzanczVXhz?= =?utf-8?B?cEgvYTgvMzNmRldXUWxvVlhHUkcwQ094MTdleUJsZUFRbjdpSnQ4cGl6b0th?= =?utf-8?B?b3I3TE15ZFRkeitxRkU3MlBvR3NTTzhFKy9Yc3psUFVaR3BZazVHa1lTTnVt?= =?utf-8?B?eVp3MXEvbkdkQUlqVURPUHZpeDVSRUZjRG1wMTFwZnB2S3ZUVG9JWXRiQW4z?= =?utf-8?B?KzBiNTV6Q0Rla09mVXRPYTRIaGsxbzhvMVorWWNlaUR6dDZPTUxPdnNxTTE1?= =?utf-8?B?aEt2dHo4K3UrUnRSRXFuU1c1UmFBZ3NEVkVyQzZVZGNrVEJpcG9XKzB1ckpB?= =?utf-8?B?eE8vK1R3MEQ0VkRqL0JCWms1T2hwSG85WUtnWTJPZWtub0NHSkhOdTM4RjRY?= =?utf-8?B?TWhnR0V3T1k4aEczQXJkTnZwcHpOSFJtQTJaTlhHa3hnS2xuUzR4am9Cc0Vi?= =?utf-8?B?eHovQ3l2Slh3RUdVbVduZzg0em5iWW4xd2lJczA1dlU3YStHai84N1NxcTZP?= =?utf-8?B?RUd6SGUwc2gzUmVxZmh3VHNJWUl1R0NUcDhrSHY2cGFjcExkckNWTHdlencw?= =?utf-8?B?RnY3K3NPZ1FTTzV3TlovNnF0Q0tYYWFOM2s2VDk0dnVlaG1qbzlWbGlIZ0M0?= =?utf-8?B?N0NsbktYb1VsQ3FLSkFQV1NQWk9TR1ZYSGx1eVFJWHlMT3NkZjNUdG5jaUhr?= =?utf-8?B?dFZLWldDQU1rdGJBWVFlSzFaTGFLVzNMYmpISE03aFRBdkRleFBUSzJaTU1p?= =?utf-8?B?eWJrMHU0TmpjVzBiamJ4dVBQSm56TDBGNFR0YXFpUi9LQlNnT2djbFlZWVZk?= =?utf-8?B?anEzVHdKV0dBOHZUcnhyeWlZbEZ6TDlpN2R4ZlZLRlhEcE51a081SjNtalIx?= =?utf-8?B?cW41SnhhWHlYNFVnK3lYaVJiaTNINW5UM3BWcGhFaDZVNUJLay9TenEvYWZV?= =?utf-8?B?ZmUyVXJSc3FCSTJzQm9RZzlRMFpra0JLVE13dWF2WktQS2QyYWtzaEpSb0hB?= =?utf-8?B?VzRUS0Y3Ry91SnNVOTFVT0daR1B3KzJNWDhUdCtRaFN3YldUMThneGV6WG1j?= =?utf-8?B?OXNGbmpBZ2xVSHdOZmdNYlg3bWRiYUNTTlFualh0bWNCVmVZemNIajhMaXh4?= =?utf-8?B?S1NaV1JMQjVnL25CN2pTbHdTUFZmVUc4bHhOMGp6Q21TajE1OUxHbzlxaGxY?= =?utf-8?B?ZjlSc0tMaUZuUC9IczNjcS9aQ1ZzLzlZNHROY3pNSHAxNy9uNkdUbjdDNGt2?= =?utf-8?B?VGlsejQ2NlRnbUcxQVptYWYwRitRNXZKNkN3ekwwbzBvUy9Ya1Q5LzZjWFE4?= =?utf-8?B?RjM2aFVHVEJIOE82dHZBWURwZ2UxVHN4UnlwTCtoK1Izc0taY2E1emxvUnV4?= =?utf-8?B?QXJUdFZYeFpQRlgyUVZlQ0QrTjBiVXJqd0JnaUFaZGFldTVhOGdwR1ZMMEMv?= =?utf-8?B?V1VYL1lsVkFhZEZ3R01nVHZWWWt6ZFk4enliZ2krL3NGN3VGMGtybkNOZEpS?= =?utf-8?B?SnR2ZG15VVhGU3JXQmtxL2ZQbXJmaWtZakZKT2tnU25hZ052Z0xNRzdZVzV1?= =?utf-8?Q?EjuI/x3JLlIkLdcQ=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7792a226-8d92-43e9-8c37-08df1b0ee403 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Sep 2026 14:11:27.9763 (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: lS/Fk4UzuT7zdQtkcQobtpQx2etmQPlNDJM6lfaMHIPWPzWmQgIjxXyFnbyhoeNp9eV88QyKWVLeRjgBfnsAnafQBNasluBVOUpJ3wfALpQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AMDPR08MB11336 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 | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c index 5c3da00d8eb..b946b0ef350 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,21 @@ static void usb_host_ep_update(USBHostDevice *s) libusb_free_config_descriptor(conf); } +static char *usb_host_cpr_fd_name(USBHostDevice *s) +{ + /* Prefix the key so it can't clash with another CPR label */ + return DEVICE(s)->id ? g_strdup_printf("usb-host/%s", DEVICE(s)->id) + : NULL; +} + +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); @@ -1073,6 +1089,7 @@ fail: s->dev = NULL; } if (s->hostfd != -1) { + usb_host_cpr_delete_fd(s); close(s->hostfd); s->hostfd = -1; } @@ -1134,6 +1151,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; } @@ -1220,9 +1238,12 @@ static void usb_host_realize(USBDevice *udev, Error **errp) #if LIBUSB_API_VERSION >= 0x01000107 && !defined(CONFIG_WIN32) if (s->hostdevice) { + g_autofree char *name = usb_host_cpr_fd_name(s); int fd; + s->needs_autoscan = false; - fd = qemu_open(s->hostdevice, O_RDWR, errp); + fd = name ? cpr_open_fd(s->hostdevice, O_RDWR, name, 0, errp) + : qemu_open(s->hostdevice, O_RDWR, errp); if (fd < 0) { return; } @@ -1761,6 +1782,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