From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazon11020100.outbound.protection.outlook.com [52.101.84.100]) by lore.virtuozzo.com (Postfix) with ESMTPS id 1501C80067 for ; Thu, 24 Sep 2026 12:13:52 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b7VK9KRBndTNus9wbIxliT4sAZvyh9uaZIW3YvKlpRjK4qhBHgIUuHO64ijKKT3E65Qlqz9wToKS5fUi5MYkQB3/oqfSWgkIDMrSRvgU6xywSaBA0FWgpDEkhXbnEaO2gTPcbV4OToXOG1Q/g5lPdOqSOhQTK3ge096G5rCpJ7hMaSngg35eR9bDcW8/U03QRmfD5h/bq/ydj2A+fwbP0AQkoFzD5V8v0XvlIono6kk2jz2PeGwmkoJ/UmumJ+TU9u46C+WNJt+fgRXKdy/1SstLcO3v3NeSXl3ekelJ6ZgsNsoqIAxw6mpijNo4eSyHHHa/QBL38vFZH0tQVofMAQ== 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=cssG1Kr/6CBu18tq2bYQTeUB6UEqaiFym4rdaXKKRdo=; b=rQpZIVkdCHGfEf7PAD3U9FljhuZAFJk/LJPtoYkyntA+Gd0aHM0TF1Ay5U00jBJXHPvUdouoUpHgzONL9Y7gkbCYMcIwBcM9vufH1fqmOqnwxo21bZAolJm4MH/vT+YpGyDlpIxgokCNh1vrHrVDSKAPdPLtVksqrdTS3lVpsaZGNc9D5yCr6/rCCsyR8Qai0wIZV2RQ7WrOGi5dFPEMOWef5hdQT3lCRFWdbfG0ENUnrRGzg9dYkb7EQS8z3v6xvg7UMl8bMcGSBreDuTpO6m+SwweldVNraZ0q6xBReVFN5n+rl3tC2XIevnRr86rPV1Xva0U1OBtVH2fZU+cjSw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 2a00:1450:4864:30::10) smtp.rcpttodomain=virtuozzo.com smtp.mailfrom=openvz.org; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=openvz.org; dkim=pass (signature was verified) header.d=openvz.org; arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.onmicrosoft.com; s=selector2-virtuozzo-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cssG1Kr/6CBu18tq2bYQTeUB6UEqaiFym4rdaXKKRdo=; b=eONIS8JFLKYhKrImYpLIpSPDh7yZVSzgtpo62bMJRaIPj8Dxt57pkRFRIZCqdP1n2fNZPAX3BNgox9fSRquDJnnQ4MJyAa5Vp6gYMd8LGhdfb00o0zzEl6wzHAvSReSQVh8U/pSjlumowM9mX/byrCSISGojTVWg3hNwmMXP6Og= Received: from DUZPR01CA0093.eurprd01.prod.exchangelabs.com (2603:10a6:10:4bb::21) by VI1PR08MB10074.eurprd08.prod.outlook.com (2603:10a6:800:1be::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.18; Thu, 24 Sep 2026 12:13:45 +0000 Received: from DU2PEPF00028D02.eurprd03.prod.outlook.com (2603:10a6:10:4bb:cafe::a8) by DUZPR01CA0093.outlook.office365.com (2603:10a6:10:4bb::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.451.18 via Frontend Transport; Thu, 24 Sep 2026 12:13:45 +0000 Authentication-Results: spf=pass (sender IP is 2a00:1450:4864:30::10) smtp.mailfrom=openvz.org; dkim=pass (signature was verified) header.d=openvz.org;dmarc=pass action=none header.from=openvz.org; Received-SPF: Pass (protection.outlook.com: domain of openvz.org designates 2a00:1450:4864:30::10 as permitted sender) receiver=protection.outlook.com; client-ip=2a00:1450:4864:30::10; helo=mail-wr2-x10.google.com; pr=C Received: from mail-wr2-x10.google.com (2a00:1450:4864:30::10) by DU2PEPF00028D02.mail.protection.outlook.com (2603:10a6:18:3::6ba) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Thu, 24 Sep 2026 12:13:43 +0000 Received: by mail-wr2-x10.google.com with SMTP id ffacd0b85a97d-485933b24c3so1314759f8f.0 for ; Thu, 24 Sep 2026 05:13:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1790252023; x=1790856823; darn=virtuozzo.com; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cssG1Kr/6CBu18tq2bYQTeUB6UEqaiFym4rdaXKKRdo=; b=LymoznQsC0hFUCU7TN/QV7k0dtM9BOfXfuuQCUrD2iS5MagqmFj5w9T7tsOR9d/dQC TOKwEhch07BBsHW5TI1MCVzbIaYVVaDYIlehUlq45QlNc6Dm1/Nt2dp8MqpdVtNsa/EQ Zm/18csEEVN2v1vJ2rVWsfrwpQomEqcs4N//0H4Rxwj6b+tn5ngiBKN5USoqvm52/wCD UjitfooRrlbzr5pZwzEcas68nFJAwwoj7UhpTidRRVjxT2+a8HQptqzp64JbMAX6YmL4 HmV86Scvav89HFt4Am6Qc/R83Uisujxd1Zmlq6cWtlyFrZruuXm/rn5ApbthOSyR/+XG vaYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790252023; x=1790856823; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=cssG1Kr/6CBu18tq2bYQTeUB6UEqaiFym4rdaXKKRdo=; b=ZAZmB4uf8CSkkj5dmlcvDdxleohhs8KXxWrKTEGGk1w2DGuocGQkUj4VXKSZK9RB7G nHqiGG26vmHBQZxyCiKE/X9Qe7VEg5NZv6ZhI/BOIDr2eU8QPpOYeRssfM3OShv4n89f bN9kMVBCd9w0ELxQzvPaxIGGY6mZXYch+YUPKZ5Gb/J6mofennLUIT2yUEwfI1bAX00n Ttk2c4Hu3S8s886nyJ8XynA98nJgkGZq0pfC5YWVZznlP5VVP39Ad5Tsc6m6A8dhdrQi uVELfxQYYYBV2l3/WGjXRTDaAGgAWXkmcEOdAEKGlJvvuPPVEXir/aRA+1Vpexozc4PZ W0Ww== X-Gm-Message-State: AFuF++njEgGKBI5DTfbG5YKy/rG17i5hWE2TT91JZbDCB8KkdhaPleqF V3bofI11uacmcPdRJLWn2f8jlTKJkiq3YehDsM+jbR5eQiUaxGyrSmLf7PQwYcXwzw2p5JuVN+h 0nN3HEVE= X-Gm-Gg: AYBFou05NQKly8drHPu8A5qQwK1ZShwx9oqOduy6ns4K6Mf1kPmZmXZDj7BH8pek4BP r34IuTnw4SWR0MtZh1LCl3owibIyEyGFIZDLKuaTHvghLMKHzconvk6oKTb/FG4zeqgRwvCUE+4 nVomWcaYAClZVMNB8oVN6pVWNHnj8QzB/GE7/yz5bG3Oa1cxAbC/VNGe3qtd84P1F7ERdwChcOR WyqYbCR91HjFHQLHe4f5JMYbvTXcuW24GK4uuQTaEm0kVlbd03YLUMYnMk2TFjvcI5IqNeIm9md T94QhOHnDEAio5kVjmZQxTTEiojq6BppKOD7CkonvceI3+2Y+GTn2lz/8XPC+2DiI2d8qOamPyi fX6viprti6oPo+xL8bMrgb5w/nvQCYgCc7cIlVchDVsuxnInHZ0BSHB1ss8i9BIuqTxImv1n0y4 khAvVq1LV4wDjSRQUOdmCWQV+G96NjIrIdRIL3wM+GVUk6PHVb3Em6H8eTgXaiZkHAymM= X-Received: by 2002:a05:6000:61a:b0:487:6f2:1a4c with SMTP id ffacd0b85a97d-488716d0b9amr3840655f8f.25.1790252023243; Thu, 24 Sep 2026 05:13:43 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:f9ec:9c2f:7d67:4ad8]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4886876c500sm15067189f8f.19.2026.09.24.05.13.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2026 05:13:42 -0700 (PDT) From: "Denis V. Lunev" To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@virtuozzo.com, "Denis V. Lunev" Subject: [PATCH hci-8.0/hci-8.1 1/2] migration/block-dirty-bitmap: fix postcopy abort with bitmaps on several nodes #VSTOR-147066 Date: Thu, 24 Sep 2026 14:13:38 +0200 Message-ID: <20260924121340.4119538-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260924121340.4119538-1-den@openvz.org> References: <20260924121340.4119538-1-den@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-EOPTenantAttributedMessage: 0bc7f26d-0264-416e-a6fc-8352af79c58f:0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PEPF00028D02:EE_|VI1PR08MB10074:EE_ X-MS-Office365-Filtering-Correlation-Id: 2c634729-6786-408e-e61e-08df1a354723 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 0 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|9140799003|61400799027|6059299003|48200799018|43022699015|10067099003|22082099003|18002099003|55112099003|16102099003|5063699009|56012099006; X-Microsoft-Antispam-Message-Info: dK5/e7kvhV3fgLqDuOpGMlessd41OYKL++XYR+9G2gqWJlaWkBNI+IfAWwU8hQIc4MXagVM1kqMiNkhqir36QneTAb0/JtUC0HvZofqABwAM6NaPKzacnlQkJE3Qo34MTDUM+t+eKfOatSbZOAMhFHPX9zC55UvlbossLmMbEijw+iPqX9QYu8cQut+hTTGdKI1GbreFcHQHR72ExbSPu9KkXiJTzqsmJMYM1cPtsNxwEBd/PiZXZ/DrnoNREEq8T/TR1nC1tt/W8wK7VhKMPT7GgULXlAVUdQk1BpNudR2hJA/7eBLG1jU1sye7BzwPglScJhwL7dayur+CPNY4qToaWwKlihFF9VvZXSyCjyeJRCwx7oKvKkq27M9VBHjwwHXCCQkCF5iSDmsDx/qjytdEkaIhstol4FI4MuzUsKFK5c3zwYgTLKQy/UUWFACeTrVKyq2aFbyaDFAPNz24m+T8GxLSoUp3i3kPWyFVk1ZIhC53dUSbuDWJ7jJqQtf54i5LQRA5JUr8mMbv0UDHcocXay+P6ajt7LhDajWyOFoCo7JKjIWucABQGsWMZqrDBfTkouUBKFbNxEf/v/ybi0rHzzCSxCDAeyIGDG+rB3F545CmHb8+ZX5+Q24NK+P0o1UbyUfFHnhs4sIntCZRax8Jg/racY+pyAmdRRng+0no5vqgnirp6wC/tbfaXJTeWhJuWavAXrBzJC2Sr9GsWmkLwUK1ehZXx1VaxoA25fC9z9USQmB3+3u4cpcyZ/l00rQ312bD2cUc7ZbJ6wyrHRUxIz4aHXcGEcuFQp70N53SgWBpMIkpvngOZd0nOb4ncjcSvDOQhhBEQ7pDprRJp8m1HPsU6RlvARlYuzcWxm3CX0FZzMm5VEFs+tFf5LgsURt/w5tGS+MXHDUHu2x66Q== X-Forefront-Antispam-Report: CIP:2a00:1450:4864:30::10;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wr2-x10.google.com;PTR:mail-wr2-x10.google.com;CAT:NONE;SFS:(13230040)(82310400026)(376014)(9140799003)(61400799027)(6059299003)(48200799018)(43022699015)(10067099003)(22082099003)(18002099003)(55112099003)(16102099003)(5063699009)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: yJRAJOHzSwhGBePLM4HTTU5HH1ljF2+SB7q3yt2uJXvvhb9jFcSWfU74yeDlW/gT4xg9G1PVNrfioUOZU+qSUY+ISuP9EW99gu+0ydR1bN2Pu2YeNIECdlSKy8Dj7flV+Kk8OBOvypHVoYC3hpzKmgsNtv9nfqZTxfYn2toZ3owg1pO1vkccZZ/DC5kEnmZ/xueOn8iJMdDlTCkZZZiNC+AUkSAyieEbOcijI1IJ7H8lCjpr098KPJn5SZ9PjTR5UFkZxzf+VY/mkOXRaphIteCqb8zKTaFuC/d8wAmSrOla94a5xfnYpAkPLAibEBaK+FD+40Rj2+1wd72LgnCZu1L4gQAMS2De862s1/uehcgpHcTQ5BLCZ2pxpIiVNYkNHn8BvKTTBmYbYzwNgvU7WbMo2aT2PWp/BUVcuRJwrk+rbL1PztqICKdxMzVmw6Yl X-ExternalRecipientOutboundConnectors: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Sep 2026 12:13:43.8780 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2c634729-6786-408e-e61e-08df1a354723 X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-AuthSource: DU2PEPF00028D02.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB10074 List-Id: From: Denis V. Lunev With dirty bitmaps on more than one node, the source switches nodes during the postcopy bulk phase and sends the node name again. The destination reads those chunks in the postcopy listen thread, which does not hold the BQL, and resolves the name through bdrv_lookup_bs(): qemu-system-x86_64: ../block.c:6400: bdrv_lookup_bs: Assertion `qemu_in_main_thread()' failed. The bdrv_find_dirty_bitmap() call right after it needs the BQL or the dirty bitmap lock as well. Taking the BQL there would deadlock: the listen thread holds s->lock, and dirty_bitmap_mig_before_vm_start() takes s->lock with the BQL held. Every node and bitmap that a non-START chunk refers to was set up by a START chunk, and those are loaded under the BQL during setup. Record the node alias there, and resolve all other chunks against s->bitmaps instead of the block graph. Bitmaps on a single node never resend the node name after setup, which is why migrate-bitmaps-postcopy-test does not catch this. Fixes: f791bf7f93f2 ("assertions for block global state API") Signed-off-by: Denis V. Lunev --- migration/block-dirty-bitmap.c | 59 +++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index 9c8c308773d..d17eec412bb 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -136,6 +136,7 @@ typedef struct DBMSaveState { } DBMSaveState; typedef struct LoadBitmapState { + char node_alias[256]; BlockDriverState *bs; BdrvDirtyBitmap *bitmap; bool migrated; @@ -861,6 +862,7 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s) } b = g_new(LoadBitmapState, 1); + g_strlcpy(b->node_alias, s->node_alias, sizeof(b->node_alias)); b->bs = s->bs; b->bitmap = s->bitmap; b->migrated = false; @@ -1058,6 +1060,54 @@ static int dirty_bitmap_load_bits(QEMUFile *f, DBMLoadState *s) return 0; } +/* + * Only START chunks are guaranteed to be loaded under the BQL; the rest may + * come from the postcopy listen thread and must not touch the block graph. + */ +static BlockDriverState *dirty_bitmap_load_find_bs(DBMLoadState *s, + const char *device, + const char *node_name, + Error **errp) +{ + GSList *item; + + if (s->flags & DIRTY_BITMAP_MIG_FLAG_START) { + return bdrv_lookup_bs(device, node_name, errp); + } + + for (item = s->bitmaps; item; item = g_slist_next(item)) { + LoadBitmapState *b = item->data; + + if (!strcmp(b->node_alias, s->node_alias)) { + return b->bs; + } + } + + error_setg(errp, "Error: no migrated bitmaps on node alias '%s'", + s->node_alias); + return NULL; +} + +static BdrvDirtyBitmap *dirty_bitmap_load_find_bitmap(DBMLoadState *s) +{ + GSList *item; + + if (s->flags & DIRTY_BITMAP_MIG_FLAG_START) { + return bdrv_find_dirty_bitmap(s->bs, s->bitmap_name); + } + + for (item = s->bitmaps; item; item = g_slist_next(item)) { + LoadBitmapState *b = item->data; + + if (b->bs == s->bs && + !strcmp(bdrv_dirty_bitmap_name(b->bitmap), s->bitmap_name)) { + return b->bitmap; + } + } + + return NULL; +} + static int dirty_bitmap_load_header(QEMUFile *f, DBMLoadState *s, GHashTable *alias_map) { @@ -1086,11 +1136,12 @@ static int dirty_bitmap_load_header(QEMUFile *f, DBMLoadState *s, s->bs = NULL; } else { bitmap_alias_map = amin->subtree; - s->bs = bdrv_lookup_bs(NULL, amin->string, &local_err); + s->bs = dirty_bitmap_load_find_bs(s, NULL, amin->string, + &local_err); } } else { - s->bs = bdrv_lookup_bs(s->node_alias, s->node_alias, - &local_err); + s->bs = dirty_bitmap_load_find_bs(s, s->node_alias, + s->node_alias, &local_err); } if (!s->bs) { error_report_err(local_err); @@ -1141,7 +1192,7 @@ static int dirty_bitmap_load_header(QEMUFile *f, DBMLoadState *s, if (!s->cancelled) { g_strlcpy(s->bitmap_name, bitmap_name, sizeof(s->bitmap_name)); - s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name); + s->bitmap = dirty_bitmap_load_find_bitmap(s); /* * bitmap may be NULL here, it wouldn't be an error if it is the -- 2.53.0