From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023115.outbound.protection.outlook.com [52.101.72.115]) by lore.virtuozzo.com (Postfix) with ESMTPS id 6ABD580067 for ; Wed, 23 Sep 2026 16:42:32 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pilq+CgXlYdYDhLVqZoP1qJbm+Hz7l0m+vb/7mN1IHretIXa/yIBf29nyKu015mm69x7DG+h7QTYEiJcXsowx6uHmmGWuzJh5PSvbdYbSvydkSoF63Sh9Ip0IAOdOFiIPaaNfrGyh3xk9lwNMnk8lsOP7HOWIeZ7xEt7VZ2CeE3Hnad2cWgS417cMlXpU64QZvUnMR5dGKfT0hxq/dYfWV39TjvJmEjw15/TG8QBnNbLODVAGkfcQLOaQFjB/tOftWUP3QXi6fSk5QUeBQ14Ni4BUQhNPwOQa2mIWLa2XwWRt+cd7ywqQAJ9+4FvVhM9tq7sbK+rMgeg5xbHzRWLpQ== 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=jQxGrDZCi64i38jhCefloR6icHApMePMcSZ3M6MnAAg=; b=m1jK9D6sfZIRCla1ojAj/kh9pJFwk1+Gsldgv5m16095drCm+PQ98Mnm9jZiWiiX8JediLGbxDfUB4fPBtXXtDFwokuVaM1z5krkQeBLQcQjoc9J+82Q96pJhnM67YOS+uMeXqq/iMe1PqXFUTxGGo0gxH78F9X6Cx5kIGumTpDRO6l5c8aLU+zaSIp4jvhPKLYhBt89IR9grXUaqu6fn2Tdb/ZhdeKq6zE0zT+epr3y1eFthXpbbloo5KbjydnHSQSGmXUiDnNlrc8xzVaDTMRCgTRLNKDMP7KEFJ3rSyCBQCXcUk9+QYEcWBJtoSdqg1tHAlEBpvY8sxMgQ7vCVw== 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=jQxGrDZCi64i38jhCefloR6icHApMePMcSZ3M6MnAAg=; b=xiKd2GQh6Yt0IHLDQI0Ri95QZtrz6gEObv3azgDc+BcYwuMeW9w7PpG0R2CaKKlV2yGpY4QSKJMzzoYluSvXqYtVLWv8H4zcAa8jKBhCLh7bit+6uguZSkjsR1xVaF0T/ZpcQH/Kd8YNPrGLpvWY+sM468EQ0W7PzloyaC6I2sdRyNXbi/VZ6bmRxitE9ZWznfp/Hqe8CRMtPpGlq7bekzaC2/B3jqPBX1ha16vk8Jy/AxIrIJk2ggk+M6GPbFA0B8y2T4Bu6q5FLxmrimn9Aqb0naR02rn1KUfDpkvHS6uOWXOuMPEC9Gib6pAZtVod6R22hNLAGuLulgJwMRzPlw== 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 GV2PR08MB11882.eurprd08.prod.outlook.com (2603:10a6:150:344::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.17; Wed, 23 Sep 2026 16:42:30 +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; Wed, 23 Sep 2026 16:42:29 +0000 Message-ID: <167c7d00-dbcb-4c3c-9468-918f77f296db@virtuozzo.com> Date: Wed, 23 Sep 2026 19:42:28 +0300 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH hci-8.0/hci-7.4 1/1] hostmem: fix live update crash of VMs with bound guest memory #VSTOR-147016 To: "Denis V. Lunev" , svt-core@virtuozzo.com References: <20260923162056.3488196-1-den@openvz.org> Content-Language: en-US From: Andrey Drobyshev In-Reply-To: <20260923162056.3488196-1-den@openvz.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR4P281CA0214.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:e4::10) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|GV2PR08MB11882:EE_ X-MS-Office365-Filtering-Correlation-Id: 843d6766-db5b-458c-0521-08df1991a848 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|366016|23010399003|1800799024|376014|5113699003|6133799003|10067099003|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: RD3bULMQFyDK2lEyhiA46RJjzI8XPCz2A1olgJbv3FJeYK3ETceRSOvV5SA0YrEJEitq6xkfGs6RkpriOU02BqrEJo2Jsh0tvgyVYO/EUZCRhH6otgrJTy+S/YyCMUX2iehe6qE4kkvtcgomNmnh5agJBoECbPz/uKXh9bL9hCK/ETDzVm2O6aOGPxQvYSAgANpXBbz8I9znw+SO4OOT2pUCqRvBC1ZdMnVn8Rz5UIaQF1gpKOppgdd4P4PPW7Xg1Hq5WpqaiILlrQkblw9/7nfHLz8SK+7NurRLPNT5691k5hykXo02XUGLVcmU5znRTKQjPjQh6u+b9g3Jof/CtenDPoTzZ0Y2NDgxfLdvCV2bK6WnHAGCrmpetwG0a2lG4K24+O6xbgbVrBghvMcKY0QtprEqOLZtN9wDAe3rP1KZwf2d7EIM3kHWBemGbCjhbIRBmpcM9To4zk/11GsZmkkLKPBGUVm79eDWZHYtuvLW8d0AaE1f+5fyH/TSnqoYiTva1rIIUu37+85llwo9+8Nf7ns2d06fZt4XNC3pNLD828WFcXiekuVJepmlrdwQ+9jtb4+ClZkh8lfGm+9yVOEevm2BPOrllATjogktM972AGIxwPP/dobkEpbQoHa8fBoW3gOxSFVGzHCpBHekDNTxsOWid0XgN5xuWJPHems= 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)(366016)(23010399003)(1800799024)(376014)(5113699003)(6133799003)(10067099003)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?OGtVR0xMMzdISUE3d3NrOVBGZEE3MjlvWUFZWDNhbVlNVUR3UjdvanUxc0hU?= =?utf-8?B?T3loTlJVZG5lMlVmNVZvRTVuN0NURTBFQXg4Zi9hcEd5NmlZc2VkYmVPMjlR?= =?utf-8?B?WndiUEdtN2N6bGtJUWhXR2FPVmZaQzh4aG5ibkVDd3RUM3lxQitacEhRK1ZI?= =?utf-8?B?OU93MUhpWXdjeWozWlB1anBKeEZNRTBiVitraGY3WDM4VTdZOG1VVnRRTjZ4?= =?utf-8?B?S3JqcktDM3luQkRpQmVKNmQ1Yk5wZThMZkpvdDhrQTcrVmp3b08vOUtBeUMz?= =?utf-8?B?SVVZdGNsQXRVUVdjOWJ1OGFXWmIzcnI0MjhocURnQVZvVHc4SzB2c25WNy9V?= =?utf-8?B?YWZSSXc1TUR4ZjBCaWJrUFZiMTd3b25PQ2E1eHZJSXNTdXdTVWxDUExwTmhz?= =?utf-8?B?a3dzdWdQZzBWdUNySkM4ZkxtZ1FaWjRULzdCNzRmdThlWmhsWWFYZmtGcC8r?= =?utf-8?B?TjgvRnU3L1FMWHlsMG5ITWdGNng3ZlpOaFBoV01OOCtaY1pxQmNHT09HV1Qx?= =?utf-8?B?WmNpbW5WU1JJQnFSaU1HaTZ6dFVCVkYyWGdram1EU1dXbk1zYTJydzZvLzFM?= =?utf-8?B?MkRNZGh0WndLV1I5Uk5iV2tuZWlMZWVtMjF2QUhoSmxjTWxDR2o2dnUwK2E1?= =?utf-8?B?SUYrdGpjSGEzSWdaemlwSUIwSEVYL1pUUjdmZmw4UFpmYitEcCsrSTNDSGF2?= =?utf-8?B?MG4rblFlTEMyc1ZZMUZiTlN5QkxiOTFiTHVHNmtqakJyN3NKd3VVWC9WZ0Nm?= =?utf-8?B?QjA5NHcrbnhQWFc0R3VmOEhjMzluWEVaRWxpR0orOWtJUVpTMFBVNkNDMGN2?= =?utf-8?B?RVU3dEFKSUZZUUtYZGkwa2FaQTBnU1Z5Yk9sNytzd05LL2YvUmVyRDJGYWpT?= =?utf-8?B?Y3J1VHhCbTlkQSsvN0ZvVEVXRnYxZEtSVW1FTWlBU2VjVjFpZ3ltS0RCUEpi?= =?utf-8?B?T2J3b2szYmlnZWYvQVpYQjZPTWI4Skt2UkNtU3FzQW1aRWlUR2VTYTJLUU1Q?= =?utf-8?B?ZExLRGt1Vmo5K3VtcXpEVWowaE5GUUhwcWRVWC9OTTVyZnZrWEF0YmdkZzli?= =?utf-8?B?aXVLazd5aDMzS1AzQ0FTenlaZExzVy9VNkw2L1pjUko0K0NyVjFlZ2dxc1cx?= =?utf-8?B?RFZVaEorRkFCTmdHWjE1NGYySGhBL0dmK1hsTzJFMVQrTVRyOVV3R2RYck9u?= =?utf-8?B?cHd2bkZKdGRTOVc5UFVqWC9pTDd3MU9Ud0NocmRWKzdzcEhKMUYrYWJaM3NI?= =?utf-8?B?RnZJRWlrZlNLZ2Z2UjZQcHlIRWErQUJPUzdZc3FuNTdaYVBYUWxwNTJLR0Ry?= =?utf-8?B?S1h6WCt1N0N1Q3JkYTNUbkFPK01WMkkxSUpVbnFtMjhicmpUdmh0aUxpeFdm?= =?utf-8?B?MWw5dFlQM2pwRG1ONVFMbnFNWDdSR202dWo1RFp0akNKTE5kZWZuZlkyL2lz?= =?utf-8?B?WlZjTE9CWm1vSGdGWlNYTERtU2ZwQVIvMUtCbGtralJFc1FZNGdPNWNJcVZM?= =?utf-8?B?MkxyTFBkSXd6NGVROExUMFBueVlnNDFaZE0zQ1lVMUY0UVR1QjN3cUJEU0Jo?= =?utf-8?B?eUE0VmJCYStuMzZJbExFRm5pWWE5ejQ4Q0FBUVpUVGE5WmVQTTZnL2JCMTJt?= =?utf-8?B?cmRoTjRGTVVrakY4UnhmekpNejNieU5zeGRMS3Y3RkpsemE4SXVBK3ZCMlZa?= =?utf-8?B?YW1BSDNQT1J0MmRyWGVwZ0oxRnZBMlpyU2JoTTk1VXdYUFhGY2tKKzh1dU5B?= =?utf-8?B?Y0JZZ3M0VFFUM0JYeGExVzRlVEJZWmtZNVVlYTdSRE1ZMG41ZXFPd1NBWmxw?= =?utf-8?B?eFBSQUVHeDJtb2VER2lSaUNQbVUrZi9LZVNSRWp5M2s3L0ZJKzRPb0s4S3pO?= =?utf-8?B?bCtiUjdqSGJwc1k3RVFKblFOUndPRmFmaXJaS2c2R0tGOXF1cWZIZS96UXMw?= =?utf-8?B?U0VaVmpnaG90bzdBMmMvK3k5ZUdJMXJUQjNlTFRrMW9DbFZDL0w3ZkFRNXpw?= =?utf-8?B?ckNjL0ZHSXNlOHliN2tyVkd5WGFDUUlwYWNBOXAvMC82WFlxRndndnhxa0F0?= =?utf-8?B?VURwSisrcXd1c3FNZjVJYmRiZE1jWlNTcE9WUUhFTzg3b1dPWFhNMk9aRjVI?= =?utf-8?B?aXk3Q0FVV0wwcllnYUpmUzl5SkdYdkIyd3VLbUlQYllKZUJ3QzN1UWszL3pq?= =?utf-8?B?UGlKSkI2cndUa1hmWjVhS3B6SExmd2FQcExUcTBPMDMza1U5NTJCbUs5Uzg1?= =?utf-8?B?QUtBbys4UEZoOVAzYXFIRUpDbHNFeUNvanV0MHZtQXFOWjZOZk5RaXpzZi9E?= =?utf-8?B?Vzg5Z2ljNjJ1eW1qMXJOQ3NwU1FZVW9NZzZTekNuSXhDeU95Q2QraVdrT2VD?= =?utf-8?Q?oDKjTqHkb+a6slc0=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 843d6766-db5b-458c-0521-08df1991a848 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Sep 2026 16:42:29.5641 (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: JSBvP3btw+BXOOngCET5SW5QFi/zMMqglB/3ON5BD+72KE6jE9PRNRxbBZodHlx7K0YQ6TPCxVptv6yeE3MUVKZhcbbcDHa4FiuNUZjzyWs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB11882 FYI: this doesn't apply to hci-7.4. Also see below. On 9/23/26 7:20 PM, Denis V. Lunev wrote: > From: Denis V. Lunev > > A live QEMU update kills a VM whose memory backend has host-nodes when > the emulator cgroup no longer allows those nodes. The old QEMU saves its > state, the new one exits during startup with > > qemu-kvm: cannot bind memory to host NUMA nodes: Invalid argument > > and the guest is lost. > > Guest RAM survives cpr-exec as the same anonymous mapping, carrying its > pages and its memory policy. host_memory_backend_memory_complete() does > not know that and treats it as fresh memory: it calls mbind() with > MPOL_MF_STRICT | MPOL_MF_MOVE and preallocates again. The exec keeps the > PID and the cgroup, so if cpuset.mems has been changed to nodes outside > host-nodes since the VM started, mbind() returns EINVAL and QEMU exits. > Where it succeeds, it only walks or migrates pages that are already in > place, while the guest is stopped. > > Record in ram_block_add() that a block was reused on cpr-exec and skip > the NUMA binding and preallocation for such blocks. This is a property > of the block rather than of the incoming mode: file backends get a new > mapping after the exec and still need mbind(), and memory added later > keeps the full path. > > Signed-off-by: Denis V. Lunev > --- > backends/hostmem.c | 4 ++++ > include/exec/cpu-common.h | 1 + > include/system/ramblock.h | 2 ++ > system/physmem.c | 6 ++++++ > 4 files changed, 13 insertions(+) > > diff --git a/backends/hostmem.c b/backends/hostmem.c > index 35734d6f4d1..acb1bc8dfcb 100644 > --- a/backends/hostmem.c > +++ b/backends/hostmem.c > @@ -363,6 +363,10 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp) > if (!backend->dump) { > qemu_madvise(ptr, sz, QEMU_MADV_DONTDUMP); > } > + /* Inherited memory keeps the policy and the pages it had before exec */ > + if (qemu_ram_is_cpr_reused(backend->mr.ram_block)) { > + return; > + } Instead of having to keep the state in a 'bool' flag for each and every block, won't it be enough to just do: bool reused = cpr_exec_is_incoming() && memory_region_get_fd(&backend->mr) < 0; Andrey > #ifdef CONFIG_NUMA > unsigned long lastbit = find_last_bit(backend->host_nodes, MAX_NODES); > /* lastbit == MAX_NODES means maxnode = 0 */ > diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h > index 9b658a3f48f..155270b96a7 100644 > --- a/include/exec/cpu-common.h > +++ b/include/exec/cpu-common.h > @@ -96,6 +96,7 @@ bool qemu_ram_is_migratable(RAMBlock *rb); > void qemu_ram_set_migratable(RAMBlock *rb); > void qemu_ram_unset_migratable(RAMBlock *rb); > bool qemu_ram_is_named_file(RAMBlock *rb); > +bool qemu_ram_is_cpr_reused(RAMBlock *rb); > int qemu_ram_get_fd(RAMBlock *rb); > > size_t qemu_ram_pagesize(RAMBlock *block); > diff --git a/include/system/ramblock.h b/include/system/ramblock.h > index 87e847e184a..beaa6b23dcb 100644 > --- a/include/system/ramblock.h > +++ b/include/system/ramblock.h > @@ -43,6 +43,8 @@ struct RAMBlock { > QLIST_ENTRY(RAMBlock) next; > QLIST_HEAD(, RAMBlockNotifier) ramblock_notifiers; > Error *cpr_blocker; > + /* Memory was inherited over cpr-exec rather than allocated */ > + bool cpr_reused; > int fd; > uint64_t fd_offset; > int guest_memfd; > diff --git a/system/physmem.c b/system/physmem.c > index 6f89232d257..4d649bc57e2 100644 > --- a/system/physmem.c > +++ b/system/physmem.c > @@ -1668,6 +1668,11 @@ bool qemu_ram_is_named_file(RAMBlock *rb) > return rb->flags & RAM_NAMED_FILE; > } > > +bool qemu_ram_is_cpr_reused(RAMBlock *rb) > +{ > + return rb->cpr_reused; > +} > + > int qemu_ram_get_fd(RAMBlock *rb) > { > return rb->fd; > @@ -1942,6 +1947,7 @@ static void ram_block_add(RAMBlock *new_block, Error **errp) > /* RAM block is being reused on CPR exec */ > assert(ram.length == new_block->max_length); > new_block->mr->align = QEMU_VMALLOC_ALIGN; > + new_block->cpr_reused = true; > } else { > if (ram.addr || ram.length) { > error_report("CPR mode=exec wasn't requested, but ram "