From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021099.outbound.protection.outlook.com [52.101.70.99]) by lore.virtuozzo.com (Postfix) with ESMTPS id 9B4C68017D for ; Fri, 16 Oct 2026 15:26:19 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=A/tRfEe1oG0xASPwy/ikfFtMe0cUkM2KBkZec76wQ9FLaQrK26K0lUwM/Xe/vZ4YEb4vm7eRI52NZtQ9p9WmmVBXdd8f8hMwUcQ8UxGOmieFzPigrkjxYgwqZ0UVPjSUYPreIbPDOKWL9eWsKhXUASxSs3xBK9mXyeLAsIOWOs9IoXu6ZFyaeQM/RIncDlJVqMxIeHcn8182ocFu7xem7GLkw+XZQuVhc4t0HM/H/an2CSiigFQodoRZOwUaQIyysjf60X9xI4KE6kQ3c/qDw3gK7FpA2Y6sn636DKcjhuBxWA+Wa2phBILqDyTHstdDIlGeFpW3lbyr2BNotTJJYw== 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=piXzx4Sl0GjovVQ8Uasm85J1EJM4kAkgvkkAeTHkZgU=; b=XNsssSUF3BethAp8MbL2SXbJhEp7cDmJ3QO6uInnFVdfSsZN91vSH8t+WzCRc5wupDVi8zp7caTpbLqI4IEQ5GMagCQyTMitdNbHZBtfj1bvj/RJKMe4+LRnC8zOqmYXUaO13LUmrGZ5eMgBo6FRRbWKo6359RChwzmTLwAlId/lchlvflUDOfpJp5hgA63r6zvkmI/92Rd8esMc5CANCLrSpcNWSvRnQpdzTYTk/tpZLbkGGI6bKUSPB0SE988zT2h5ZWz3Bti+dXnuMnX0BaPDUbXILTEPrgb14zoNSspXz8UIkvVL7lehhygMvtiP9W9VrI3XGZJbnFxl6I1GgA== 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=piXzx4Sl0GjovVQ8Uasm85J1EJM4kAkgvkkAeTHkZgU=; b=dvO2WhMX3WU1RkY8znOaQZrSR3NpBYUS4j2luV0j1gaPEOC4VJhrwUh1L6Yy8BrMti2wuqO2XiykrgOd59osRg0wCVjnKKHw899JLrVtcArFo5I5QZqrqDQ8Mjq2ksmcvu97BkRuYs4hZPO9Osct/2fcRcs/L6ln4I3FsFfWvA7ZuPa5TBai7RrkBj7VricfjCDbfMvNy7LztquAH1pktkVZbOHI9Tu9TNfR02a9zfV812fBBVgmPgjMkP5SqUjW0rqn4ZJ1AkS7ytk3e0bjVG5Y5mCvBZekx3NN4uvJ+Q5T19NAvyL2Im5Na/WBLF9tED+cPL4PATTPdQN2yYZFww== 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 VI0PR08MB10941.eurprd08.prod.outlook.com (2603:10a6:800:250::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.7; Fri, 16 Oct 2026 15:26:17 +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.0546.006; Fri, 16 Oct 2026 15:26:17 +0000 From: Andrey Drobyshev Date: Fri, 16 Oct 2026 18:26:16 +0300 Subject: [PATCH QEMU HCI-8.1 v3 18/28] kvm: tolerate ioctls after kvm_close() Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261016-vfio_v1-v3-18-47487cb5a8e5@virtuozzo.com> References: <20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com> In-Reply-To: <20261016-vfio_v1-v3-0-47487cb5a8e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com X-Mailer: b4 0.16.0 X-ClientProxiedBy: VI1PR10CA0088.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:803:28::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_|VI0PR08MB10941:EE_ X-MS-Office365-Filtering-Correlation-Id: 60c09b4e-87c6-4837-9f5c-08df2b99d044 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com 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|23010399003|1800799024|52116014|366016|376014|5113699003|6133799003|10067099003|22082099003|18002099003|5023799004|261009223027099003|261009221227099003|38350700014|56012099006; X-Microsoft-Antispam-Message-Info: 5Uvz2JtXDN0Ve3xBmfKgqjB9fIImjDOK8bsH2K104++ZTr3JGPXV13pECLAu9tV6bNdJyn4+5fOuFbLCr29lhg84PdR+fMFhcADEnRpnokyowAA1RyAeEZ5sS7NuERMe3wDaEQDxttEkcylnch3jdq4JM+cDkCMeGMaMQF1e3PcrhIbSllgKRyPRZ5kwfozHf2yBQp9opBvEP1mGrkOKDrPqPLra+2Fa2LRGWXe2DRESj4kjWXzVhxj1zCwaI4vyv9Yq6oyY60+q88oI3Yk3MAyTI0fu1RyLu+mizgzWoDGHu0LwXenCp8p1AfFu1eLcfhy/xOdI6cBq46BD94IrQpEEsk5WQJs0BWi0EcZnfH7dh+viDgyX59vmdkllc7v7CZ9AkKjPDt8ZnwnWJgeYmpnDUOV+BUScikli8TDshdOIElv3MUksx4aoyKMQ7SSJbDS5P8nrAdbhc2aG2x/wUPfjPCVke63vsqiMc910BDGavlgen6TwUVgczUhbDp8HsYfFbt9umuU41r3lj1ueG83W+mbX364KAFIeS7p2pWt+0vj9wjsCC7Ci+WRBqhD6VO5jrwH/FTGR2xIoPYOCo5fhyGHqoFj7G6MtDDqz17Yxu1PFWNjBPX7k3WRVOainRZBR090MawcpQm+Q0sYT3qfFb6kmF4pc+/1vBZh65NkHHst6PK4aU/4XkTfYH+1RQT/mnI0CSeEt0dYlhxqngTsokEwqVFUDBvlsJGq/fQ4= 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)(23010399003)(1800799024)(52116014)(366016)(376014)(5113699003)(6133799003)(10067099003)(22082099003)(18002099003)(5023799004)(261009223027099003)(261009221227099003)(38350700014)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VDNYeVV1TFhtdFZQOEVjZVp2VzNJS2QxYjRRUUQ1UzZycW9tRlA5ZFBERkJx?= =?utf-8?B?dW5MZTJLV1lSZWJEZ3VTSHJsRFIzb2cxdzVxRmFPNGxub0xranNNL2N3SmRC?= =?utf-8?B?Z3JkWUZtanFnSUQvbis0eXFDTGNyR0didzQ2YzgxbnJtdkZxbk5OeWpvcjJu?= =?utf-8?B?ODZCTW82VEpWSnRtbFdBT0RJVzBVenFWZzdmcFFYN3lMTllBa2QyVkJ6K1Nh?= =?utf-8?B?eGtEcUltNVJibE9Udjd0Y2U1eVNWeTl2Q0Uyb2xRdnV5akJuYXk4SU4yL0Q3?= =?utf-8?B?R2xwK24xN003VHA2bW5oZ3ZHd1M0bmpDeXl1UG5HNmViWTFzM2VGRk90K25P?= =?utf-8?B?YzJpRnRaRHQrL29xQzVQejUxNHE0YWFraTN0SFBSbDh0RnY0dlBHTDlhZzNl?= =?utf-8?B?RG44eTBDeTFzMWU3RDN2SEdHRGFTakl2VlpUNnZrU212eGQvamZCK0V4eUU4?= =?utf-8?B?K2dWbEhkcy85N2Ftd1U4RXJ3cGdwSGdTQmFEVHEydUdhY1RJTWdnUkZQeDZH?= =?utf-8?B?V2hWS0owQ08xU2t2d2FaQWVjTGQ0bXBhd3JjZkpQamJpV3dISW5WbitydEFR?= =?utf-8?B?SWVFVys2YTF3ZmlYcC96MzVhQUNSTi9oNFNDMHlqbXp5T0o5VnY5bkpBYXJB?= =?utf-8?B?MER6b0MxY2w1elhMMHBZUjFjckRqcERZK1JsRDRZZUhKMXdPQ1JiK1ZFTnNP?= =?utf-8?B?a0lWaDJxNXhTYmdka0dPSXJod3ZSM1RSckZYR0FuNXdWNXMzWjR0NXpOeUVi?= =?utf-8?B?UTU5eDExakMwTGZ5Zm9mMXZZTjhXbUpTeFcyUG5vL2hVektIZGJHdVQvYXFN?= =?utf-8?B?dExzcEttTlhtckVvcjJaK2cwL3IxdGRmalJaelpmMThMVzBYcGwwMlo3N3Uv?= =?utf-8?B?TVhYamVrWTZrSjluU3pBUjA5Qzh2YjFOQWFBeng1YS9hRFdLZnIyM3lmOU56?= =?utf-8?B?ZkdYNlVudUlyaUFoUGJBdHE2elptTlA4c0RSSnFXaEt3TGdXRUZJMTRWUEl5?= =?utf-8?B?NVFQenZKK2lPYkZ2b0s5ZUU1TmZnN0lBSCtMTmt0QmpVSFJqVlJscVVuYU9s?= =?utf-8?B?anlRemhhTDl2L0ZKNUZEb3VSN0JYYlRQbWZZOHJnTVdRSkNFSEwvS1FWTTdi?= =?utf-8?B?dWxVeFRkT0FTSDhLQUZTckxXVVlWdE5iZlhZdE9MNGRyWG5PL1NudlRNWGJV?= =?utf-8?B?YVFOZmo5QXUzNE5ybUowSGJMUVN5dGErdXZ5S0t0cUtXaXl6UzRaQS9Vc0RJ?= =?utf-8?B?TU1PM2NibmxoaVdTUkg1Y2RJM1pZZXdCY28zL2lTRVZGQktTazdlZlEzeWdH?= =?utf-8?B?ZzZNc1VpUnNHczNOTGE2T1hNM2lZY24zNzZUUDkveURMbU1vd05LL3lycCs0?= =?utf-8?B?TVZFaWd6YmR2YVpqWjh6SUZQWUZkYnIybWJpMVkrSmp4RmhscGhZQnpTb0Jo?= =?utf-8?B?SnRwYW5aUUJ5Q3NKV2FnK3A2Wmxwc1o4WHZNVDhQRXQyclpmeWhNV3VlMmkx?= =?utf-8?B?REs3YkV3K04zNVdnVFZadnptMWhkVURIalkzKzVoMGtOSGRnN2ZZTFE1b0dR?= =?utf-8?B?aVBlK2hLR2dzcVVETWFIZlZkcmY5bTAxSXU3RTY4RUZ2aGhJa1ZDRWpSWG8y?= =?utf-8?B?ZlByMEpRYmJFemdTalVQcFRPemtKUFg3ZEJtRnRuaG5SRHRGUE9jK1krR0hx?= =?utf-8?B?Sk9kelJ5MC9sV3o1Z285K05tdE5NQ2R6NnhXOUdYdzFEMnUxRDVrZzY2SDg1?= =?utf-8?B?bmp1TUp4M01wdlNnUStwUmkyNy9jd05uVS9jengxU1M5QnJQbytHVnVHbHpq?= =?utf-8?B?ZkJlenI2TlpYd3dWM2Zvcmt4Qk9RejNVYUo0ekZjRm5ESFBpM0daTEhGUW5p?= =?utf-8?B?YzZXNlNpelhQVWRuc05lMkE3VkFZakRTbzVBR0VKMHhQZTNJbnVnSVpLczNs?= =?utf-8?B?Z251ZDEzNDREaHBoNkZ2Y2NmMFRVMnBpZ3pxMFZXNEFWVnZYWWIyRGJpRVdM?= =?utf-8?B?VEZzRnVUSSt2QnBDb1MzMzh6VDVoazFhbmI3M2pYQi9KNS8wUnlkb01WaHlx?= =?utf-8?B?cVc5WEZhREdrYy91b0hZckdiSUdiNjY1THJsdTdNemNLL3NsSkh1clRWWkpj?= =?utf-8?B?S3RscklRSFBacDE2VTNlWThzVVJjSCtYcjBXR3FPSDFoRFdiVTJKWWtVV0xK?= =?utf-8?B?cit2R0M5KzU5QjE1U0JqNDBhT0l2VGFZVy96TlJYMDU4Y1RCZExJTGhQc1BC?= =?utf-8?B?YUZZdHRUbXFmMUJFcVZ6SjdBYnVMY2xRN29MNlUyOWc5U3R3WTFxdzBCeTh1?= =?utf-8?B?eE1UdGVZT3NmOUhDdTBpVGdIaGt0NG85enUvaFV1TVhZQkZwaXZnRVNmbG4y?= =?utf-8?Q?7S42POOFVi47VanM=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 60c09b4e-87c6-4837-9f5c-08df2b99d044 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Oct 2026 15:26:13.5233 (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: 7Fdm/1JexYkT+3QJkECxogyUXGl2OaoPgOM9YYvNpr1PvaRb8uHJa4CW/Yve8Xn4x7aT6cgqZIPqZfYmU/7NCn/+RRs0Sq/iinLiMM6KXyI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR08MB10941 Since commit 7ed0919119b0 ("migration: close kvm after cpr") a source QEMU that has handed its VFIO devices over via cpr-transfer (or cpr-exec) calls kvm_close() once the migration completes, so that the destination can register its irq bypass consumers. kvm_close() closes the VM and vCPU descriptors and sets kvm_state to NULL, but the source process keeps living with all its device models intact until the management layer terminates it. Nothing prevents those device models from raising interrupts in the meantime, and the regular exit path even guarantees one: net_cleanup() deletes the netdev behind an emulated virtio-net, the NIC sees the link go down and calls virtio_notify_config(), MSI-X delivers through the in-kernel APIC, and kvm_irqchip_send_msi() dereferences the NULL kvm_state: #0 kvm_vm_ioctl (s=0x0, type=KVM_SIGNAL_MSI) accel/kvm/kvm-all.c #1 kvm_irqchip_send_msi (s=0x0) #2 kvm_send_msi hw/i386/kvm/apic.c #3 kvm_apic_mem_write ... #9 pci_msi_trigger #11 msix_notify #12 virtio_pci_notify #14 virtio_notify_config #15 virtio_net_set_link_status #16 qemu_del_net_client #17 net_cleanup #18 qemu_cleanup Every retired cpr-transfer source with a VFIO device thus dies with SIGSEGV on SIGTERM/quit and leaves a core dump behind. Without a VFIO device kvm_close() never runs and the same exit is harmless. Make the ioctl wrappers honour the closed state instead of assuming a live KVMState: kvm_ioctl(), kvm_vm_ioctl() and kvm_vcpu_ioctl() return -ENODEV when kvm_close() has already been called, so any late interrupt or query on the retired source fails gracefully. Teach kvm_send_msi() that -ENODEV in this situation is expected and not worth the "MSI lost" warning on every such interrupt. Fixes: 7ed0919119b0 ("migration: close kvm after cpr") Signed-off-by: Andrey Drobyshev --- accel/kvm/kvm-all.c | 15 +++++++++++++++ hw/i386/kvm/apic.c | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index a39c1ba260a..ea027c37829 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3371,6 +3371,11 @@ int kvm_ioctl(KVMState *s, unsigned long type, ...) arg = va_arg(ap, void *); va_end(ap); + /* kvm_close() has been called: there is no KVM to talk to any more */ + if (!s || s->fd == -1) { + return -ENODEV; + } + trace_kvm_ioctl(type, arg); ret = ioctl(s->fd, type, arg); if (ret == -1) { @@ -3389,6 +3394,11 @@ int kvm_vm_ioctl(KVMState *s, unsigned long type, ...) arg = va_arg(ap, void *); va_end(ap); + /* kvm_close() has been called: there is no VM to talk to any more */ + if (!s || s->vmfd == -1) { + return -ENODEV; + } + trace_kvm_vm_ioctl(type, arg); accel_ioctl_begin(); ret = ioctl(s->vmfd, type, arg); @@ -3409,6 +3419,11 @@ int kvm_vcpu_ioctl(CPUState *cpu, unsigned long type, ...) arg = va_arg(ap, void *); va_end(ap); + /* kvm_close() has been called: the vCPU fds are gone */ + if (cpu->kvm_fd == -1) { + return -ENODEV; + } + trace_kvm_vcpu_ioctl(cpu->cpu_index, type, arg); accel_cpu_ioctl_begin(cpu); ret = ioctl(cpu->kvm_fd, type, arg); diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c index 1be9bfe36e9..0c9f7759b6e 100644 --- a/hw/i386/kvm/apic.c +++ b/hw/i386/kvm/apic.c @@ -196,7 +196,11 @@ static void kvm_send_msi(MSIMessage *msg) msg->address = kvm_swizzle_msi_ext_dest_id(msg->address); ret = kvm_irqchip_send_msi(kvm_state, *msg); - if (ret < 0) { + /* + * -ENODEV means kvm_close() has already run (the VM was handed over + * via CPR); the interrupt is meaningless here and not worth a warning. + */ + if (ret < 0 && ret != -ENODEV) { fprintf(stderr, "KVM: injection failed, MSI lost (%s)\n", strerror(-ret)); } -- 2.47.1