From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807645; cv=none; d=zohomail.com; s=zohoarc; b=aILSZUa3wXDu96KsF3fykUlFviDM7E+ohFSPGPDiWL9peNEfa0DqkpfwZ666agVmnEqI2N0eJD5SIfVCh0PKJhVBTHR7TBAIjnd/mx9nnWGPHAL4QXblTOZCCyKjXHSUJJpfUruXPnsdNNdxcaYWWd827OZdp0MKADgqoUkaXJ4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807645; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=h246oOnwhMfIwpoInL9ueM4/KFf2GZfScnXDka7dbNo=; b=nTF24Zt8G0GAy3r+IlyRExkzhlslnH56sZBizHpZ4CAA4dfvEn8TfPRY1K4/kcjXqOSH2RuW9o/956kODN10bdwU6h1aEyuAuxPPiqszM3vMepDPsEFrfmJN/S+cf+aYzcrOgMwHLoAeMDNZ977aXsMGoe4T2Qb87HYNcc2725I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807645863348.34381356274434; Tue, 30 Jun 2026 01:20:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weThe-0004vz-HK; Tue, 30 Jun 2026 04:20:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weThc-0004vl-IF for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:20 -0400 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weThZ-0003Kd-BA for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:18 -0400 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-2c8c30492a0so35672345ad.2 for ; Tue, 30 Jun 2026 01:20:16 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807616; x=1783412416; darn=nongnu.org; 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; bh=h246oOnwhMfIwpoInL9ueM4/KFf2GZfScnXDka7dbNo=; b=KlWWpkdTAU85+6Z8i2o6Psq3AJSwwQIfyyb7Fo4uXrx+V1zM3+GCrPVeobW43gdUc8 CE/S25bMKIsUxMuKb2XOMM0v8v47vkX6acqJHKVJltf1nQSliTNWPDhGe2kxQrGike29 5jaXH05YkVBuKnBLGYFDGLFCE/sDlVMA1DbyZ0S8hRNDWyc7KcTKCShtqwUjJ9YalCdc qxWOjEWmRZ0LWB8cxWnSnUgXo2ZCV8f7/WLLGWxh0C+RLA77jV8IyO/d74Ol1xezigIk Cd9GOswwjIn18ebNq7mSWIW3zOW8wp+ZSPf6AATNNxXSaGaQDFGpY6t27mykdfMSG0Ho OSig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807616; x=1783412416; 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; bh=h246oOnwhMfIwpoInL9ueM4/KFf2GZfScnXDka7dbNo=; b=NwO3X3ZAuRKJTPwRQbA2tOOZJZgdTPb1Q9VYr/eqtjQ9xz6YuT+F+f30dQQeG2wcNr Wgjp5M32AqWeFP5H4+FhX55WOp2yEKn/mzQS3PZ3RupTqDN+RQTur7EoGOT2nA6G0pjg JP06huawCitfDvly8foUxl+zPcLti3r4hfs/nQvmq29cvbdx0LEFcyiRDTLNRkgfh/pO o5UlCT+bX0swAnIm6p+eY/5t1vuHtu7MptqEcdibpTqgh2Hc2LhALYc6kDuN0x2yMGIw qOya+dAqFgdgCXaA70pUWsXS5IM2ysnzW8SwKrYIjAknwklGotXdVowd6MZ06hnLZtLI LNvA== X-Gm-Message-State: AOJu0YwczuvEZrYlUC2Htkk0t9AoPYPUO9gI9aGd9umiYbV0dUKX4VZK BaWd7yJ4FApXIP/frpz/6r4qKhTo1EaVFU748On/vQeYqiYNZAyEaMU3mc5i8I4w X-Gm-Gg: AfdE7ckm1GKC+6s/BYpu9Pq20kuD3vbFR3voTU4XntGp1pJJmzMdpiNHqbIEAgIpv/e KToBm+ZxfSNFfepsNnNCNNOAHrAKPOpHQrMGeXlbq+uQrcunKXQzWZoYEP92/occ+OMklbFkJ0a jdcndFF6Y59Q22ims2K/jTbewC22WpVZBgEPlf7WeuyVQ1F0bN4Mpd4kYyqJ69ddYos2OCaXV43 q4RMmbagrdzm3+jVgnWZ181oww4yNnOYL+l/BiGxwbdsfcZXDDrl/iRAoDBKykQiSN8BarAEx6D 72YLb4ZQvkkmb9IUOfHNsC37NJwUlAAUBuWch8syANR/JnKLPVcH6xqcSyVVdNbgDv8gTRg6p+f tq6r9eP/d/lFwVPjg9W3tkBnfK1OnRQXPsOkccJv2ToL+BPQJMj+m6qaTzQsVbO2E+A/94xrSM0 t/m6vS+OAqpdUQ+j6ADwG3f2xyjHHF43WeUgr9ubbDIPY= X-Received: by 2002:a17:902:e550:b0:2c9:b1ed:eb5d with SMTP id d9443c01a7336-2ca2ed46d69mr20322655ad.47.1782807615882; Tue, 30 Jun 2026 01:20:15 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 1/7] migration/tests: remove capability conflict test postcopy-ram+mapped-ram Date: Tue, 30 Jun 2026 13:49:34 +0530 Message-ID: <20260630081940.611092-2-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62e; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x62e.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807648247158500 Content-Type: text/plain; charset="utf-8" Remove the test test_validate_caps_pair, which asserted postcopy-ram and mapped-ram capabilities cannot be active together. The new fast snapshot load feature is exactly this pair of capabilities active together, with the following patches in this series, this combination will now supported and be functional. Remove the capability check that rejected mapped-ram and postcopy-ram being set simultaneously, as this combination now corresponds to fast snapshot load. No replacement test for fast snapshot load is included in this RFC. A test exercising the full save/load flow will be added in a follow-up. Signed-off-by: Aadeshveer Singh Reviewed-by: Peter Xu --- migration/options.c | 6 ---- tests/qtest/migration/misc-tests.c | 52 ------------------------------ 2 files changed, 58 deletions(-) diff --git a/migration/options.c b/migration/options.c index 5cbfd29099..16583651ac 100644 --- a/migration/options.c +++ b/migration/options.c @@ -727,12 +727,6 @@ bool migrate_caps_check(bool *old_caps, bool *new_caps= , Error **errp) "Mapped-ram migration is incompatible with xbzrle"); return false; } - - if (new_caps[MIGRATION_CAPABILITY_POSTCOPY_RAM]) { - error_setg(errp, - "Mapped-ram migration is incompatible with postcopy= "); - return false; - } } =20 /* diff --git a/tests/qtest/migration/misc-tests.c b/tests/qtest/migration/mis= c-tests.c index ec6d438cdc..4e0deb7f18 100644 --- a/tests/qtest/migration/misc-tests.c +++ b/tests/qtest/migration/misc-tests.c @@ -201,55 +201,6 @@ static void do_test_validate_uri_channel(MigrateCommon= *args) migrate_end(from, to, false); } =20 -static void validate_caps_pair(QTestState *from, - const char *first_capability, - const char *second_capability, - const char *expected_error) -{ - QDict *rsp; - const char *error_desc; - - migrate_set_capability(from, first_capability, true); - - rsp =3D qtest_qmp_assert_failure_ref( - from, - "{ 'execute': 'migrate-set-capabilities'," - " 'arguments': { 'capabilities': [ { " - " 'capability': %s, 'state': true } ] } }", - second_capability); - - error_desc =3D qdict_get_str(rsp, "desc"); - g_assert_cmpstr(error_desc, =3D=3D, expected_error); - qobject_unref(rsp); - - migrate_set_capability(from, first_capability, false); -} - -static void test_validate_caps_pair(char *test_path, MigrateCommon *args) -{ - g_autofree char *serial_path =3D g_strconcat(tmpfs, "/src_serial", NUL= L); - g_autofree char *cap_pair =3D g_path_get_basename(test_path); - QTestState *from, *to; - - args->start.hide_stderr =3D true; - args->start.only_source =3D true; - - if (migrate_start(&from, &to, &args->start)) { - return; - } - - if (g_str_equal(cap_pair, "mapped_ram_postcopy")) { - const char *error =3D - "Mapped-ram migration is incompatible with postcopy"; - - validate_caps_pair(from, "mapped-ram", "postcopy-ram", error); - validate_caps_pair(from, "postcopy-ram", "mapped-ram", error); - } - - qtest_quit(from); - unlink(serial_path); -} - static void test_validate_uri_channels_both_set(char *name, MigrateCommon = *args) { args->uri =3D "tcp:127.0.0.1:0", @@ -309,7 +260,4 @@ void migration_test_add_misc(MigrationTestEnv *env) test_validate_uri_channels_both_set); migration_test_add("/migration/validate_uri/channels/none_set", test_validate_uri_channels_none_set); - migration_test_add_suffix("/migration/validate_caps/", - "mapped_ram_postcopy", - test_validate_caps_pair); } --=20 2.54.0 From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807670; cv=none; d=zohomail.com; s=zohoarc; b=KQDQjUZ3JAVnPACChzLQBQ90f/NtWrouy0jgqwHe+114tHYXTz7i0pAMmfWDLX3XoXq+4EqFhGBqvFwe2iDQtQ+jgXwLEAtc2By4vlV17XzvMAeIvnoq78388b04xNnPcTLAlbJnlcwVfrNBmDisJx//Jsz2FGCPwed0Ax7BgHM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807670; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=HLw+7vaR8va6nbyyKlMzc8R1dshwKiZRd0bebnyPoPw=; b=OMA67Hf8GDj6ICSE8UAtqtu5dNswioGKlam1oUPuQTt4Eh4jpVsYiDDihLfFAoFociBhx0vh3eFhD1hgK+cqV0uezf3S9VfEBlsMv/yeiff//U/IhlnRXi3GkXAzXyGckp8PlbiobjahJ7vnMtYqjdnhjeJuSjRQ7hkQheaGJ1I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807670082116.03314171914133; Tue, 30 Jun 2026 01:21:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weThr-00055O-IH; Tue, 30 Jun 2026 04:20:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weThl-0004zQ-6v for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:30 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weThj-0003Q6-DF for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:28 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-2c82538b6c0so24795005ad.2 for ; Tue, 30 Jun 2026 01:20:25 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807624; x=1783412424; darn=nongnu.org; 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; bh=HLw+7vaR8va6nbyyKlMzc8R1dshwKiZRd0bebnyPoPw=; b=NAHkiGOSoke+F7zoDIlvIuq5cDljQEVeEl5j1YLy57MTGr35Z/+1t1ii1SGN9KlqXR vQxUI8Yws97Tdin3t7W9vaIOfA47f1eDoZzoLem72w84+xmWar4qTcgPwlP9I51DNiH/ 5OB7dLSukLZoZnpD+h9GVL4dIMLvu99VvXLW+jzK3lAAHvhCu3GrbsaiMP/IkKoMqn56 cwzpSvNBUHLfGKJKEo89RoshCpwwuG4I3J3vuHUcWSi24pHFHqvwUG7L0jycQ6sCuQuk Ie8k9MRNBv7n0PeSPQ8nqEIQMKvO/cPBtlOxT0yVLQ28bqFf+CPtqKWCvsk25KoRv80H GDWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807624; x=1783412424; 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; bh=HLw+7vaR8va6nbyyKlMzc8R1dshwKiZRd0bebnyPoPw=; b=r728j51IiIN1kqK0ZiO+BdavDSjhWEr9+7QK8UXwpUlrW7RVxMB3DGWQbc3sAJk4Sc KFlMj9jwPTcC/4d8uJzoLuiHc+RIMKpW2lFXt473RJ0J7shlvRObkXC1rqRqxEK+k0F5 wly3pYagFPIhqXv4yqxPbiY9tijftOiNHpN1wVlGnsRQ8oaBxStVRcFmiIuT7S1snmYR 3KA8z5l1qpxnju6gdPInaJGVM67DENPWky63I1wm7Ga96VAv3xwjrii7xXWqgCCOcdNL 3eHLJGgcv/i+JNZI+SWoNjZ4qGSnO68sRJKwiZbnJS3Mxv9jJ90cBJmVhhiGyLbpj7IW gNXA== X-Gm-Message-State: AOJu0YzGYlYySehJO1lvyX/TOJjp/bbpmYNgEw54tJxOW/8rjw7PcZiE OrQDzXmV68PIDEoWIgMqW3LrfGwQtkSOK717bUuWxJb+O2qmOkUeRI4Z6DFevS4M X-Gm-Gg: AfdE7ckNBMQb2xyUI20BU9iG3j6NM25ypq4jBXjkn3P5x3eyTFMAzlRVlNV+ZWHTf6O 1Lf1LdESH12SeYmaLR3vaL5Y+GgzI744WvrtQac5faDz105bUo7r4HlhPU01jF009VEgWRFT5Up BJ5pv3IELhHxnkzYDBRsCqUPDIVhBzVC9XZXnk1pFAsSN4+zsdWd2PhjSw1j4LHgXpagiUNCc0s iJX/580IgsckzP+V9YxLIqvOL08/UDnV4HkQh1nnjNEHI1vsfzMnI7PO9GyK/lOJc7t9oH8m6vj p6uzKeRKHd7n4VC2Yy2eo8lEBwdk+0RH2Bg6LMf5cBDKr1UOqnCi5hYtB4TqgvP7rIxIAnLmpv7 dWMh40yI99lRPfvTI2Q2dahACI5U6kzbGXXCSDADZoGYYtQ2A5kceFQmOLH81kCrYqJCmumaoOr TohR4Dl5/LX6FwrMGRfg1sQzy5/CDuAtysOaPeF3xIEuM= X-Received: by 2002:a17:903:2441:b0:2c9:e266:e32e with SMTP id d9443c01a7336-2ca2ed2c766mr20580475ad.47.1782807624532; Tue, 30 Jun 2026 01:20:24 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 2/7] migration: Propagate error in postcopy setup functions Date: Tue, 30 Jun 2026 13:49:35 +0530 Message-ID: <20260630081940.611092-3-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62f; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807671684158500 Content-Type: text/plain; charset="utf-8" Modernize error handling in postcopy_ram_incoming_setup() and postcopy_temp_pages_setup() by replacing error_reports and local error handling with standard Error propagation. Replace use of strerror() on errno with error_setg_errno() for modular handling of errors and change return values to -1 on failure as no caller checks the actual return value. Signed-off-by: Aadeshveer Singh Reviewed-by: Peter Xu --- migration/postcopy-ram.c | 41 +++++++++++++++++----------------------- migration/postcopy-ram.h | 2 +- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index f5ef93f193..96a65aa976 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -1464,10 +1464,9 @@ retry: return NULL; } =20 -static int postcopy_temp_pages_setup(MigrationIncomingState *mis) +static int postcopy_temp_pages_setup(MigrationIncomingState *mis, Error **= errp) { PostcopyTmpPage *tmp_page; - int err; unsigned i, channels; void *temp_page; =20 @@ -1487,11 +1486,11 @@ static int postcopy_temp_pages_setup(MigrationIncom= ingState *mis) temp_page =3D mmap(NULL, mis->largest_page_size, PROT_READ | PROT_= WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (temp_page =3D=3D MAP_FAILED) { - err =3D errno; - error_report("%s: Failed to map postcopy_tmp_pages[%d]: %s", - __func__, i, strerror(err)); + error_setg_errno(errp, errno, + "%s: Failed to map postcopy_tmp_pages[%d]", + __func__, i); /* Clean up will be done later */ - return -err; + return -1; } tmp_page->tmp_huge_page =3D temp_page; /* Initialize default states for each tmp page */ @@ -1505,11 +1504,10 @@ static int postcopy_temp_pages_setup(MigrationIncom= ingState *mis) PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mis->postcopy_tmp_zero_page =3D=3D MAP_FAILED) { - err =3D errno; mis->postcopy_tmp_zero_page =3D NULL; - error_report("%s: Failed to map large zero page %s", - __func__, strerror(err)); - return -err; + error_setg_errno(errp, errno, "%s: Failed to map large zero page", + __func__); + return -1; } =20 memset(mis->postcopy_tmp_zero_page, '\0', mis->largest_page_size); @@ -1517,15 +1515,13 @@ static int postcopy_temp_pages_setup(MigrationIncom= ingState *mis) return 0; } =20 -int postcopy_ram_incoming_setup(MigrationIncomingState *mis) +int postcopy_ram_incoming_setup(MigrationIncomingState *mis, Error **errp) { - Error *local_err =3D NULL; - /* Open the fd for the kernel to give us userfaults */ mis->userfault_fd =3D uffd_open(O_CLOEXEC | O_NONBLOCK); if (mis->userfault_fd =3D=3D -1) { - error_report("%s: Failed to open userfault fd: %s", __func__, - strerror(errno)); + error_setg_errno(errp, errno, "%s: Failed to open userfault fd", + __func__); return -1; } =20 @@ -1533,8 +1529,7 @@ int postcopy_ram_incoming_setup(MigrationIncomingStat= e *mis) * Although the host check already tested the API, we need to * do the check again as an ABI handshake on the new fd. */ - if (!ufd_check_and_apply(mis->userfault_fd, mis, &local_err)) { - error_report_err(local_err); + if (!ufd_check_and_apply(mis->userfault_fd, mis, errp)) { return -1; } =20 @@ -1546,8 +1541,8 @@ int postcopy_ram_incoming_setup(MigrationIncomingStat= e *mis) /* Now an eventfd we use to tell the fault-thread to quit */ mis->userfault_event_fd =3D eventfd(0, EFD_CLOEXEC); if (mis->userfault_event_fd =3D=3D -1) { - error_report("%s: Opening userfault_event_fd: %s", __func__, - strerror(errno)); + error_setg_errno(errp, errno, "%s: Opening userfault_event_fd", + __func__); close(mis->userfault_fd); return -1; } @@ -1559,12 +1554,11 @@ int postcopy_ram_incoming_setup(MigrationIncomingSt= ate *mis) =20 /* Mark so that we get notified of accesses to unwritten areas */ if (foreach_not_ignored_block(ram_block_enable_notify, mis)) { - error_report("ram_block_enable_notify failed"); + error_setg(errp, "ram_block_enable_notify failed"); return -1; } =20 - if (postcopy_temp_pages_setup(mis)) { - /* Error dumped in the sub-function */ + if (postcopy_temp_pages_setup(mis, errp)) { return -1; } =20 @@ -2201,9 +2195,8 @@ int postcopy_incoming_setup(MigrationIncomingState *m= is, Error **errp) * shouldn't be doing anything yet so don't actually expect requests */ if (migrate_postcopy_ram()) { - if (postcopy_ram_incoming_setup(mis)) { + if (postcopy_ram_incoming_setup(mis, errp)) { postcopy_ram_incoming_cleanup(mis); - error_setg(errp, "Failed to setup incoming postcopy RAM blocks= "); return -1; } } diff --git a/migration/postcopy-ram.h b/migration/postcopy-ram.h index a080dd65a7..98d918713f 100644 --- a/migration/postcopy-ram.h +++ b/migration/postcopy-ram.h @@ -23,7 +23,7 @@ bool postcopy_ram_supported_by_host(MigrationIncomingStat= e *mis, * Make all of RAM sensitive to accesses to areas that haven't yet been wr= itten * and wire up anything necessary to deal with it. */ -int postcopy_ram_incoming_setup(MigrationIncomingState *mis); +int postcopy_ram_incoming_setup(MigrationIncomingState *mis, Error **errp); =20 /* * Initialise postcopy-ram, setting the RAM to a state where we can go into --=20 2.54.0 From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807685; cv=none; d=zohomail.com; s=zohoarc; b=Wq+Fw4xjIudDSqSCWzDUfefl9Y6jpZWF4WDckrsaovMKjRvYY6vAUe+N4QDSxl4+bqm4uT01le4epDR/fIKWC6StXo/RAwIaS97T4alMLcsFFb771LK7Yrj3yu2zLEyjZPpGoJxwjl+E6Jisl+MUSU3nRElebDFBD9cghmLZbZM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807685; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=AVLrjiHC0W6KEix/vwle1s6lIKpRUHxOfSyUAhuyMfc=; b=in7Wtkx0xiPrrFJ32v0Xluh1Fbm+EkVjVp8UZHFi6XcwJGCO0r+OLVy3YDUqjnWXU66cYxpUZGi5xHib9JNiHuM1DuqpIb2nf0mgxC39X1aimq3NgT8TJ+E6woc/nmfxdayLVjVMSkfDZW+oY1LkS4tYWOdUPTnjOU1cHtg/Jtw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807685867408.3663104028233; Tue, 30 Jun 2026 01:21:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weThv-00055l-BB; Tue, 30 Jun 2026 04:20:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weThp-000557-A0 for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:33 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weThn-0003Qd-Ji for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:33 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-2c8017e981fso21841915ad.0 for ; Tue, 30 Jun 2026 01:20:30 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807629; x=1783412429; darn=nongnu.org; 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; bh=AVLrjiHC0W6KEix/vwle1s6lIKpRUHxOfSyUAhuyMfc=; b=gjvcHQVIH53i4iWwuZCycm8+JXAWCJDZyKGdbe8eb8Yv0CE7JeADCPeldN8sAKgwWU pU7y0PiHoeRHUI7zc+VH3ZdWqp3ssxbnE7RdnvXsl6+YexLkF+mm9l9absEcZ4rpIVWt UoBEdGMXUowMqYFbr/JOGtJCZz9Sm3bGToQcs0oM9w7tqlNjTYuQDm4ZVHu1Reo78aE4 i4uJCwXHUxVUsV4u5JG8VhJL4/JMAkc7cRlNfnQrChhBaHQhFJe0cyILki0h+tvCBZiC eYueTSyVd2zOf3UISHMX5AI6OahQUG/6+kJqewHm5UJJwtYITr77Hw6mWWtrDeWKBbo+ COXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807629; x=1783412429; 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; bh=AVLrjiHC0W6KEix/vwle1s6lIKpRUHxOfSyUAhuyMfc=; b=ZzNTlTw8xs405FkhyBUPLl7o3HLvdIAle7zfvM6LncfyZmHe4dJbGmGCDg49EalJbn qQFPBzcXEve8zySDEqfaF36EWLFh8e+MDFVBJtOkZqU22HTxjTxSnAZcvsrctFBgw6Qp LxArmscEAuDrnBDZ0hGAEjACGFL1LAGOJJ7UnrKvN0X77wJz0LkV1UlBE8EXqT+9e9Ba pYqR7lR8ZTyMb2Z4qASrFGInWwdl24XpQmGQQVEVXi/Im+W3Ny628yCjJ2JR2/zqAOOE P982Uwzo9cqIpvA/zeYTlGVPtY25l/APEANKTg6oK1nWDVySnUjxL2AgJR+ucKFrGFp1 yr4w== X-Gm-Message-State: AOJu0Yxs5z30QGgJzTZBtSc1sLMm5WBKupl3oQSCedQ/t197jMrGcff9 R+8p6qnujgOYsw+EJb0nppdrb8nkEKDHJ8kodyQlKqYMU51BzE/PD0axicqj8laQ X-Gm-Gg: AfdE7ck/BZHXb/K6NayJuXLLpKW/W1g87fwMqRiySB43/o6Gvts1s0shZSavYcExHqO d5UZnqQIRhIlpGDRVWZFbR0n4Uvp9E1byr2RfrDLXNmlBSux8wz+a/B0wePo3uupXQSiD9t9P4H eW2lnFFWtKsJQFRCOY8ugdVscyksgMYxp/Ucer4pCdnpmjPHaGc+6oFcuPgmuCrjR035/JEvEPM ftvNyAcch6dhdGa1+fu9uHd6gWiXXGJ4kQs2J2v1D3OjTo++tDEvCNJF9bawJbE0bzt6GX2h65M J1Pzoo/iX5/i2c7rvaNu3tHAorzyGtx9oHeyh07bnSRGlFaIHIDUTzyZVWOGddKzIZvGPWdg9oi Scwc3TvrZQKxTxmlGDcMEG8xJPwXtSxV6BINsNmVgOu6lefflxr37Vj+OkGxYfGTcCwvTJmxa2q 36nxgGE72hV+ZJqOp9gsnjxXqNKnD0IsK8u78IS7aBBoY= X-Received: by 2002:a17:903:9cc:b0:2c9:afad:c5f2 with SMTP id d9443c01a7336-2ca2ed41bedmr20190025ad.45.1782807629256; Tue, 30 Jun 2026 01:20:29 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 3/7] migration: Use file_bmap for RAMBlock during incoming file load Date: Tue, 30 Jun 2026 13:49:36 +0530 Message-ID: <20260630081940.611092-4-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x62c.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807687764158500 Content-Type: text/plain; charset="utf-8" Replace the temporary bitmap with the existing file_bmap attribute of the RAMBlock. This acts as a preparatory change for the upcoming fast snapshot load feature. Reusing this bitmap allows the destination to track page types during a postcopy load, enabling faster, direct placement of zero pages. Since file_bmap is currently only utilized during the migration save phase, it can be safely repurposed during the load phase without introducing conflicts. Signed-off-by: Aadeshveer Singh --- migration/ram.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index fc38ffbf8a..4728f14d73 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -252,6 +252,17 @@ int foreach_not_ignored_block(RAMBlockIterFunc func, v= oid *opaque) return ret; } =20 +static void ramblock_file_bmap_init(void) +{ + RAMBlock *rb; + + RAMBLOCK_FOREACH_NOT_IGNORED(rb) { + assert(!rb->file_bmap); + size_t size =3D rb->max_length >> qemu_target_page_bits(); + rb->file_bmap =3D bitmap_new(size); + } +} + static void ramblock_recv_map_init(void) { RAMBlock *rb; @@ -3749,6 +3760,9 @@ static int ram_load_setup(QEMUFile *f, void *opaque, = Error **errp) { xbzrle_load_setup(); ramblock_recv_map_init(); + if (migrate_mapped_ram()) { + ramblock_file_bmap_init(); + } =20 return 0; } @@ -3766,8 +3780,8 @@ static int ram_load_cleanup(void *opaque) xbzrle_load_cleanup(); =20 RAMBLOCK_FOREACH_NOT_IGNORED(rb) { - g_free(rb->receivedmap); - rb->receivedmap =3D NULL; + g_clear_pointer(&rb->receivedmap, g_free); + g_clear_pointer(&rb->file_bmap, g_free); } =20 return 0; @@ -4142,11 +4156,18 @@ err: static void parse_ramblock_mapped_ram(QEMUFile *f, RAMBlock *block, ram_addr_t length, Error **errp) { - g_autofree unsigned long *bitmap =3D NULL; MappedRamHeader header; size_t bitmap_size; long num_pages; =20 + if (length > block->max_length) { + error_setg(errp, + "mapped-ram header length %" PRIu64 " exceeds " + "RAMBlock(\"%s\") max_length %" PRIu64, + (uint64_t)length, block->idstr, (uint64_t)block->max_le= ngth); + return; + } + if (!mapped_ram_read_header(f, &header, errp)) { return; } @@ -4174,14 +4195,14 @@ static void parse_ramblock_mapped_ram(QEMUFile *f, = RAMBlock *block, num_pages =3D length / header.page_size; bitmap_size =3D BITS_TO_LONGS(num_pages) * sizeof(unsigned long); =20 - bitmap =3D g_malloc0(bitmap_size); - if (qemu_get_buffer_at(f, (uint8_t *)bitmap, bitmap_size, + if (qemu_get_buffer_at(f, (uint8_t *)block->file_bmap, bitmap_size, header.bitmap_offset) !=3D bitmap_size) { error_setg(errp, "Error reading dirty bitmap"); return; } =20 - if (!read_ramblock_mapped_ram(f, block, num_pages, bitmap, errp)) { + if (!read_ramblock_mapped_ram(f, block, num_pages, block->file_bmap, + errp)) { return; } =20 --=20 2.54.0 From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807667; cv=none; d=zohomail.com; s=zohoarc; b=AB04veN++Ife5g52B0OC9VsiYYv/kMuTB9sdFnNb9jtyG1U3OEIzjbowMOPbBxWP99KE4Mk4IfaaH5H3nfRPXnPtGoOJbn2TEVnHzQ/WFYxokB+5lFG6JyIUzc4nKlxL5WjTR9gMIBY5p4R76xQEKTV+wBorwZ7eC9Iz0mlPo/A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807667; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=VPjsToBeS5cS1bHYcqZKAm2lG/5VriJ9o57EzBTqELg=; b=CB5DK253QfKIFAKh/xGrM3hcI6BqIxvMFdLp5r3toH1WF1BqlwVHwrn0FGgbF32QXrt/5oavTcaa/hWrtW79uKcOnkRtHiAEhhn58srt4xXElg5NhATzvKdnK3LAjSg+jUhYXRM7RC/haLJ0Je7X/G/dvTPmyvpcYl1S1yo2vyo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807667758850.8511311282292; Tue, 30 Jun 2026 01:21:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weTi2-00056a-VM; Tue, 30 Jun 2026 04:20:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weThu-00055k-Kt for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:38 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weTht-0003RO-3I for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:38 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-2c9e8a1d256so19774405ad.1 for ; Tue, 30 Jun 2026 01:20:35 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807634; x=1783412434; darn=nongnu.org; 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; bh=VPjsToBeS5cS1bHYcqZKAm2lG/5VriJ9o57EzBTqELg=; b=Z0fD/tNySGnt8TnNU7/OZCKdCKtDeXzabC5W+wiJ3OJJYvZwHxVOsGUuykxf/PL70R Mrj4C08yYDAysjl7O6UbUeL03O/zbLClwCDabGEBoP97ps2F/0NlK6drbIKj+P8KkX+t tatjJNxmu6NaauHYvBPQBbH3a6x0S3mJWfDNdgqJT0wYBDf0CMGzN0MTgMJot9srzECH IPQ5X0FbKQBzS1+5bPV7CcSlA+d+/w2Gp1/VteXV8i90QBUjcoeivcEr7Kl/APMANho8 VifYq2PwR7vHRTxfUqtEvVjtRx3JhhEAuPynaKbRC8MzkKk7WjO+WDk/IaCPghvpIJiT 5EwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807634; x=1783412434; 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; bh=VPjsToBeS5cS1bHYcqZKAm2lG/5VriJ9o57EzBTqELg=; b=iS9pc8PsbjeaXt5rdDLyv1ccI7YPTkJ7gnMG4cPQ8+Zaw0oewf03Y7UvCuKC47NA55 AheEK2ytpt8mbSvvT25BKCG4GPsKW3jlJ7fiqLV/bkdsjC7pyT7oWJVCKJAoekWFYS3u rUuEwjzi4XACpkMu/ISg9T8uWSuZmRkC+sRAStfElFTQHC1b/kd09r+/LC5eNg+0ghfW lT14zQyKV18WDxSjZt6d/3wAKWtkiYN+R/fcTet8Tp2vX6Jhc7Hq0z/EcQs5c+ypnVU5 CzYiiDkzEstk5a1BnIVmvBkXIVi2t9k9lq4HhSJ/ATeyCYYj0NbcciwMAYmW8+tn4w7c hosg== X-Gm-Message-State: AOJu0YwfRnfsoDFyLKOmoUEOuHfnEsmyDdjefS3HTJKMiMMs/ehMo1yu P46ncE5YM4Y1Z7l9bAffWLaGRoVMpuR/+qnKWdOkz/AKZXqlqPm8xsoDf+FZoEnG X-Gm-Gg: AfdE7clFBsLUH4iiuDQKFya6vChrTSmHeF+Db/UDEW9WmN6pLQZUuSSZ8aHeISTd7DQ ee8c6+Lm6T3pBrHYGb1N6Tvp5gn62fhYAS5HzUIedv71/epeF68OP2sF/i2lBisieV6byIe1OTL Y1bsrKym1mNIxRB1Y4tzCtEavf6L8guJ3KwJ/t5iaoxHZEhvgFnviYGR5+rHMlk5dI32BmRCGXo VueMHmGQpNGX1nd2HrFYwHhPvlGFZARTZxv68XKYwWul0undZu6DcvCQusHsPPc9GIXINGtrz52 fu0+cjh8UhMhBqoGc8FUVBrhtsV+LT4gAL5mMY4RWKIj2KPecU/zAqlFCy8Co2bJeim6sJjRC3k aFrjeAu6EzX4c+9PhaC/e+AAXstGFvd/yJnVV/+OqS+p+UHLSs9p0ONyCU91pKiioqUCc1bh/Lm E0pJdWC/WBrfgnnIDkayDYefOyIHyVMJ1U1mM75yU97D8= X-Received: by 2002:a17:902:e747:b0:2c1:98b7:ecf3 with SMTP id d9443c01a7336-2ca2e71be03mr20866555ad.23.1782807634020; Tue, 30 Jun 2026 01:20:34 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 4/7] migration: Make qemu_get_buffer_at() thread-safe Date: Tue, 30 Jun 2026 13:49:37 +0530 Message-ID: <20260630081940.611092-5-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::634; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x634.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807670042158500 Content-Type: text/plain; charset="utf-8" Remove the internal QEMUFile error state modification from qemu_get_buffer_at(). This function is called by two functions, both of which already check for unexpected return values and handle their own error reporting. Removing this shared state modification makes qemu_get_buffer_at() strictly thread-safe for concurrent disk reads, serving as a preparatory change for the upcoming fast snapshot load feature. Signed-off-by: Aadeshveer Singh --- migration/qemu-file.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/migration/qemu-file.c b/migration/qemu-file.c index d5a48115bd..c73f8178d7 100644 --- a/migration/qemu-file.c +++ b/migration/qemu-file.c @@ -553,14 +553,11 @@ void qemu_put_buffer_at(QEMUFile *f, const uint8_t *b= uf, size_t buflen, size_t qemu_get_buffer_at(QEMUFile *f, uint8_t *buf, size_t buflen, off_t pos) { - Error *err =3D NULL; - if (f->last_error) { return 0; } =20 - if (qio_channel_pread_all(f->ioc, buf, buflen, pos, &err) < 0) { - qemu_file_set_error_obj(f, -EIO, err); + if (qio_channel_pread_all(f->ioc, buf, buflen, pos, NULL) < 0) { return 0; } =20 --=20 2.54.0 From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807670; cv=none; d=zohomail.com; s=zohoarc; b=auW8HzjO5LAsUapW20cTmmbylvzYP3jrAvRZ5kz8K1Rc4pOfB9Z5/IcfWqLv+6IGHnlhOG6Xvn5eku0YVnMaKgFQWZX7Fb6wC9YH34ooZuoFMtoMMucaCsDts6qqXjeGEYQKkeBb2VGiDpW6pjfRHFLdmjFF3mm4xV0JuvJclgY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807670; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=aYYeMV/E9f/Nxn7LVdHk0y8KY7HIlOmILgZ3wts5ucg=; b=TjzVk9y4epUUohS3ZVGak44oV4A1ZpVZnKTtO29aNP0tHq+AaNFsgl1A25BdG+k2YSlTnT8GKKt/Mtm3a+XJqclkDI18/cOL/V4cbOKlThcsy7FACUt7X8OBa9IhZA9dFX5zpAkHk9VzNvOSQGDHr7X/PMElm7sN5lszAJz+xkM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807670803351.51821001966914; Tue, 30 Jun 2026 01:21:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weTi5-0005Dh-HY; Tue, 30 Jun 2026 04:20:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weTi0-00056d-6b for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:46 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weThw-0003TK-Jb for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:43 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-2c9b1edf2bdso15230105ad.1 for ; Tue, 30 Jun 2026 01:20:39 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807639; x=1783412439; darn=nongnu.org; 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; bh=aYYeMV/E9f/Nxn7LVdHk0y8KY7HIlOmILgZ3wts5ucg=; b=DGTsdQm9/JvNSi5Zdwt1JmhQyCyAfg82wUHn9lfkeeOOwQtX9Z8/vSb4430Z6D5ihN WzT865CSVuNBZyNMMv/iADpXCSRdvS3qdr8pdk7Bd9jB2sOLSmToe4TRQE2+fKXLhZ/0 UOhm++g8Z4ZeI5RmRxxjgFjIdyF7VMTfXyWTRt08RtTjWT/Z6qB9HKlgoJNnuIHEZMba EiOmK/IF+vJJdxuUWWCXvbJJzuQoKJTC4SMkLAGq7HTScWikN8DqS+AzBf6vo8zpTTRS z5Pwnw6hyZZ90CB+ByKsVj8PCB96VEQoTZDr3gL8Mek5lBqKP+nrL7oSb5AcytoiVg0O CVtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807639; x=1783412439; 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; bh=aYYeMV/E9f/Nxn7LVdHk0y8KY7HIlOmILgZ3wts5ucg=; b=RYT2P6cuua6LqmAtzFw3EPfMa2drmoaDo47HTEc6oJ2qHCCK2gDhDdqNKW5Uwt/r62 vR92XG3kDVIRKDlRIorCuatO4afB1gzyO0a5VEjxngRD4CyRhYWvGp586Y+Z9UC7qS3u 80VuBejcnlLD0NkqNEFm4AgKEVgS8SCgz6KB1tiNhj9h71wIfpOj45tl6t34Fe8um4ZA Co5dtgHYbhkz+/y7d3ycIDMyMVQNsEggf4qjT4C8Q50plJdoKBRESlHALZ6Ye9WmtWpJ 5ZJgcg23qmp8iow2Bv5nuUKBQv8kV2xZkhRwC7IfRGxEaUHfEwRsEXbjuJ8sMzdarN6J amlQ== X-Gm-Message-State: AOJu0YynHzbQ8Ajht0zly+fvkYkl/CaQmRsPFx13PR62mYS9MMZAPRa3 5BKWEWzxd3B2bQBUT4DYVWT6zjKsg6uRdQPPFb7zVOG6iXiZHKqTj6ZOFNXE/LPw X-Gm-Gg: AfdE7clG1JIe6VYOv4s3oQwVJUtPGtYnpGaC4BVMXS+YDkKZIv0l28765ZjNA+xBpzs dPfq0zja/EuwNrp4TQKK6XNYO9aL6rNOUL+5Wy7MmixHHwxyfwNWelEJ5q4rU2O0Pj/DPB/Wm0j gF9dwlHo2LjvfpWXimxvi8PGBpsw33B2ve2TmJ7tah0q7M7v3tMGj/kXWTT1MgFVXMBq4l1rc42 NPzDyNNWCv1g4S/Gl1ynHsRvdJ8+1Tetw8NObnAF/ER8NLIE7BDT43RxYeItfuHI8JACC5+SJMc V/2JcVQdb4XvM34lApJheYLvvib4WF8xniW5lw8hbeFe7s79ukXD4hCbI8N0fXl4Fru6DKenFXf 1ot8d+MHLxzgTwhXR1HApzhF8kyKr5W4UOQDdGcIVIxHb/ZkmR0l2yBeESl9eLa3P4LGlW19+qz XAZB0WVYIHIciCUnXQCUnwq2xZzceN3/o6EkkF/ztkXL8= X-Received: by 2002:a17:902:ce01:b0:2c2:27be:39a7 with SMTP id d9443c01a7336-2ca2ed32422mr19199155ad.29.1782807638688; Tue, 30 Jun 2026 01:20:38 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 5/7] migration: add RAMBlock field and helper for fast snapshot load Date: Tue, 30 Jun 2026 13:49:38 +0530 Message-ID: <20260630081940.611092-6-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62f; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807671673158500 Content-Type: text/plain; charset="utf-8" Add pending_bmap field per RAMBlock which is a Bitmap to store internal state of which pages have been read by some thread to ensure coordination between fault thread and eager load thread. Modify parse_ramblock_mapped_ram(), to not load the actual RAMBlocks data in postcopy case as that will be loaded by fault thread and eager thread after the VM starts running. Change ram_load() to use new function ram_should_load_postcopy_pages() to decide how to load/read RAM. Signed-off-by: Aadeshveer Singh --- include/system/ramblock.h | 6 ++++ migration/ram.c | 59 +++++++++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/include/system/ramblock.h b/include/system/ramblock.h index 4435f8d55f..83187bf44c 100644 --- a/include/system/ramblock.h +++ b/include/system/ramblock.h @@ -60,6 +60,12 @@ struct RAMBlock { =20 /* Bitmap of already received pages. Only used on destination side. */ unsigned long *receivedmap; + /* + * Bitmap for pages that are yet to be read from disk. It is required = for + * fault thread and eager thread to keep note of which pages are curre= ntly + * being read. Used by fast snapshot load. + */ + unsigned long *pending_bmap; =20 /* * bitmap to track already cleared dirty bitmap. When the bit is diff --git a/migration/ram.c b/migration/ram.c index 4728f14d73..ffd60b2ac8 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -263,6 +263,18 @@ static void ramblock_file_bmap_init(void) } } =20 +static void ramblock_pending_bmap_init(void) +{ + RAMBlock *rb; + + RAMBLOCK_FOREACH_NOT_IGNORED(rb) { + assert(!rb->pending_bmap); + size_t size =3D rb->max_length >> qemu_target_page_bits(); + rb->pending_bmap =3D bitmap_new(size); + bitmap_set(rb->pending_bmap, 0, size); + } +} + static void ramblock_recv_map_init(void) { RAMBlock *rb; @@ -3762,6 +3774,10 @@ static int ram_load_setup(QEMUFile *f, void *opaque,= Error **errp) ramblock_recv_map_init(); if (migrate_mapped_ram()) { ramblock_file_bmap_init(); + if (migrate_postcopy_ram()) { + /* fast snapshot load */ + ramblock_pending_bmap_init(); + } } =20 return 0; @@ -3782,6 +3798,7 @@ static int ram_load_cleanup(void *opaque) RAMBLOCK_FOREACH_NOT_IGNORED(rb) { g_clear_pointer(&rb->receivedmap, g_free); g_clear_pointer(&rb->file_bmap, g_free); + g_clear_pointer(&rb->pending_bmap, g_free); } =20 return 0; @@ -4201,9 +4218,12 @@ static void parse_ramblock_mapped_ram(QEMUFile *f, R= AMBlock *block, return; } =20 - if (!read_ramblock_mapped_ram(f, block, num_pages, block->file_bmap, - errp)) { - return; + if (!migrate_postcopy_ram()) { + /* Do not load RAM during setup for fast snapshot load */ + if (!read_ramblock_mapped_ram(f, block, num_pages, block->file_bma= p, + errp)) { + return; + } } =20 /* Skip pages array */ @@ -4475,15 +4495,42 @@ static int ram_load_precopy(QEMUFile *f) return ret; } =20 +static bool ram_should_load_postcopy_pages(void) +{ + /* This is pure precopy, we don't need to load pages in postcopy way */ + if (!postcopy_is_running()) { + return false; + } + + /* + * This is postcopy, but when with mapped-ram, pages are not loaded in= the + * migration stream here, but done separately in a thread eagerly read= ing + * pages from the snapshot. Here, we only need to read the ram header= s, + * reusing the precopy code. + * TODO: when we have separate function to parse RAM headers we should + * switch to that. + */ + if (migrate_mapped_ram()) { + return false; + } + + /* + * Genuine network postcopy, we will load pages in this current stream= and + * they need to be done in postcopy way. + */ + return true; +} + static int ram_load(QEMUFile *f, void *opaque, int version_id) { int ret =3D 0; static uint64_t seq_iter; /* * If system is running in postcopy mode, page inserts to host memory = must - * be atomic + * be atomic. However, fast snapshot load uses the mapped ram precopy = like + * path to read block headers and populating bitmaps. */ - bool postcopy_running =3D postcopy_is_running(); + bool load_postcopy_pages =3D ram_should_load_postcopy_pages(); =20 seq_iter++; =20 @@ -4499,7 +4546,7 @@ static int ram_load(QEMUFile *f, void *opaque, int ve= rsion_id) */ trace_ram_load_start(); WITH_RCU_READ_LOCK_GUARD() { - if (postcopy_running) { + if (load_postcopy_pages) { /* * Note! Here RAM_CHANNEL_PRECOPY is the precopy channel of * postcopy migration, we have another RAM_CHANNEL_POSTCOPY to --=20 2.54.0 From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807696; cv=none; d=zohomail.com; s=zohoarc; b=fmxEDr08QRZMf7ZWCDIgwlMFHDFtXSsNzpVntFClsDIXMLWPMvEIg8H3dW1FHmr+WlLAmqNod3bd6T87qnTGCrUeJHTbbHdsQU7VJkyhoipQ8oGi3xQabeTHoymGVdkNHCMxGAXgbbXPODTU1m2vIyKVCjd4XI9wMQMmdDa72sE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807696; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vsMMXzGNMU+wpIe+e40sOz/5tgxI4sRHgNkcRSe5bUo=; b=gxLBrRcpd4Xh+o6p41eh9bspYWRZEUzQps8rMwTc3cqSrKYIOlO2STJBDiibeB7U3gHouaN/V4r7gK8MljEUrw24MYEK5hPxDNatHPKbQO9n7gWhoAVhs+g+6ly9DVwrUd46JnPVrkS0L/OOxDju4vVd+la+F9NK3BSuKWcG9p8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807696260890.6162670704215; Tue, 30 Jun 2026 01:21:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weTi4-0005DI-KK; Tue, 30 Jun 2026 04:20:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weTi2-00059j-RU for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:46 -0400 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weTi1-0003VK-1C for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:46 -0400 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2ca265d6ca1so2375745ad.1 for ; Tue, 30 Jun 2026 01:20:44 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807643; x=1783412443; darn=nongnu.org; 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; bh=vsMMXzGNMU+wpIe+e40sOz/5tgxI4sRHgNkcRSe5bUo=; b=OtV7GMa+pAQ7B5m84irf4bam1PPnURfTBTyaWswQStedHYsA2eMWimlKR+8AA4S1zL b0yUWMyL4x1rlgkYT7tWdcZ1a4KFyZ6TNcStEDXPYUnzExrYT2OCE2yHXSmZdJRLI5Gk tWlmyz6USf8pNJTpd9RomtJe8KrLRdet06ociKd0cDl57J8OufMWfgjRiDmza7oUP+yg Vcp4rcLrkwectKJnDtgmKV5dq+hUTW5DFJm9xh0IA7JHvuGjDB2NgnjZr9jYzPICAAze g7xVBEKVVrv5FPS3hjkPhyr/Mw5VJw189in7z2HUAt7K6s84cVFFsJgQqmQ/CwuW9NPo B3vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807643; x=1783412443; 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; bh=vsMMXzGNMU+wpIe+e40sOz/5tgxI4sRHgNkcRSe5bUo=; b=nlb77PBWClpm6uAtQnPi2iBa9/kmlFO5arBCVcPXqiP9XVYml5nKFWJ4IWVxakxhAX 8uPcj8N/yxwM/k7vvr4n09avMycUyuVaWKsB7okSv1DGSJuFqq6hCS77dcyLtpL4vgSz Wr0UvBStON7lQmt2LvaIaYebpRr1tIAXDQ8k+W48fiSKhdwCijpeAuTTv+g8gKUTtB5/ AiVznW15ZG/NExKXxTCc8YwG2AbaMyoW0jaTf0arcVcIr0Xtz+Pncv84ajNXswl/7MQa xw7ylw3O6TqTeN57iWEiO9lvDHIVwfS0xmR++21gVpO4CGYQtGTzqSSyiQWYDPrIFxQu V1aA== X-Gm-Message-State: AOJu0YypH7O3ahYpYvE0W8CRsa7un7v5tkSE8CBIs5FlNieAN+BWAD2N BuwZW3xDn95pZqzr5HjsOv0sgG2usk6XoZQVXFC8hmeMTOp+M048djnMU9lxH4y8 X-Gm-Gg: AfdE7cnJ+NIgiGocAdSSzY1Yl5lXiumxS3varsmW92GLVWnyHSpbi4lTmni8cdVaEKZ 5Ixyyb38yOjC7F5QWA79ohgZaPl+82ys7Lc00OYZx18DvG83Ouc3FCaNqaE4pxeim4g6Ie0CML7 fP2ddqIX/r7gRA5wiIXl6lOkacOw3kWhnW/ePRydVlKfIqmVoaNEzJtd8rK1VNyYfCn/3iIz4TZ Knrzw8nDZt/MjpGexeDf9em5CdvExy4ul4wYk6aEagoBXPAOSxBNxcL7ZlY5nCpTIC/b7Cr7QIr 7iaNadZlc0T6zyyCpsNwn9kcqKOhVLOE9h3T7p/kVWa6x8/mU8cHWqJ4A5VlMzcdMglpFcn2z48 U1o3jPc0HO3TP2lWsJslZFSH4obmC7v627SHY/AJe9Ot516DWQuzm+xzrbxLZlKnclwMWAhK25c sfcn8HoUWZ/DCQNWdrduQ1Ad+NW/p3W9TypUJo3zF+BS4= X-Received: by 2002:a17:902:f70f:b0:2ca:1114:3ac8 with SMTP id d9443c01a7336-2ca449ab595mr6394575ad.11.1782807643296; Tue, 30 Jun 2026 01:20:43 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 6/7] migration: add support for fault thread to load pages from disk Date: Tue, 30 Jun 2026 13:49:39 +0530 Message-ID: <20260630081940.611092-7-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::635; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x635.google.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URG_BIZ=0.573 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807698075158500 Content-Type: text/plain; charset="utf-8" In fast snapshot load, we would like to serve faults as soon as possible hence loading pages directly instead of requesting a source Add postcopy_mapped_ram_load_page() function which serves single page fault by reading the snapshot file. It uses bitmap_test_and_clear_atomic on pending_bmap to coordinate between threads so each page is loaded exactly once. Non-zero pages are read using qemu_get_buffer_at into a temporary page (for loading page atomically), which is then placed using postcopy_place_page. Zero pages are placed directly using postcopy_place_page_zero. Update postcopy_ram_fault_thread to call postcopy_mapped_ram_load_page instead of requesting source in case of fast snapshot load. to_src_file check is bypassed in fast snapshot load case as there is no source. Add postcopy-blocktime support by calling mark_postcopy_blocktime_begin on every fault. We need to aqcuire the page_request_mutex lock and check the recv bitmap to make sure we prevent a race condition when a fault occurs but before the fault thread can mark the page for tracking the eager thread loads in the page making us fail the assert for recv bitmap being clear while marking in mark_postcopy_blocktime_begin(). Allocate another channel in postcopy_temp_pages_setup(like the preempt case), for both the fault thread and eager thread to load pages independently. Signed-off-by: Aadeshveer Singh --- migration/postcopy-ram.c | 121 +++++++++++++++++++++++++++++++++------ 1 file changed, 104 insertions(+), 17 deletions(-) diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index 96a65aa976..be9edac572 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -949,6 +949,68 @@ int postcopy_wake_shared(struct PostCopyFD *pcfd, pagesize); } =20 +/** + * postcopy_mapped_ram_load_page() - Load a page to given host address. + * @mis: Migration Incoming State. + * @rb: RAMBlock from where page is loaded. + * @rb_offset: Offset of page in RAMBlock. + * @haddr: Base of page where to load in page. + * @channel: Used to identify between threads and use corresponding temp. + * + * Load a page from RAMBlock at offset at given host address. Used by post= copy + * ram fault thread and eager thread in fast snapshot load case. + * + * Return: True on success. + */ +static bool postcopy_mapped_ram_load_page(MigrationIncomingState *mis, + RAMBlock *rb, ram_addr_t rb_offs= et, + uint64_t haddr, int channel, + Error **errp) +{ + void *place_source =3D mis->postcopy_tmp_pages[channel].tmp_huge_page; + size_t page; + size_t read; + + page =3D rb_offset / qemu_ram_pagesize(rb); + + if (bitmap_test_and_clear_atomic(rb->pending_bmap, page, 1)) { + if (test_bit(page, rb->file_bmap)) { + /* + * This can happen concurrently, but it's thread-safe because + * qemu_get_buffer_at() is thread-safe, and the caller will be= using + * different temporary buffers. + */ + read =3D qemu_get_buffer_at(mis->from_src_file, place_source, + qemu_ram_pagesize(rb), + rb->pages_offset + rb_offset); + + if (read !=3D qemu_ram_pagesize(rb)) { + error_setg(errp, "Could not read page %zu from RAM Block %= s", + page, rb->idstr); + return false; + } + + if (postcopy_place_page(mis, (void *)haddr, place_source, rb))= { + error_setg(errp, + "Failed to place page %zu from RAM Block %s at " + "address %" PRIu64, + page, rb->idstr, haddr); + return false; + } + + } else { + if (postcopy_place_page_zero(mis, (void *)haddr, rb)) { + error_setg(errp, + "Failed to place zero page %zu from RAM Block %= s at " + "address %" PRIu64, + page, rb->idstr, haddr); + return false; + } + } + } + return true; +} + /* * NOTE: @tid is only used when postcopy-blocktime feature is enabled, and * also optional: when zero is provided, the fault accounting will be igno= red. @@ -1279,6 +1341,7 @@ static void *postcopy_ram_fault_thread(void *opaque) int ret; size_t index; RAMBlock *rb =3D NULL; + Error *local_err =3D NULL; =20 trace_postcopy_ram_fault_thread_entry(); rcu_register_thread(); @@ -1320,11 +1383,13 @@ static void *postcopy_ram_fault_thread(void *opaque) break; } =20 - if (!mis->to_src_file) { + if (!migrate_mapped_ram() && !mis->to_src_file) { /* - * Possibly someone tells us that the return path is - * broken already using the event. We should hold until - * the channel is rebuilt. + * Possibly someone tells us that the return path is broken al= ready + * using the event. We should hold until the channel is rebuil= t. + * Fast snapshot load doesn't support pause and recover, becau= se + * it's not necessary: we can fail right away when QEMU just b= ooted + * with nothing to lose. */ postcopy_pause_fault_thread(mis); } @@ -1387,18 +1452,37 @@ static void *postcopy_ram_fault_thread(void *opaque) qemu_ram_get_idstr(rb), rb_offset, msg.arg.pagefault.feat.pti= d); + + if (migrate_mapped_ram()) { + /* Load page directly in case of fast snapshot load */ + WITH_QEMU_LOCK_GUARD(&mis->page_request_mutex) { + if (!ramblock_recv_bitmap_test( + rb, (void *)msg.arg.pagefault.address)) { + mark_postcopy_blocktime_begin( + msg.arg.pagefault.address, + msg.arg.pagefault.feat.ptid, rb); + } + } + if (!postcopy_mapped_ram_load_page( + mis, rb, rb_offset, msg.arg.pagefault.address, + RAM_CHANNEL_POSTCOPY, &local_err)) { + error_report_err(local_err); + break; + } + } else { retry: - /* - * Send the request to the source - we want to request one - * of our host page sizes (which is >=3D TPS) - */ - ret =3D postcopy_request_page(mis, rb, rb_offset, - msg.arg.pagefault.address, - msg.arg.pagefault.feat.ptid); - if (ret) { - /* May be network failure, try to wait for recovery */ - postcopy_pause_fault_thread(mis); - goto retry; + /* + * Send the request to the source - we want to request one + * of our host page sizes (which is >=3D TPS) + */ + ret =3D postcopy_request_page(mis, rb, rb_offset, + msg.arg.pagefault.address, + msg.arg.pagefault.feat.ptid); + if (ret) { + /* May be network failure, try to wait for recovery */ + postcopy_pause_fault_thread(mis); + goto retry; + } } } =20 @@ -1470,8 +1554,11 @@ static int postcopy_temp_pages_setup(MigrationIncomi= ngState *mis, Error **errp) unsigned i, channels; void *temp_page; =20 - if (migrate_postcopy_preempt()) { - /* If preemption enabled, need extra channel for urgent requests */ + if (migrate_postcopy_preempt() || migrate_mapped_ram()) { + /* + * If preemption enabled or it is fast snapshot load, need extra c= hannel + * for urgent requests/faults + */ mis->postcopy_channels =3D RAM_CHANNEL_MAX; } else { /* Both precopy/postcopy on the same channel */ --=20 2.54.0 From nobody Sun Jul 26 11:51:22 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1782807675; cv=none; d=zohomail.com; s=zohoarc; b=EfrYApvwPNBxPavx1RoZtZfPzbEOttiQoBxglNLrUr7OlHnL4FFqVqPFo6gA1hmr9n6auasp/JWHCwn8I4+KYgcCYnfn0rE9Q9hJM638mf25kebYrxZ48PPcxm8H9FbX/KpR9xy9fSh+1P9eDS3RkFMdHCCe7zyfRj1WClDpKC8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782807675; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=CzdRPYxAmDFz2pEVeIEvpsg2WCMYjJ+FpyqlnGutLxQ=; b=kZhOVyPv6dFXJE0fp0BBp0Ovo4Nk6S6ko3JonoCDEUI2HNKQcY9OUUyWZI9p1vedTYuxlsa2h2M97Pny+AtUVLe8Ex2L6kZEvB73mkKV+cybW1IQanlgNBnuY/B5vDBm7TqRpYhTGU8O2o1ZojEUQJYedLn5WBxB6qIVPuFgr3Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782807675100157.9428101308091; Tue, 30 Jun 2026 01:21:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1weTi9-0005Ea-Ip; Tue, 30 Jun 2026 04:20:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1weTi7-0005E6-Ry for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:51 -0400 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1weTi5-0003WB-MR for qemu-devel@nongnu.org; Tue, 30 Jun 2026 04:20:51 -0400 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-2c979d03538so13275165ad.1 for ; Tue, 30 Jun 2026 01:20:49 -0700 (PDT) Received: from setun ([2401:4900:a344:dc6e:573c:3e9:c03e:731a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca4f2a71dbsm1284615ad.50.2026.06.30.01.20.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 01:20:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782807648; x=1783412448; darn=nongnu.org; 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; bh=CzdRPYxAmDFz2pEVeIEvpsg2WCMYjJ+FpyqlnGutLxQ=; b=dUNbp12hHYQzVGyVpXJJjrwi7KkA4kiGTKFkijRBKnvL3UJpqW/E9GiHeCJc2djoeY NjyvCC9F7bsjytVF7P3bzk0WYa+PwkkkCe2tpRSO4DNVEEJiIaSQEIHi9DIB9mcmloqw wFbHV5XtylJS2A4FBy85kDkbbnU6HuROmU1MIpjthJu+0lx+KT+YH3FZrxxZf+87Redv RdaIkgRG58XjhFNWDfrpLeLJOZKpUE+kiMyCb5nm13nuDFtzKP7Fzgbqxk3JpNrUvlTz k8XIKsun0ZkgWsNLOjJnM6FDF/yleVBSjflRa39JwaPRn/8Pmq8zf0oa2khWHQ18fBak HUeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782807648; x=1783412448; 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; bh=CzdRPYxAmDFz2pEVeIEvpsg2WCMYjJ+FpyqlnGutLxQ=; b=H3bzyqXRuzzPprekLi5drt0P4lL3jsT1rWzqs+3pmsnWfeEFDEthZLQzrp5ncQH18v qcN4CT5dm9bLuft+8Cdfha0jy0eZ4j4+iFNNf9EJ+eA757Ori8UHkDXO40n1IbH50XhK fDIe1woqBZICgiPH2oDJZy6w5fdsRFi42eY6bTz4QuJMEORQn41QhuQJ395B0W2agZau 7KRLLckT+dG60zHVRGfgE7+JQW5ejFh6x6UtmIeI0HtH6rU8vcgAMRtdWSfXqDGkNipZ Z3u62ySempJ+/4fzWMyb6YxdRmCD87tHPCKNAzNoNd/k4kzAfr2echnTIfa5DV5h6ZQf zDoA== X-Gm-Message-State: AOJu0Yxc9BcfW8aGcPfHnAsbuwlNefF06r/Sj3IZSiKEz1gRhH+5lFnA p+/gwyZYAqFEqvYJ6JqGJVhYlXc7g9Bk4zdr0pPCLILmHFNELK8NwHlKfJaAr1Rf X-Gm-Gg: AfdE7cliwHGSqrrv7LpBCGHeLPDBL2mAe4mCK7WdYJoLzrblcQmbKwWJ4VQdcUNZUDM ywgn/3Ms8f9pFjhhiZCV+bqqLkrWxliVOG1HLW1CBa/bBn7RRDhpOvUJsU8zTgWkD7kNcyxpaJV p8Ob7gRhxdmz64YNdPPpaBhkAJ0WdvAKTBC5Su2fwPe1dtpomFky3mRcQwZfnE3tBGZe/8NtDZN zoggWjJl5zUBsRBsoZkj98lPDO6je4eYxmePbtggd9hYV7+SvBGT7+HBDUF1GdlktcIFayZpA3D Jh1iVoHmDUS7WqNFEeomF2Hz6qIy8IDOqvtuH8GomfdXN0pv20Q+Mu5sOUI/K4Cpmhs1IQTfTRt 93C7PWqGh/4EGXWFib2zlSjBTQasPlh117MFV7dNLVwK+rHGlYM0C/1vlB8hg+xw91ei1bzBtYK Mocb//SQl/g/pzu8lbqtZIf7oNtFzTLX3Psx9ozG/RjCeWYLbx2+TlLQ== X-Received: by 2002:a17:903:1111:b0:2c9:97a8:aff4 with SMTP id d9443c01a7336-2ca2ec301f4mr20554055ad.45.1782807648246; Tue, 30 Jun 2026 01:20:48 -0700 (PDT) From: Aadeshveer Singh To: qemu-devel@nongnu.org Cc: peterx@redhat.com, farosas@suse.de, pbonzini@redhat.com, philmd@mailo.com, lvivier@redhat.com, ayoub@saferwall.com, Aadeshveer Singh Subject: [RFC PATCH v2 7/7] migration: add eager load thread and setup for fast snapshot load Date: Tue, 30 Jun 2026 13:49:40 +0530 Message-ID: <20260630081940.611092-8-aadeshveer07@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260630081940.611092-1-aadeshveer07@gmail.com> References: <20260630081940.611092-1-aadeshveer07@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62a; envelope-from=aadeshveer07@gmail.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1782807675830158500 Content-Type: text/plain; charset="utf-8" In fast snapshot load a thread is needed for actively loading in pages along with the fault path so that the guest is not dependent on fault thread indefinitely. Considering the difference from usual network postcopy where major chunk of RAM is already loaded here entire RAM needs to be loaded later. Existance of background pages which are not really accessed by the guest might never be loaded and system will be locked in migration for indefinite time. As there should be no assumption about how guest accesses memory, the load times can be indefinite. Add postcopy_ram_eager_load_thread(), for the eager thread which iterates over all non ignored blocks calling ram_block_load_eager() on each. ram_block_load_eager then iterates to load in all pages using postcopy_mapped_ram_load_page(), with a different channel, which takes care of not loading in pages already loaded by fault thread. On completion the thread schedules postcopy_incoming_complete_bh() to destroy the incoming migration state. Add postcopy_ram_eager_load_setup() to create the thread. Added joining logic in postcopy_incoming_cleanup(). Add tracepoints for entry and exit to eager load thread. When both mapped-ram and postcopy-ram are set, divert from qemu_loadvm_state to run fast snapshot load Initialize postcopy RAM state and register RAM Blocks with userfaultfd via ram_postcopy_incoming_init() and postcopy_ram_incoming_setup() in process_incoming_migration_co(). Fault thread needs to be launched before VM to serve faults for some hardwares emulation that need to read RAM (like vapic devices). Populate bitmaps and offset tables while reading file in qemu_loadvm_state_main. Add function qemu_loadvm_run_fast_snapshot_load() which starts the VM using loadvm_postcopy_handle_run_bh() and launches eager load thread. Skip scheduling process_incoming_migration_bh() in process_incoming_migration_co(), for fast snapshot load as the state cleanup is managed by eager load thread on completion. Signed-off-by: Aadeshveer Singh --- migration/migration.c | 33 ++++++++++++++++-- migration/migration.h | 5 +++ migration/postcopy-ram.c | 74 ++++++++++++++++++++++++++++++++++++++-- migration/postcopy-ram.h | 2 ++ migration/savevm.c | 26 ++++++++++++++ migration/savevm.h | 2 ++ migration/trace-events | 2 ++ 7 files changed, 140 insertions(+), 4 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 074d3f2c69..9295794713 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -730,6 +730,11 @@ static void process_incoming_migration_bh(void *opaque) migration_incoming_state_destroy(); } =20 +static bool migration_incoming_has_postcopy_thread(MigrationIncomingState = *mis) +{ + return mis->have_listen_thread || mis->have_eager_load_thread; +} + static void coroutine_fn process_incoming_migration_co(void *opaque) { @@ -759,17 +764,41 @@ process_incoming_migration_co(void *opaque) migrate_set_state(&mis->state, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_ACTIVE); =20 + if (migrate_postcopy_ram() && migrate_mapped_ram()) { + migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_POSTCOPY_DEVICE); + + if (ram_postcopy_incoming_init(mis, &local_err)) { + goto fail; + } + + postcopy_state_set(POSTCOPY_INCOMING_LISTENING); + if (postcopy_ram_incoming_setup(mis, &local_err)) { + goto fail; + } + } + mis->loadvm_co =3D qemu_coroutine_self(); ret =3D qemu_loadvm_state(mis->from_src_file, &local_err); mis->loadvm_co =3D NULL; + if (ret < 0) { + goto fail; + } + + if (migrate_postcopy_ram() && migrate_mapped_ram()) { + if (qemu_loadvm_run_fast_snapshot_load(mis->from_src_file, mis, + &local_err)) { + goto fail; + } + } =20 trace_vmstate_downtime_checkpoint("dst-precopy-loadvm-completed"); =20 trace_process_incoming_migration_co_end(ret); - if (mis->have_listen_thread) { + if (migration_incoming_has_postcopy_thread(mis)) { /* * Postcopy was started, cleanup should happen at the end of the - * postcopy listen thread. + * postcopy listen thread or eager load thread. */ trace_process_incoming_migration_co_postcopy_end_main(); goto out; diff --git a/migration/migration.h b/migration/migration.h index 841f49b215..540124bc27 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -42,6 +42,7 @@ #define MIGRATION_THREAD_DST_FAULT "mig/dst/fault" #define MIGRATION_THREAD_DST_LISTEN "mig/dst/listen" #define MIGRATION_THREAD_DST_PREEMPT "mig/dst/preempt" +#define MIGRATION_THREAD_DST_SNAPSHOT_LOAD "mig/dst/snapshot_load" =20 struct PostcopyBlocktimeContext; typedef struct ThreadPool ThreadPool; @@ -120,6 +121,10 @@ struct MigrationIncomingState { bool have_listen_thread; QemuThread listen_thread; =20 + /* Thread to load pages eagerly in fast snapshot load case */ + bool have_eager_load_thread; + QemuThread eager_load_thread; + /* For the kernel to send us notifications */ int userfault_fd; /* To notify the fault_thread to wake, e.g., when need to quit */ diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index be9edac572..c31abd4339 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -2159,7 +2159,7 @@ bool postcopy_is_paused(MigrationStatus status) status =3D=3D MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP; } =20 -static void postcopy_listen_thread_bh(void *opaque) +static void postcopy_incoming_complete_bh(void *opaque) { MigrationState *s =3D migrate_get_current(); MigrationIncomingState *mis =3D migration_incoming_get_current(); @@ -2267,7 +2267,7 @@ out: rcu_unregister_thread(); postcopy_state_set(POSTCOPY_INCOMING_END); =20 - migration_bh_schedule(postcopy_listen_thread_bh, NULL); + migration_bh_schedule(postcopy_incoming_complete_bh, NULL); =20 object_unref(OBJECT(migr)); =20 @@ -2311,9 +2311,79 @@ int postcopy_incoming_cleanup(MigrationIncomingState= *mis) mis->have_listen_thread =3D false; } =20 + if (mis->have_eager_load_thread) { + qemu_thread_join(&mis->eager_load_thread); + mis->have_eager_load_thread =3D false; + } + if (migrate_postcopy_ram()) { rc =3D postcopy_ram_incoming_cleanup(mis); } =20 return rc; } + +/* + * Called by postcopy_ram_eager_load_thread over all blocks to load in all= the + * pending pages of given ram block + */ +static int ram_block_load_eager(RAMBlock *rb, void *opaque) +{ + MigrationIncomingState *mis =3D migration_incoming_get_current(); + MigrationState *s =3D migrate_get_current(); + Error *errp =3D NULL; + void *host =3D qemu_ram_get_host_addr(rb); + void *target; + + for (ram_addr_t page_loc =3D 0; page_loc < rb->used_length; + page_loc +=3D qemu_ram_pagesize(rb)) { + target =3D (uint8_t *)host + page_loc; + if (!postcopy_mapped_ram_load_page(mis, rb, page_loc, (uint64_t)ta= rget, + RAM_CHANNEL_PRECOPY, &errp)) { + migrate_error_propagate(s, errp); + return 1; + } + } + return 0; +} + +/* + * Used by fast snapshot load to eagerly load in all pages of RAM and sche= dule + * cleanup after entire RAM is loaded + */ +static void *postcopy_ram_eager_load_thread(void *opaque) +{ + MigrationIncomingState *mis =3D opaque; + + trace_postcopy_ram_eager_load_thread_entry(); + rcu_register_thread(); + qemu_event_set(&mis->thread_sync_event); + + if (foreach_not_ignored_block(ram_block_load_eager, NULL)) { + migrate_set_state(&mis->state, MIGRATION_STATUS_POSTCOPY_ACTIVE, + MIGRATION_STATUS_FAILED); + goto out; + } + migrate_set_state(&mis->state, MIGRATION_STATUS_POSTCOPY_ACTIVE, + MIGRATION_STATUS_COMPLETED); + +out: + postcopy_state_set(POSTCOPY_INCOMING_END); + migration_bh_schedule(postcopy_incoming_complete_bh, mis); + + rcu_unregister_thread(); + trace_postcopy_ram_eager_load_thread_exit(); + return NULL; +} + +/* + * Create thread for eager loading in fast snapshot load case + */ +int postcopy_ram_eager_load_setup(MigrationIncomingState *mis) +{ + postcopy_thread_create( + mis, &mis->eager_load_thread, MIGRATION_THREAD_DST_SNAPSHOT_LOAD, + postcopy_ram_eager_load_thread, QEMU_THREAD_JOINABLE); + mis->have_eager_load_thread =3D true; + return 0; +} diff --git a/migration/postcopy-ram.h b/migration/postcopy-ram.h index 98d918713f..6d1a296795 100644 --- a/migration/postcopy-ram.h +++ b/migration/postcopy-ram.h @@ -202,4 +202,6 @@ void mark_postcopy_blocktime_begin(uintptr_t addr, uint= 32_t ptid, int postcopy_incoming_setup(MigrationIncomingState *mis, Error **errp); int postcopy_incoming_cleanup(MigrationIncomingState *mis); =20 +int postcopy_ram_eager_load_setup(MigrationIncomingState *mis); + #endif diff --git a/migration/savevm.c b/migration/savevm.c index 23adaf9dd9..5857fb8ac2 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2959,6 +2959,32 @@ static bool postcopy_pause_incoming(MigrationIncomin= gState *mis) return true; } =20 +/* + * Starts the VM and launches the eager thread for fast snapshot load + */ +int qemu_loadvm_run_fast_snapshot_load(QEMUFile *f, MigrationIncomingState= *mis, + Error **errp) +{ + ERRP_GUARD(); + int ret =3D 0; + + postcopy_state_set(POSTCOPY_INCOMING_RUNNING); + + migration_bh_schedule(loadvm_postcopy_handle_run_bh, mis); + + migrate_set_state(&mis->state, MIGRATION_STATUS_POSTCOPY_DEVICE, + MIGRATION_STATUS_POSTCOPY_ACTIVE); + + ret =3D postcopy_ram_eager_load_setup(mis); + if (ret) { + error_prepend(errp, + "Failed to setup eager load for fast snapshot load: = "); + return ret; + } + + return ret; +} + int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis, Error **errp) { diff --git a/migration/savevm.h b/migration/savevm.h index 96fdf96d4e..f17d7057e1 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -67,6 +67,8 @@ void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, c= onst char *name, int qemu_save_device_state(QEMUFile *f, Error **errp); int qemu_loadvm_state(QEMUFile *f, Error **errp); void qemu_loadvm_state_cleanup(MigrationIncomingState *mis); +int qemu_loadvm_run_fast_snapshot_load(QEMUFile *f, MigrationIncomingState= *mis, + Error **errp); int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis, Error **errp); int qemu_load_device_state(QEMUFile *f, Error **errp); diff --git a/migration/trace-events b/migration/trace-events index de99d976ab..38f11e1e9f 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -314,6 +314,8 @@ postcopy_blocktime_tid_cpu_map(int cpu, uint32_t tid) "= cpu: %d, tid: %u" postcopy_blocktime_begin(uint64_t addr, uint64_t time, int cpu, bool exist= s) "addr: 0x%" PRIx64 ", time: %" PRIu64 ", cpu: %d, exist: %d" postcopy_blocktime_end(uint64_t addr, uint64_t time, int affected_cpu, int= affected_non_cpus) "addr: 0x%" PRIx64 ", time: %" PRIu64 ", affected_cpus:= %d, affected_non_cpus: %d" postcopy_blocktime_end_one(int cpu, uint8_t left_faults) "cpu: %d, left_fa= ults: %" PRIu8 +postcopy_ram_eager_load_thread_entry(void) "" +postcopy_ram_eager_load_thread_exit(void) "" =20 # exec.c migration_exec_outgoing(const char *cmd) "cmd=3D%s" --=20 2.54.0