From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1EE48CCD182 for ; Fri, 3 Oct 2025 15:42:21 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v4hto-0004po-U1; Fri, 03 Oct 2025 11:40:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v4htT-0004kN-4r for qemu-devel@nongnu.org; Fri, 03 Oct 2025 11:40:32 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v4htE-0007ay-Lp for qemu-devel@nongnu.org; Fri, 03 Oct 2025 11:40:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759506008; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XZBWU8aJAaVX3vDXS3VFgy7C7NQ3h0z448HC0Xdt2KA=; b=bRmNDm7EmyfwON1JwtPYMuYZUSQwU5bL330/bslSCNwEkO0djURIrj1HUxHFR/DLein7R4 zVtPsoLRNx17Be+MadzAr0+YMqO3aVQ+rnV1ilvNV7vPps6/BI2ldv/q5paWmJxT62cM0+ gf9G88Yeo5baCODPQXgvD3NWnEqBfA0= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-280-sAuuKYFCMZ2SLyp-Og2-xg-1; Fri, 03 Oct 2025 11:40:06 -0400 X-MC-Unique: sAuuKYFCMZ2SLyp-Og2-xg-1 X-Mimecast-MFC-AGG-ID: sAuuKYFCMZ2SLyp-Og2-xg_1759506006 Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-818bf399f8aso58397596d6.2 for ; Fri, 03 Oct 2025 08:40:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759506006; x=1760110806; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XZBWU8aJAaVX3vDXS3VFgy7C7NQ3h0z448HC0Xdt2KA=; b=lVEZrd/tanX1M8tcloFx23arXEDleim77uLd0DpoAc6kvuNm8Y+3kYnxuWnavLBRYd OScSDqNM1mNxXxhe7L0Ju3AlyfkgNP5rkUS8/8O86+9q2SdD9wmSnLUmfi8gfG8t5Kpp YR/BJ0Lr8tMekr+8IbEEiN79gqpSI62G1b+XdYKRtyp4RAZNp3QR8yTA6j3nsej6QNST bR+XN2txlEiCjI2rgoLOtUA2vVZ2lWJ4rb9Ci7q31DGmHdPUslHdMdwEFL+PsmYWqLxi CaMF+F3YJqio1VPFiUa7MAH4NdTb5nzrXEuDReeb4gKNGXOKdFh0fVnMRZAASM0wdScO xgZQ== X-Forwarded-Encrypted: i=1; AJvYcCWq5bZDCI+445D7EZgx1aTIIFoxEHRgI0/5Rs8TFlWVFzEKDfsBux0YambQr6uTuznYw1rSvtoOyERr@nongnu.org X-Gm-Message-State: AOJu0Ywlkqq8Ry+krUmtpbelDaaaZLR9I/5TitubzhK7JoY56tLw7kos g5Qgnw6RNfRg1UAvYcvlOhvH9E5s37ISDh4BYBb6Sb7IcKwjRUZVdJP+OXrWvtDPB1id9TCesOs COga5QasOEu5rwa80mdKwQPqYubiPvv8x856IBS3e+fZIFMFnFLtaGwuG X-Gm-Gg: ASbGncv40i23YXEd7aD4oIIOugqrhFr6asFKHwSNIZrO7whgSUNCunaLpBPhhG5JGia 4OkFYvIX49UF7s3e18c7OL0/T+enA3D45PfDK2fjBx8VzZNbsRQw17IS9Wu2/uDy2QN5k2YSiFX +SvKHhUXYIiVuotRmG1ZdIqod9zrX2oF0IG8e5ckGWWkvG/TWwBDudk7AGMgwpiYjxcUyugPesg q4GUDbWOIey9BEmwIgAvQVIE8FBzRFYs3RMClhch5nUN7EPotBuW3lmz+vZ+rN3cJTrT1sDyT41 M4XlGm1BDXvqGrKd9spUeItIVJveeuEaFR74gA== X-Received: by 2002:a05:6214:250a:b0:80a:7bd3:e61f with SMTP id 6a1803df08f44-879dc867d90mr44627446d6.52.1759506006109; Fri, 03 Oct 2025 08:40:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFx+eJXDwrbXpR88JIEkb7bNej9N7MDmkQ3R3eWwaHteaHme6sVBN/F5OGF1SFnYjp/tv6HbQ== X-Received: by 2002:a05:6214:250a:b0:80a:7bd3:e61f with SMTP id 6a1803df08f44-879dc867d90mr44626986d6.52.1759506005535; Fri, 03 Oct 2025 08:40:05 -0700 (PDT) Received: from x1.local ([142.188.210.50]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-878bb53d91fsm40656746d6.23.2025.10.03.08.40.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Oct 2025 08:40:05 -0700 (PDT) From: Peter Xu To: Peter Maydell , qemu-devel@nongnu.org Cc: Fabiano Rosas , peterx@redhat.com, David Hildenbrand , Paolo Bonzini , Arun Menon , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Akihiko Odaki Subject: [PULL 09/45] migration: push Error **errp into qemu_loadvm_state_main() Date: Fri, 3 Oct 2025 11:39:12 -0400 Message-ID: <20251003153948.1304776-10-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20251003153948.1304776-1-peterx@redhat.com> References: <20251003153948.1304776-1-peterx@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=170.10.133.124; envelope-from=peterx@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.467, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org From: Arun Menon This is an incremental step in converting vmstate loading code to report error via Error objects instead of directly printing it to console/monitor. It is ensured that qemu_loadvm_state_main() must report an error in errp, in case of failure. Set errp explicitly if it is NULL in case of failure in the out section. This will be removed in the subsequent patch when all of the calls are converted to passing errp. The error message in the default case of qemu_loadvm_state_main() has the word "savevm". This is removed because it can confuse the user while reading destination side error logs. Reviewed-by: Daniel P. Berrangé Reviewed-by: Fabiano Rosas Signed-off-by: Arun Menon Tested-by: Fabiano Rosas Reviewed-by: Akihiko Odaki Link: https://lore.kernel.org/r/20250918-propagate_tpm_error-v14-9-36f11a6fb9d3@redhat.com Signed-off-by: Peter Xu --- migration/savevm.h | 3 ++- migration/colo.c | 3 +-- migration/savevm.c | 36 +++++++++++++++++------------------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/migration/savevm.h b/migration/savevm.h index b12681839f..c337e3e3d1 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -66,7 +66,8 @@ int qemu_save_device_state(QEMUFile *f); int qemu_loadvm_state(QEMUFile *f, Error **errp); void qemu_loadvm_state_cleanup(MigrationIncomingState *mis); -int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis); +int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis, + Error **errp); int qemu_load_device_state(QEMUFile *f, Error **errp); int qemu_loadvm_approve_switchover(void); int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f, diff --git a/migration/colo.c b/migration/colo.c index a426ec5b60..ad50a3abc9 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -686,11 +686,10 @@ static void colo_incoming_process_checkpoint(MigrationIncomingState *mis, bql_lock(); cpu_synchronize_all_states(); - ret = qemu_loadvm_state_main(mis->from_src_file, mis); + ret = qemu_loadvm_state_main(mis->from_src_file, mis, errp); bql_unlock(); if (ret < 0) { - error_setg(errp, "Load VM's live state (ram) error"); return; } diff --git a/migration/savevm.c b/migration/savevm.c index 9e30718995..f1338f5cf6 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2105,7 +2105,7 @@ static void *postcopy_ram_listen_thread(void *opaque) qemu_file_set_blocking(f, true, &error_fatal); /* TODO: sanity check that only postcopiable data will be loaded here */ - load_res = qemu_loadvm_state_main(f, mis); + load_res = qemu_loadvm_state_main(f, mis, &error_fatal); /* * This is tricky, but, mis->from_src_file can change after it @@ -2456,10 +2456,7 @@ static int loadvm_handle_cmd_packaged(MigrationIncomingState *mis, Error **errp) qemu_coroutine_yield(); } while (1); - ret = qemu_loadvm_state_main(packf, mis); - if (ret < 0) { - error_setg(errp, "VM state load failed: %d", ret); - } + ret = qemu_loadvm_state_main(packf, mis, errp); trace_loadvm_handle_cmd_packaged_main(ret); qemu_fclose(packf); object_unref(OBJECT(bioc)); @@ -3080,18 +3077,22 @@ static bool postcopy_pause_incoming(MigrationIncomingState *mis) return true; } -int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis) +int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis, + Error **errp) { + ERRP_GUARD(); uint8_t section_type; int ret = 0; - Error *local_err = NULL; retry: while (true) { section_type = qemu_get_byte(f); - ret = qemu_file_get_error_obj_any(f, mis->postcopy_qemufile_dst, NULL); + ret = qemu_file_get_error_obj_any(f, mis->postcopy_qemufile_dst, errp); if (ret) { + error_prepend(errp, + "Failed to load section ID: stream error: %d: ", + ret); break; } @@ -3112,10 +3113,7 @@ retry: } break; case QEMU_VM_COMMAND: - ret = loadvm_process_command(f, &local_err); - if (ret < 0) { - error_report_err(local_err); - } + ret = loadvm_process_command(f, errp); trace_qemu_loadvm_state_section_command(ret); if ((ret < 0) || (ret == LOADVM_QUIT)) { goto out; @@ -3125,7 +3123,7 @@ retry: /* This is the end of migration */ goto out; default: - error_report("Unknown savevm section type %d", section_type); + error_setg(errp, "Unknown section type %d", section_type); ret = -EINVAL; goto out; } @@ -3133,6 +3131,9 @@ retry: out: if (ret < 0) { + if (*errp == NULL) { + error_setg(errp, "Loading VM state failed: %d", ret); + } qemu_file_set_error(f, ret); /* Cancel bitmaps incoming regardless of recovery */ @@ -3153,6 +3154,7 @@ out: migrate_postcopy_ram() && postcopy_pause_incoming(mis)) { /* Reset f to point to the newly created channel */ f = mis->from_src_file; + error_free_or_abort(errp); goto retry; } } @@ -3186,10 +3188,7 @@ int qemu_loadvm_state(QEMUFile *f, Error **errp) cpu_synchronize_all_pre_loadvm(); - ret = qemu_loadvm_state_main(f, mis); - if (ret < 0) { - error_setg(errp, "Load VM state failed: %d", ret); - } + ret = qemu_loadvm_state_main(f, mis, errp); qemu_event_set(&mis->main_thread_load_event); trace_qemu_loadvm_state_post_main(ret); @@ -3270,9 +3269,8 @@ int qemu_load_device_state(QEMUFile *f, Error **errp) int ret; /* Load QEMU_VM_SECTION_FULL section */ - ret = qemu_loadvm_state_main(f, mis); + ret = qemu_loadvm_state_main(f, mis, errp); if (ret < 0) { - error_setg(errp, "Failed to load device state: %d", ret); return ret; } -- 2.50.1