From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789899; cv=none; d=zohomail.com; s=zohoarc; b=j5EWDqyuO59vLB0EH2qMkadO9HuJPdbm5hzfsjY1akmeJWl6xGMguR4KnYoFxxozVZ2UbYADUCM4oBeekrMW9VeMjG6ZndRZjifGKYFtPz3T4XJ+I6MpeY0Ont3MyqFxyQJ8PVObEQ0tQa9QehkTcE22zg0uunhZN5fR8BMCIKE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789899; 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=xUBKuj9y3ughYvyRrD8j2p4lQRaYcWCVG4lkyAlW4Ok=; b=QgD0mvAwF6XnWtm5zxppFr99Wr/vW52XfGQNSYWD2jTSe3Nn9e97e7bRZjhYnYu2YiF2Vgf4Meqt+jfD9lSr2FBLUHEensapk22PnafCS2U6gPHPT0FUX2HPCXkfiEf6bc61GRKBGVsbeNaYqGcEV+hT7lLGAxZDVwsA7srh9Y0= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789899616912.0528645909017; Tue, 17 Mar 2026 16:24:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlJ-0003w5-HG; Tue, 17 Mar 2026 19:23:45 -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 1w2dlH-0003vE-FL for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:43 -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 1w2dlD-0006RR-OI for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:42 -0400 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-382-iz-8clSkPd6VfyhSjIwEYA-1; Tue, 17 Mar 2026 19:23:37 -0400 Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-89c4885814dso563422326d6.3 for ; Tue, 17 Mar 2026 16:23:37 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789818; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xUBKuj9y3ughYvyRrD8j2p4lQRaYcWCVG4lkyAlW4Ok=; b=g/t6EOYQ5GRC4+r6dg0LIwP040i+Jy5X1jSPnCeQt9v2hLKXspY88U4cXH/OUnLymIXtnW Ej6yTEl7mAW/mViX/NIbbDbk0p3ZzBjpeUbZ41QsL0JZVIHEEdvG3Q6s/1voq+fqk0GP7P Y7kGGwbzTVUf6QYqe1Kb+Gx4NgS0jfo= X-MC-Unique: iz-8clSkPd6VfyhSjIwEYA-1 X-Mimecast-MFC-AGG-ID: iz-8clSkPd6VfyhSjIwEYA_1773789817 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789817; x=1774394617; 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=xUBKuj9y3ughYvyRrD8j2p4lQRaYcWCVG4lkyAlW4Ok=; b=aXhAJluL05TYWWrDyuLzuVtjMHED0nGlNYe1hnGNuiuBEv9VLHg2+oRM0z/xXY8YuU CIiaicbtzKHZQhozCWVhxtB01eFic2F0DWY3eSg5uvDA119UvKRozsYD3q4RdBzTyEqm yhEezQ+Bs6KwJnDWgyARY9FMjNsV2YabRNQTh8F48IWdDsK/2eSepBT9HtcTQvf3t/t4 vSzS5cCutam4gLbNDhfdIF50fXqrPwZA27kRokWuAia4A9W0gLOoiyzOOmxWpuS42Mad aCTg+vl3eBV4o6/qGxjaJe5o4chpsfStH6HsKk7wvMDY0aMargKQzk45JxStZSgFHA1x EOKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789817; x=1774394617; 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=xUBKuj9y3ughYvyRrD8j2p4lQRaYcWCVG4lkyAlW4Ok=; b=YgZkHOnW3yjXKuNed2HNJFXfi3jzuKdSzDVlqvTSLKm3GDPOVDRb0heZz+jjGNDsM/ uxTpRb4NDJtsD023eSQEFv9J7AWTmeWnhZta21jd7F9mOie6ElMuQ6fSHTKbBuOxj3yy iHmvS6izwZl5ePhJhm0dej+TjCxbvMJj39ecozmbBG5mWcr04o5KL9fKqpNYPiXhxQ7P gFS/XPlcbcsJL1Lk5KN1qPHJrzraHgHscRQYHCL5WFkJCDCEIB73mqoYlUfc+VfKflBo ODzG8k1GwCvqNTfMICCLrVTZ0s4J6MZ7ujusGGQP0pwMw0mFwUwJfKu2M1qM6xFfc4pe qtRQ== X-Gm-Message-State: AOJu0YzSM0b5e5WErt0rmRv05Om3CJgXM4KrClFmbcGUVx/Z+gYljI1I Qevw5UqJiSFUR2KjCtjNJI9BY0kfLbooN0T2EY1O0H5wnpSk24WpcKf7YmaILNNe1PIQvXR0aJv pPn4Q8fj8qta3PQs1rM9ZFZpI4RdHHAPUDL1zYFC5dOaOv7DEWfm+/2rO8I8ROYI+PnzTjXtY1w CZMAIjgsw+sNYbP0d5VqfxfiM2ax2swyuAY+TXPA== X-Gm-Gg: ATEYQzxmlfh9SDKUB7IVb8qf9OD308VEOb5P1FO5b0yXN0tOelE3gl4GKaqTicwsh/P pLfVFE452HO761E1sTdbHqvzNWMk8TL/j6mNqU1al5u4DOGOFQAguoyv5qeRVIOYJGiAuqRFDMR yh1qmHyAKLqzUD7/Ap38bfoirpNC7++Oilz3jz9e+aBCyv06ND4AXMl8n/xQp6QJVpmA9qPlfDV WxfF/3l6QUTFsEf61QiAEqk3dAth0dORyvfWL7cFqDUBJvjY9FlGWQd2dL7dXtMncVZ8FJTNSwC R+DBk2HNcotB/ZUB2MzYDjGkDFZgy517McN7++HvsF2VhAEGwS4qnYeb2oj24jfPMCtlk2j0CYJ j8WmSxJ8lSi4Qrg== X-Received: by 2002:a05:6214:c67:b0:89a:870:2ea2 with SMTP id 6a1803df08f44-89c6b59c895mr23109676d6.48.1773789816778; Tue, 17 Mar 2026 16:23:36 -0700 (PDT) X-Received: by 2002:a05:6214:c67:b0:89a:870:2ea2 with SMTP id 6a1803df08f44-89c6b59c895mr23109326d6.48.1773789816311; Tue, 17 Mar 2026 16:23:36 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 01/10] vmstate: Pass in struct itself for VMSTATE_ARRAY_OF_POINTER Date: Tue, 17 Mar 2026 19:23:23 -0400 Message-ID: <20260317232332.15209-2-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; 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: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789900379158500 Content-Type: text/plain; charset="utf-8" Passing in a pointer almost never helps. Convert it to pass in struct for further refactoring on VMS_ARRAY_OF_POINTER. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- include/migration/vmstate.h | 6 +++--- tests/unit/test-vmstate.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index d4a39aa794..8992fba57d 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -547,9 +547,9 @@ extern const VMStateInfo vmstate_info_qlist; .version_id =3D (_version), \ .num =3D (_num), \ .info =3D &(_info), \ - .size =3D sizeof(_type), \ + .size =3D sizeof(_type *), \ .flags =3D VMS_ARRAY|VMS_ARRAY_OF_POINTER, \ - .offset =3D vmstate_offset_array(_state, _field, _type, _num), \ + .offset =3D vmstate_offset_array(_state, _field, _type*, _num), \ } =20 #define VMSTATE_ARRAY_OF_POINTER_TO_STRUCT(_f, _s, _n, _v, _vmsd, _type) {= \ @@ -1093,7 +1093,7 @@ extern const VMStateInfo vmstate_info_qlist; VMSTATE_TIMER_PTR_V(_f, _s, 0) =20 #define VMSTATE_TIMER_PTR_ARRAY(_f, _s, _n) \ - VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer = *) + VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer) =20 #define VMSTATE_TIMER_TEST(_f, _s, _test) \ VMSTATE_SINGLE_TEST(_f, _s, _test, 0, vmstate_info_timer, QEMUTimer) diff --git a/tests/unit/test-vmstate.c b/tests/unit/test-vmstate.c index cadbab3c5e..6a42cc1a4e 100644 --- a/tests/unit/test-vmstate.c +++ b/tests/unit/test-vmstate.c @@ -668,7 +668,7 @@ const VMStateDescription vmsd_arpp =3D { .minimum_version_id =3D 1, .fields =3D (const VMStateField[]) { VMSTATE_ARRAY_OF_POINTER(ar, TestArrayOfPtrToInt, - AR_SIZE, 0, vmstate_info_int32, int32_t*), + AR_SIZE, 0, vmstate_info_int32, int32_t), VMSTATE_END_OF_LIST() } }; --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789899; cv=none; d=zohomail.com; s=zohoarc; b=CIqFWF93wZQkaxkusXpImd23NFws7LKWkln5hf+I7FoB7ysg8VKorWj/KfabUfPCuHd8x3nNnHmMgWEg/iCQ8xNbpa4XRCOum431C92hq+RcqeBsLZT2iPXrFnTbLj+TBhLLjwyDaFLoDdXGEM99fMKFhFYn19VKDAU5SQYcAGE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789899; 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=uKbmsVa0I6XnRkxq8tVtN8XjKOy2BuQjcC7lAo24P9Q=; b=j4/pKom+y1OpCn51wFTeVMrj/wReHLFzgfsRR8ShZFV1vmttfhILHvYWZPs9vuwmnDamwAk9r+Ajy5I1QFxEgF3YR9WLYS4Ah5SttrOb5XuSefStbCA2l9CmcYh6paAjhbr4BMeD7t/OMwM9b+7hysFCfO7v6X0tNBeoLmbHeuE= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789899638938.2899341302311; Tue, 17 Mar 2026 16:24:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlI-0003vG-21; Tue, 17 Mar 2026 19:23:44 -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 1w2dlG-0003uy-7B for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:42 -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 1w2dlE-0006Ra-Q0 for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:41 -0400 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-590-yK03Vk4IO9uUlvpvY4dNIw-1; Tue, 17 Mar 2026 19:23:39 -0400 Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-89a0684d05dso15528846d6.1 for ; Tue, 17 Mar 2026 16:23:39 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789820; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uKbmsVa0I6XnRkxq8tVtN8XjKOy2BuQjcC7lAo24P9Q=; b=FIzMYENIZm53FfsLxHF28FjhGfYS4LYzBLd+ng71r2/wgaW4nEqcd/wh5OeDRNiwD/IuzM 2K5i5j2FsFmtLlzfAUASoiT8oer/yECf9m2zmxbt2y8xYakcWFhEH8as7givzlC8bJcmjd gPG6ajY3pXC8kxaEFculKarMQKkUJsQ= X-MC-Unique: yK03Vk4IO9uUlvpvY4dNIw-1 X-Mimecast-MFC-AGG-ID: yK03Vk4IO9uUlvpvY4dNIw_1773789819 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789818; x=1774394618; 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=uKbmsVa0I6XnRkxq8tVtN8XjKOy2BuQjcC7lAo24P9Q=; b=C42g72OurAOOafZlGnizkSJ40x9Q0fFF5+YxErpu5vAY0VFJmrUhQRb62Sm14tPMjc TI4ehjtNfdao9tcN+qAqWj7SOrAV1XVhlSuvOybjjLEfQbc0FDQivlJnRuoWT6Wk7ZEJ tf3r1G/ZwAE6TcvUGj+gat0hMZxcCrA8H70ahYYc3ZoJrxV52yu2PThid6R51Q3QfUUD VPc1Y0lb2gvV5rwAe0lrTyLXSRakpcnOaRMaM0gpOu1fTWGxCJt4hFR/JYlwj4JU7fNI QWIOib7aItfiolzJsZKiyHNMncMgcW9AuIBdfkTyih5SYmJ819JK3rZrtr4DzQgwQxuo 7jxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789818; x=1774394618; 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=uKbmsVa0I6XnRkxq8tVtN8XjKOy2BuQjcC7lAo24P9Q=; b=IYVTzGaEUnGQwq3quBSAgHkAyWWOT/Dz9IjvFBH4TsB+ZGyXG9La7imH9eMdaxwOT8 GdSzIQNcg3b4mHqI5gCkbJNouaf8IAqOV2+HM4B5U1LHhMtS435XrhZgXlY1FD7GJPeW 3C+lh8qCttUnRNhM++15zacGzygOiNdldiao9N5DIgElbX7FOz0UkoF+wmZeVc9X9AZt niI72sTgdwhmXCkUFOJvd8pBq4VmPQ6vcHq9O7tSk8EtovxaJYFbHE0+UFsP4au6dLBp H2VGmy+HboxWIwq3Rurhsvd9wOWhAfWAUQ2ALsIaLPByEnuWHZMEXqS1TN01/imPVxuz J2iQ== X-Gm-Message-State: AOJu0YyLur5MUtJSnKk5WWm+uhoilPcvRiSolc31NXbMFBDJ+wT4EpzR CPeAYs3im8P0hdWuZjIbCpES1Bv7YkulhQxIkntnUnS8MusV0nGDN3q/BW2OJbfEZ1/CEx81eR3 UEwpvj9MKu/pH0nXAhm4CHxfBj9VRWWqot4G3Fi65u1MsiTxAxmjTpwKdLozFbVGWt0Pa6AUOTA gvu1mGOJUvSyVGcFn9E/RynhSwdwe78ywIflAkXg== X-Gm-Gg: ATEYQzxqcnl8mLd71r6qxxMMV4mExav+5gt3WkvMSBYXvdibX/Zz6kXnLh7d6hN7SlK 4+VWZjQl1G7vTIhhvBjbvKYSNMdkJ4zKISSzjl30Sv1R5T/YVdDgwA5EHby/L277TtVfIoGuzDQ EJwyfY6QKDWS5tyhCvkWtBG/gkBJtKh2Wv0+FDweh5gS/R3+tsRIGkR/rG7U7r7AeHnNoEMxtbc rpGIQRh+W02PzNTPQ1Jrm3rbp4sPbo9QFpSPUC/R+axPv21Q5cA1AthY6lfLsrpNReBNgAptlXG mi2nu9Qv6yC4TdyRcM4C3PYGe4TaRNR59l5uOGXJA0JifKvohvMT9WRtOOjG0NK7vCRiJXjOp47 vT9+gQLH1x+R19g== X-Received: by 2002:a05:6214:4117:b0:89c:58fb:d345 with SMTP id 6a1803df08f44-89c5e36eb44mr64705506d6.17.1773789818262; Tue, 17 Mar 2026 16:23:38 -0700 (PDT) X-Received: by 2002:a05:6214:4117:b0:89c:58fb:d345 with SMTP id 6a1803df08f44-89c5e36eb44mr64705236d6.17.1773789817746; Tue, 17 Mar 2026 16:23:37 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 02/10] vmstate: Pass in struct itself for VMSTATE_VARRAY_OF_POINTER_UINT32 Date: Tue, 17 Mar 2026 19:23:24 -0400 Message-ID: <20260317232332.15209-3-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; 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: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789901763154100 Content-Type: text/plain; charset="utf-8" Passing in a pointer almost never helps. Convert it to pass in struct for further refactoring on VMS_ARRAY_OF_POINTER. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- include/hw/intc/riscv_aclint.h | 6 +++--- include/migration/vmstate.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/hw/intc/riscv_aclint.h b/include/hw/intc/riscv_aclint.h index 5310615cbf..0e0b98acb0 100644 --- a/include/hw/intc/riscv_aclint.h +++ b/include/hw/intc/riscv_aclint.h @@ -80,8 +80,8 @@ enum { RISCV_ACLINT_SWI_SIZE =3D 0x4000 }; =20 -#define VMSTATE_TIMER_PTR_VARRAY(_f, _s, _f_n) \ -VMSTATE_VARRAY_OF_POINTER_UINT32(_f, _s, _f_n, 0, vmstate_info_timer, \ - QEMUTimer *) +#define VMSTATE_TIMER_PTR_VARRAY(_f, _s, _f_n) \ + VMSTATE_VARRAY_OF_POINTER_UINT32(_f, _s, _f_n, 0, vmstate_info_timer, \ + QEMUTimer) =20 #endif diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 8992fba57d..68fd954411 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -567,9 +567,9 @@ extern const VMStateInfo vmstate_info_qlist; .version_id =3D (_version), = \ .num_offset =3D vmstate_offset_value(_state, _field_num, uint32_t), = \ .info =3D &(_info), = \ - .size =3D sizeof(_type), = \ + .size =3D sizeof(_type *), = \ .flags =3D VMS_VARRAY_UINT32 | VMS_ARRAY_OF_POINTER | VMS_POINTER= , \ - .offset =3D vmstate_offset_pointer(_state, _field, _type), = \ + .offset =3D vmstate_offset_pointer(_state, _field, _type *), = \ } =20 #define VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, _num, _version, _= vmsd, _type) { \ --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789899; cv=none; d=zohomail.com; s=zohoarc; b=i6Va+zfqUZFmQofDJy1nJKh2W+P56JKSULYdo2gpJ3rZh2zmSb3uKQjqqkPi+Qnzl0KHTwSF2BnQ7mlxoWqpZniXgwVfqtWi561gGJ8DjwRxhfdHmVpoTDZdh7qiZKoQhTrgg+xhXAeMTjDtRIMK5JQmpG9tqheO7ATLrvbo4Uk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789899; 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=PN63kHSkiGklfAkICvLJCg4I6fSHLpVorWEfRkM9FZU=; b=RNhXv4xOYw/mqbtud2Jlr6yU248xMg+9sXHBofX11tlPBLmSdcLpXz9pejzjeDyq6XnaxdYaqQm94eo4/gzqGZcYPuLX/3UZ/oB+B+2rooG66/bq0OID7WqaJ1cPFsBuC0Lq5f3Uds+HeRbowZto0EHWSn3PJ2py5SZ2XAK42C4= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789899182792.6020584691139; Tue, 17 Mar 2026 16:24:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlK-0003wV-38; Tue, 17 Mar 2026 19:23:46 -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 1w2dlI-0003vv-Pl for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:44 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w2dlH-0006Rw-7k for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:44 -0400 Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-685-PEJrET97P7anVQf27T9HNA-1; Tue, 17 Mar 2026 19:23:41 -0400 Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-89c56300e64so106186636d6.3 for ; Tue, 17 Mar 2026 16:23:40 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789822; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PN63kHSkiGklfAkICvLJCg4I6fSHLpVorWEfRkM9FZU=; b=iUelgLXHp6nXM+6upe2nwk7xSBshRn5RO32fxhns0xRnp0FbYUMyedOG8RfODeRZsXun4p MNjXg+iogtEAaVoJ+sAbh1+6/V8OU9i6vbNwGYMX9IQGTX1/Ph5SZCuAuxBcxsbs0sGAxv GNjzZ3klGghZofZjzfoumgJltD+rCX8= X-MC-Unique: PEJrET97P7anVQf27T9HNA-1 X-Mimecast-MFC-AGG-ID: PEJrET97P7anVQf27T9HNA_1773789820 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789820; x=1774394620; 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=PN63kHSkiGklfAkICvLJCg4I6fSHLpVorWEfRkM9FZU=; b=BtVm1dVSp2KLgKosQd70/dsJPBR8sE1TOwvDdwwOYtsn++rM14sGYPTv+zJP7A4raR q5c+ALbWsC/VCTxolHXxEhyUY2eRW51QTXChep7w0Ulu51Zq5GSe5iTX27zHVtOFXx1j 9cNU78SPr+TFlozfR9v1jH/Up/Cr2+THc09YoCT6OEUcOax1fTSpAt67R5FWOFlGW57n oEtFfReqy7juq5A4tu1Dc2CWCaWsfeRZbt0Q8ZoziXFv/CU2+8I3Bow8U1X7YEnInnBS NDttbhvsPU0u22LZIRy+MM9QGfU6I6CjfugTY8aihXs0r+M7dUA0v8g1SBxK0Agyfs5x JoDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789820; x=1774394620; 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=PN63kHSkiGklfAkICvLJCg4I6fSHLpVorWEfRkM9FZU=; b=DrfsJ24tKDna4aImP8TSac3dAQkr3scRYwN99ZjREW1STubkE6s60WRmzwY/eMzyJB Pis2BYxzXAru6qWUVBhAzEFKjyZbJ8Zy1luzdte+gWccoehc+5ydgkmLyyZb972+wIIb IvRQ9vSmicZZduxJQPpAKzmahwNfbwrW7sdDL4dXr+uFF4adCzW7X3odgpl3/INMMlsk 0uq7q5vuchPXdElEtivXFytfRMIJkr2otLLeo3H9iADCFiONmLt9aiNtcpHV8UDflt+x 0InCXOR1qGqNao8m3rM0SOuRW4gY9OmIyjpwSAjFx6CHeyQNPeoMM3V7vXtuCOblbjrB NVLQ== X-Gm-Message-State: AOJu0Yz0UoDVd4WPDggLwp5G+1a25lQT57CqdIwsRuu/DoQss3D0Mk84 sS2skhH2FJs96g53QugONcr4MV3aSB3C43PLAzWio+CQYHgE06vVgBtJU7fx6w2w5HLYZHIxTJy uf0fmcmWlcGVOWXckQOWu5KN58b3MveV7qQeWAIkSHB8ULFJFZA6Zy+J6OM5c2i9HYwCoqKlXQW E/I7qsA1q2TCMT9jZ+j+/8lyJutxKdScKJVQx0Dg== X-Gm-Gg: ATEYQzy9mPsHwYurtDMQb1uQ7BdvThwgY/Q6m5Xm9dCJKGk9jQ7Hj7KlBo1M+hRz9ry s1EDiu19QMVgYfEP0RbtWaei/ua8CCUFMAJuXGb1OGkdSD22fFXoLFWsWcYADY/m0Qp7K3JOcy3 H/VnoFbqDlWZjwDQMEfefnmNpHS2+ml9vvCU3H2ldPg1CM94076+psiz1ahH/KFSUnQp+uX+jZZ 25l1UMjTPdpxIZ943HLASCrdvPm4KTUA+ez2AesqIrG77LNLDgmbN/0XHdXtWHZvHB7gmunkYDr Qn+/9pKUTbcHm9wBMl9bWeKq/deqMZcYzlKbys3Xie3OVmYguzTxMtdcR11wacWbtWSOrk6SWjl yjXIvU9ZE6pez7w== X-Received: by 2002:a05:6214:5d0f:b0:89c:5557:88b9 with SMTP id 6a1803df08f44-89c6b58d971mr21984206d6.48.1773789820023; Tue, 17 Mar 2026 16:23:40 -0700 (PDT) X-Received: by 2002:a05:6214:5d0f:b0:89c:5557:88b9 with SMTP id 6a1803df08f44-89c6b58d971mr21983916d6.48.1773789819542; Tue, 17 Mar 2026 16:23:39 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 03/10] vmstate: Do not set size for VMS_ARRAY_OF_POINTER Date: Tue, 17 Mar 2026 19:23:25 -0400 Message-ID: <20260317232332.15209-4-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=peterx@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789901802154100 Content-Type: text/plain; charset="utf-8" When VMS_ARRAY_OF_POINTER is specified, it means the vmstate field is an array of pointers. The size of the element is not relevant to whatever it is stored inside: it is always the host pointer size. Let's reserve the "size" field in this case for future use, update vmstate_size() so as to make it still work for array of pointers properly. When at this, provide rich documentation on how size / size_offset works in vmstate. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- include/migration/vmstate.h | 20 ++++++++++++++++---- migration/savevm.c | 3 +++ migration/vmstate.c | 10 +++++++++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 68fd954411..b4bc69486d 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -183,11 +183,26 @@ typedef enum { struct VMStateField { const char *name; size_t offset; + + /* + * @size or @size_offset specifies the size of the element embeded in + * the field. Only one of them should be present never both. When + * @size_offset is used together with VMS_VBUFFER, it means the size is + * dynamic calculated instead of a constant. + * + * When the field is an array of any type, this stores the size of one + * element of the array. + * + * NOTE: even if VMS_POINTER or VMS_ARRAY_OF_POINTER may be specified, + * this parameter always reflects the real size of the objects that a + * pointer point to. + */ size_t size; + size_t size_offset; + size_t start; int num; size_t num_offset; - size_t size_offset; const VMStateInfo *info; enum VMStateFlags flags; const VMStateDescription *vmsd; @@ -547,7 +562,6 @@ extern const VMStateInfo vmstate_info_qlist; .version_id =3D (_version), \ .num =3D (_num), \ .info =3D &(_info), \ - .size =3D sizeof(_type *), \ .flags =3D VMS_ARRAY|VMS_ARRAY_OF_POINTER, \ .offset =3D vmstate_offset_array(_state, _field, _type*, _num), \ } @@ -557,7 +571,6 @@ extern const VMStateInfo vmstate_info_qlist; .version_id =3D (_v), \ .num =3D (_n), \ .vmsd =3D &(_vmsd), \ - .size =3D sizeof(_type *), \ .flags =3D VMS_ARRAY|VMS_STRUCT|VMS_ARRAY_OF_POINTER, \ .offset =3D vmstate_offset_array(_s, _f, _type*, _n), \ } @@ -567,7 +580,6 @@ extern const VMStateInfo vmstate_info_qlist; .version_id =3D (_version), = \ .num_offset =3D vmstate_offset_value(_state, _field_num, uint32_t), = \ .info =3D &(_info), = \ - .size =3D sizeof(_type *), = \ .flags =3D VMS_VARRAY_UINT32 | VMS_ARRAY_OF_POINTER | VMS_POINTER= , \ .offset =3D vmstate_offset_pointer(_state, _field, _type *), = \ } diff --git a/migration/savevm.c b/migration/savevm.c index 8115203b51..f5a6fd0c66 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -868,6 +868,9 @@ static void vmstate_check(const VMStateDescription *vms= d) =20 if (field) { while (field->name) { + if (field->flags & VMS_ARRAY_OF_POINTER) { + assert(field->size =3D=3D 0); + } if (field->flags & (VMS_STRUCT | VMS_VSTRUCT)) { /* Recurse to sub structures */ vmstate_check(field->vmsd); diff --git a/migration/vmstate.c b/migration/vmstate.c index e98b5f5346..e29a8c3f49 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -110,13 +110,21 @@ static int vmstate_n_elems(void *opaque, const VMStat= eField *field) =20 static int vmstate_size(void *opaque, const VMStateField *field) { - int size =3D field->size; + int size; =20 if (field->flags & VMS_VBUFFER) { size =3D *(int32_t *)(opaque + field->size_offset); if (field->flags & VMS_MULTIPLY) { size *=3D field->size; } + } else if (field->flags & VMS_ARRAY_OF_POINTER) { + /* + * For an array of pointer, the each element is always size of a + * host pointer. + */ + size =3D sizeof(void *); + } else { + size =3D field->size; } =20 return size; --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789908; cv=none; d=zohomail.com; s=zohoarc; b=GvvQWyCjGsVlYjYHV9X/zVhVXZ1I3y0TIhgrRcvVJOLeRJuqrt4jqXutux0htSr1CaLMQs1KIreWLKTFrDjbWCRl/bfxgc4EsvPL2JQZenTxEKeB4FT9a8ZzzZoazxMOU133SgZy/FsV/JiDy2dbzryMVqXO7/1iEp3tRFKI0aw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789908; 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=TjG79rNrziyooP9oARcvWCdnLH3yo6F+TaDuNY6Nuzk=; b=g75xBblnySX7eMooE5aC7w5JuQ+eO9QgLphcvDmxy2qTGy74J5wFxI7y2C3BIc8oiN91ZnUAXtgmxwFqk2r4jNejpo+9v5YvJngAguCFOGaPsN77BYIV//nnQgCTYDOJfuB94Lo46Z/lN4ort70vtIyPIOG1JhstiSEMmOhBfTc= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17737899086301010.2412270016378; Tue, 17 Mar 2026 16:25:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlL-0003ws-IT; Tue, 17 Mar 2026 19:23:47 -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 1w2dlK-0003wh-7T for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:46 -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 1w2dlI-0006SA-7B for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:45 -0400 Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-414-j_jJGZdQPeajA7uJw0OBpQ-1; Tue, 17 Mar 2026 19:23:42 -0400 Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-89c3deb4185so208135976d6.1 for ; Tue, 17 Mar 2026 16:23:42 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789823; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TjG79rNrziyooP9oARcvWCdnLH3yo6F+TaDuNY6Nuzk=; b=UrPUDCSEB3owIw+jzKYYLg1tjVtgOKFqo9+lAnXM0DhkIKjFxDm+Z5lDP44xI0IYEVgE/c bTg0THVqKlVxmfGA/gBqUF6pdQ2dtNOImSAtPclL31gfk0p0ze9KgulGf1+ixtnrqD0mXF gEtDnd03nxWcyIcjXQ3rDigLGaw4BMU= X-MC-Unique: j_jJGZdQPeajA7uJw0OBpQ-1 X-Mimecast-MFC-AGG-ID: j_jJGZdQPeajA7uJw0OBpQ_1773789822 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789821; x=1774394621; 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=TjG79rNrziyooP9oARcvWCdnLH3yo6F+TaDuNY6Nuzk=; b=kiklyJyJi7lp/JjFxo93vRX9ovMxF0k4imljcYR9Q7M6BZzs1tj8EbIa6VmOFK+qIP 6Tw1fV1zcDXVYTueXrkZivNukTDk6k2Pz2VTfrTvwU/GDCBcTF9IN4DpoxSc5k5BRj9F F4Te7hFixheGSWuWId6RWF99/e6syfJlBElhX/D2FevA8gibTIDYORH4AoVylsgxxhNC 1AYo6LWeDY77Mkdh/2Xg2PRc543gjNE5Ce2skWyOSONPI1ZSzR/gKXPgzMUz24iuxdz8 w3xGOWnpWKewdl+NwGox7d298F4MCErW5Mh3VMhl+O1/PIvEOyG/cs06KJ6EZRXbhZxu rzoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789821; x=1774394621; 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=TjG79rNrziyooP9oARcvWCdnLH3yo6F+TaDuNY6Nuzk=; b=Up6K/vNYySfjOnKfdKtbLPFg8Q8hD4QpSDRee2B+21tGH5YZfzllDh1YQchYJdQm5A llcnRX746GBFU5Ik09nZiEglM5ElBn8Hz8xynihsfwoBmY97AN6bAy4wGoK2BpDHw/pg vH57uDUO+2DqN2XzGAifPk+Tqqy1+zOBVv8rmwj4NHDAbtuZM/k/X0vGN9NztYLliUKZ jZGx6dLCA8jPPA1/s12ebQwS/qmW5IbZiOKdfNsGMud91G89rhmp97OqWMfMNsxxnu9B EbVFSQgXrxIXWsy8JPesj5D1HCPsfCkrYS8lkxyvM1d1vyhIOdU1+9UGUtKe00Ton9ka KlSA== X-Gm-Message-State: AOJu0YzZRTR/9nv4KwgCGXfrRohm2qoffUnXtUPSfEsCtJ6cjRS3RuOH yQyvkBFufZ5BWc1y10nXr1b1bAjyTHEF+QBUkZ+glZVDEY71IqbXawXszt0q7JbMtEc4m4m8CrS U21MFDKI+Jp0zn3sKfh0u7GPegiGRoznpF2UObZJMhY2oMjdZWsADZCmsEaJByLNVTBmex+cLYK 23bE6qJNU19NtAHhYUwXiOhpGyA3TfYslE2zMOXw== X-Gm-Gg: ATEYQzx+8awXeoZ0mcef6i5YAvIYiFri5xT/1aAFmL+fB+6X44GIcVRHDenJ6Tey7iq ChXGg+Lbp22+wTzP2YuC+Jkbxssl08wk3XSv+dDj2k4Iso5KYDogU5480CnD2Ii8xq49vjXRMaP 4Plm0vIbiD2cMaB3GYYcUHs+ipwUhVMvCfPtqoNvnNHTIaIYOO2n6zR6pbEMuPpjM32ce1V88/r X29/hO5RdKfK5Vm71l2hmQOZyM+1n2VVa8c9S4w+5/2XFHWF+iPeSOGuo7DG+yfJowbBjaaB2H9 Pn05WUwYMgt9lKKyut/pRZMbuBxB4UaK6k5drtsH0tiwdvGXydhLQBibieU6UAJx9Y3MjaUuWi8 9XGIrhP+oITo6Aw== X-Received: by 2002:a05:6214:d6a:b0:89c:44f9:e87b with SMTP id 6a1803df08f44-89c6b5af971mr24014106d6.49.1773789821590; Tue, 17 Mar 2026 16:23:41 -0700 (PDT) X-Received: by 2002:a05:6214:d6a:b0:89c:44f9:e87b with SMTP id 6a1803df08f44-89c6b5af971mr24013746d6.49.1773789820984; Tue, 17 Mar 2026 16:23:40 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 04/10] vmstate: Limit the vmdesc_loop dedup trick to compressable field Date: Tue, 17 Mar 2026 19:23:26 -0400 Message-ID: <20260317232332.15209-5-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; 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: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789911862154100 Content-Type: text/plain; charset="utf-8" We have a trick in vmstate_save_vmsd_v() where we will try to compress multiple JSON vmstate field dumps into one line with a count to avoid duplicated entries. That only applies to the cases where vmsd_can_compress() should return true. For example, vmsd_desc_field_start() later (who will take the updated max_elems as the last parameter) will ignore the value passed in when vmsd_can_compress() returns false. Add that check to the trick too, it will be used later to bypass this logic to some special new VMSD fields. No functional change intended in this patch alone. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- migration/vmstate.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/migration/vmstate.c b/migration/vmstate.c index e29a8c3f49..caa7b50bce 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -578,7 +578,8 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, } =20 /* - * This logic only matters when dumping VM Desc. + * This logic only matters when dumping VM Desc, and only + * when the VMSD field can be compressed. * * Due to the fake nullptr handling above, if there's mixed * null/non-null data, it doesn't make sense to emit a @@ -587,7 +588,8 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, * vs. nullptr). Search ahead for the next null/non-null e= lement * and start a new compressed array if found. */ - if (vmdesc && (field->flags & VMS_ARRAY_OF_POINTER) && + if (vmdesc && vmsd_can_compress(field) && + (field->flags & VMS_ARRAY_OF_POINTER) && is_null !=3D is_prev_null) { =20 is_prev_null =3D is_null; --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789922; cv=none; d=zohomail.com; s=zohoarc; b=Hoy6zThPkEqnN4nyN7kvhejRvUCoTNm/Pf0ku7ECBlztu+5VJvt6GC5gmZBHoqnHIyTYgP0tzICF0bYXKb3peE2J1U9aCbCSt44VJc+ihbktc/belb1D+dHaE6loT6Mm+zKtW2xDsUIemrhVTIHVkZvQ2Dan4N1g05eadgDVfzY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789922; 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=p13D+9yMmIAV5Felq6/xUYZn5oEef6jEs3SIEfUrsbI=; b=LJmpcaIi9J7uisYMgvX9C1Yh1CzBcB0WazKvQZQgx6xH0s3u0WtAxwWKtOyKs269l/O8/FyHHleiZ3kQRkpStWlnUdMP25o4N1TU71yuYc+6Npit45JySiJ8chCN0YT6xn7UEQygmhz4XIcN4ATTbVzDZRgv3z9DLRiSamVOP5M= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789922063793.5571834271437; Tue, 17 Mar 2026 16:25:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlM-0003xH-LF; Tue, 17 Mar 2026 19:23:48 -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 1w2dlL-0003wq-El for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:47 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w2dlK-0006SO-4m for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:47 -0400 Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-687-_Rg5CuiIOXW8c_7fdwGRSQ-1; Tue, 17 Mar 2026 19:23:44 -0400 Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-5091327215dso116081761cf.1 for ; Tue, 17 Mar 2026 16:23:44 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789825; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=p13D+9yMmIAV5Felq6/xUYZn5oEef6jEs3SIEfUrsbI=; b=VSvL01az+d0dCCv4t/1ND1BbIPR0tO0K5SsHT7KUmdv4++1XjgcwOfAjSiR5MrZADf3+B9 ELc/D97M3mh2kKsqW/jlNOggm/KE7SpBm6SwfFn8NNj4fAh05XutEJWKCm1I88jLUz4zGz cq98IG9Pa2e3hy/BLGd0i/as00FSMTI= X-MC-Unique: _Rg5CuiIOXW8c_7fdwGRSQ-1 X-Mimecast-MFC-AGG-ID: _Rg5CuiIOXW8c_7fdwGRSQ_1773789823 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789823; x=1774394623; 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=p13D+9yMmIAV5Felq6/xUYZn5oEef6jEs3SIEfUrsbI=; b=eLyYHiFe3xu19ZJgknaN0MAjwrC6DJXRmbbc8vj4XDk5txZBoq2U4iDzFGblvsuAOu ZwGcdnmkuzAqEUqXlKoOMnxth6VpZ0hD/R+4lt2bkkXj6Tszcp7umtKh5QJ/4iQQIcQB F/n9XCBgHuyGw9CUQ6qG5prqplOu4acOB+ex9Dx6jdPU6d0q0lUmmPpOLKkFK+bXxIOf EL2SO6hBfuCO+2eWRbN2gOtJBDuuyfdgtfw2NpsRJjSYJ/biemQjzKkzbraT1allojb/ +ne+11NmVtT7O8DHhP83kbXXUlihgniVOPOVlL+fESAGiBRFoOlH//430KPKz7GXD4N4 /drg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789823; x=1774394623; 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=p13D+9yMmIAV5Felq6/xUYZn5oEef6jEs3SIEfUrsbI=; b=jCD236+gev7F0uIWyXb02X6HWUFG0xRTjQw4ZgC9ufQttmxYMDvDYvyjZQO51NRANj StHfejNx14MYHhDuHQ4smzpoWkqd/fe5dSI3ijoVu0xVRcfSWw8Gvh7uFIHNW8E4+959 FmN38uU9KoTB6wwnEo3+oL7b1CxBBctOa4orGzxLVkqsj6JFB/zWIvtIZG8Mo+2TT8Cc qBb4NYp8zunYDM9qYv6LtKUDH+5zr6WT+quQ7IRzCQCIOEAWXV1F3oxVJkpiyn4PqNRv dd+xoRWNRZaEi+ahawBloAQkaHz6i3Bgh9BwRoMZKUEnHmkrcK8AvhM7plZchjUBAH0q CHJw== X-Gm-Message-State: AOJu0YzoRtWYyYn7UlJkp0y3BZdbZOaGNEeMeHS9KnfJwSZTTHQZfPmY kJZ8O5Bn7zBiSFX3mRlu8ZUhS4GhY9h0QcVyOi5Z6CIVFpJXabmqfgUXc74guIGOhhYN1r+oFQk WLjfWnqNZ2gabbZli1RiGlAFPLbbxXujvqeVyQmHbuc+pWvOsFhO0ps9F1soRhxR26SW/hjaDSG 1+5+wX9d25kQNpRcPC3KCzAIdd11cg3KT+wIKe5Q== X-Gm-Gg: ATEYQzxXmMatdY1dQL6sr3uWHH85KzwNuQDt0JnJF0PZXSNhuIA4sIbm5SqWNJn5dsp YeZ3LZDbvZmtkKuQrFbG0nJHO0OiOzwWzC7YKpb3zghdPy20d5Tf1WPaaJG42edSwtpsjFpD2/M 2ny0n//vP4cjug5ePaRsq2P3v+tKMYGH9zlh7fZg987JpvqsaZvZIDHR99Zf+A5pRbYNUjl3j63 jiMhC0R4SgzIHK2dunBzPVs1AZHdQkLig0vXWaCIcuj/JtuhWFPfoQ/I6RD40FGcYzuyo5FQF4A u5ocOj14Plv22AI2zNty6ilasRKyICRKMGyAqmppw3WXPW4im64Sd6ezV1Hq0uC+n9V8PcRjv3G pUdThh9CT87jAIQ== X-Received: by 2002:ac8:58c1:0:b0:4ee:1e82:e3f4 with SMTP id d75a77b69052e-50b148b9963mr16083421cf.64.1773789823253; Tue, 17 Mar 2026 16:23:43 -0700 (PDT) X-Received: by 2002:ac8:58c1:0:b0:4ee:1e82:e3f4 with SMTP id d75a77b69052e-50b148b9963mr16083121cf.64.1773789822717; Tue, 17 Mar 2026 16:23:42 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 05/10] vmstate: Rename VMS_NULLPTR_MARKER to VMS_MARKER_PTR_NULL Date: Tue, 17 Mar 2026 19:23:27 -0400 Message-ID: <20260317232332.15209-6-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=peterx@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789924277158500 Content-Type: text/plain; charset="utf-8" Prepare for a new MARKER for non-NULL pointer. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- include/migration/vmstate.h | 2 +- migration/vmstate-types.c | 4 ++-- tests/unit/test-vmstate.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index b4bc69486d..092e8f7e9a 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -283,7 +283,7 @@ extern const VMStateInfo vmstate_info_uint64; extern const VMStateInfo vmstate_info_fd; =20 /** Put this in the stream when migrating a null pointer.*/ -#define VMS_NULLPTR_MARKER (0x30U) /* '0' */ +#define VMS_MARKER_PTR_NULL (0x30U) /* '0' */ extern const VMStateInfo vmstate_info_nullptr; =20 extern const VMStateInfo vmstate_info_cpudouble; diff --git a/migration/vmstate-types.c b/migration/vmstate-types.c index 23f3433696..7622cf8f01 100644 --- a/migration/vmstate-types.c +++ b/migration/vmstate-types.c @@ -363,7 +363,7 @@ static bool load_nullptr(QEMUFile *f, void *pv, size_t = size, const VMStateField *field, Error **errp) =20 { - if (qemu_get_byte(f) =3D=3D VMS_NULLPTR_MARKER) { + if (qemu_get_byte(f) =3D=3D VMS_MARKER_PTR_NULL) { return true; } =20 @@ -377,7 +377,7 @@ static bool save_nullptr(QEMUFile *f, void *pv, size_t = size, =20 { if (pv =3D=3D NULL) { - qemu_put_byte(f, VMS_NULLPTR_MARKER); + qemu_put_byte(f, VMS_MARKER_PTR_NULL); return true; } =20 diff --git a/tests/unit/test-vmstate.c b/tests/unit/test-vmstate.c index 6a42cc1a4e..dae15786aa 100644 --- a/tests/unit/test-vmstate.c +++ b/tests/unit/test-vmstate.c @@ -620,7 +620,7 @@ static void test_arr_ptr_str_no0_load(void) =20 static uint8_t wire_arr_ptr_0[] =3D { 0x00, 0x00, 0x00, 0x00, - VMS_NULLPTR_MARKER, + VMS_MARKER_PTR_NULL, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, QEMU_VM_EOF --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789898; cv=none; d=zohomail.com; s=zohoarc; b=HqR0GEkI/vYuOzpV/1e7EDguvMkIEyaTqWC2fZMioxqBbfudKeH4ytXDOWpaGpxVTzeq/GXSudqLMu68aih5gqCC2zeYvyv4JFyIDGhzwCV843g1wUhYFXcP9Lrz0liQ66A8q5g/artcM5xOFeZcglXAIdgBlo6fYhZru27VFXE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789898; 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=t3NlxwHq8kLfCc7uDMmSml3SsH2i/1WLYIAZ4DD4aAk=; b=TkQXOLMlSnkijkFpdfTUP4eFxTqUTmAxlKydgsKmbcx6iZ9MEbxxHhHBV5oTzIIS9RlSDQF4aVsHwOsQ9jQ5JXauAEO1LXR3teNQyWxjOkxHYCy8lUQD0aClNCxfChGmNrxUV5JsFBgWAs8RuYFEeTAGImLtl9txifkM83lQ2iU= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789898773358.5608995224684; Tue, 17 Mar 2026 16:24:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlO-0003y6-TF; Tue, 17 Mar 2026 19:23:50 -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 1w2dlN-0003xN-87 for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w2dlL-0006SZ-NI for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:48 -0400 Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-45-gacc5mPQMAaDX_LAJrz7yg-1; Tue, 17 Mar 2026 19:23:45 -0400 Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-8950562d351so536721916d6.3 for ; Tue, 17 Mar 2026 16:23:45 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789827; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=t3NlxwHq8kLfCc7uDMmSml3SsH2i/1WLYIAZ4DD4aAk=; b=Wbxm27KXFqhjzvet5A9YNKLELqmVL1xuEHIm3tQYsq4pb03C2OaJN3gTYqkIgYFZmbZz7p DD85wMZFIUkTLJ5UR2sau4BWXPXhcV53sdfALw8emxULi0bo3+8dW/FpsW+U3FJlPatkkf curHOOC9yO+4nbQ426KT4+d9EX2sO2w= X-MC-Unique: gacc5mPQMAaDX_LAJrz7yg-1 X-Mimecast-MFC-AGG-ID: gacc5mPQMAaDX_LAJrz7yg_1773789825 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789825; x=1774394625; 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=t3NlxwHq8kLfCc7uDMmSml3SsH2i/1WLYIAZ4DD4aAk=; b=Pm6cntEk/iAs1EZLVomG86xp1wqFLvT7XaJhyQysnlHoCzoV//6xS/h/OZ6IuJULma prfZswcOAPDKxCKD2DR3wpDUNxHSwK/QC2jlIcrTfahNmWa+6wazdxT+sfkgzsPqbvY9 ksZd9o83JFCYMLwAdMtS32FqAPWnWn6EL24rjZDDi/YaUS0vuE5LJv8q2VNPOS5cilV/ lrhoPX8zWA4lYaw/IVQUeODZ9m3fPRdZvFleJtq9ZWKrQNoreewdo/q358E7p9T0AYCY 03pmSjhITZzRRxIbfI6pQUs7hrpBiZW2qwIZ+VDLX/I02Qlgo8Ug3WeXnjPHpNrm9Azi eFmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789825; x=1774394625; 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=t3NlxwHq8kLfCc7uDMmSml3SsH2i/1WLYIAZ4DD4aAk=; b=oKjW8xhvgw1wqqcU3fDWqp9wJl6Ne2Urey0wmxnwxWfWpypeiQ/KnKXNjGcOV5Zct9 Z4Tfqi5cLgnPs5Om4vXThjXG3Coe/brrQJY54gvGeBYdM0713SVSyq2l7nBlMzHKdgwn OAbyn9E0+V0xfDbMqhVPWDgR8v7KvQUOZHTulhDeD3TspneOpuav1j2vs9ow3cJTvK3K T1A989GMZJbfocXRUVWGxk1rPlM55/QHC6+4zxhMy0kx9FxNXmpHxtOH+ZLknFVULEOO QivryKQeuGz+R8YYBAattL+uWe0icWrMDkfn6cQP4i1Jt4JGHbnLNp/aBQloyyAGhMTu C5og== X-Gm-Message-State: AOJu0Yyp09NyvYJUFfcSCc9ZUcRiwd8iJCYwbDH0TuBdXAm58WQS7wN9 HnrQpsx+oLPFqhxYpjIIOEV94Mn5XxQFaXHm7CPMudgzDUwT7PtCNsSQlTep2l8HyjsJqL9bcX+ +H5p128NsV2XWc9G6AgkU38kQeSgwd4k6jhQfZWbi0CcA/Alr3Jlt9RCOL9fb2cZFc0+Kr/xi/W F2+PeKc+JG2TJX8vDntma6IGl9XJcqeaiDJ95u0g== X-Gm-Gg: ATEYQzwjEWlHZI0A97tAH3mHj89HLJMPpP1oZ82IEN/2stzHVH5M0K3Q9SZxKFwVHnw buffYmNVq04XtwgNxdCk5wuYcfnAZNpoa6qSAFFRmRzZPpLZ1haH19ffy6FbtQoemx0ZPOKggHQ yEYAjNf3cYl/HEeAvPZ6Q9Qt8h+D21kN7Q7/WD0eQPPN8Aq9CW6ibEI2TzgkU2TewPC+FTUAtVB t7Dpare3gIQ9zjJtLLwvTINq8zeRq+17CeGHEjO3hhDpLbvdstg8qzobEi+HEdZ5jlrOYkl41+S gf0eLA/+eAFof2UuS0NJsX8OVkL38WW2VY12PCZBz+5mwYiD3twzXh79076MsrKSZ47DEYEKwA/ EmScB+Z+w5HAgqA== X-Received: by 2002:a05:6214:319a:b0:899:f2ba:9d7e with SMTP id 6a1803df08f44-89c6b595f87mr23211746d6.38.1773789824668; Tue, 17 Mar 2026 16:23:44 -0700 (PDT) X-Received: by 2002:a05:6214:319a:b0:899:f2ba:9d7e with SMTP id 6a1803df08f44-89c6b595f87mr23211476d6.38.1773789824232; Tue, 17 Mar 2026 16:23:44 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 06/10] vmstate: Introduce vmstate_save_field_with_vmdesc() Date: Tue, 17 Mar 2026 19:23:28 -0400 Message-ID: <20260317232332.15209-7-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=peterx@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789901817154100 Content-Type: text/plain; charset="utf-8" Introduce a helper to do both the JSON blob dump and vmstate dump. This further shrinks the function a bit. More importantly, we'll need to dump two fields in one loop very soon in the future with the JSON blob. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- migration/vmstate.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/migration/vmstate.c b/migration/vmstate.c index caa7b50bce..5a6b352764 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -514,6 +514,30 @@ static bool vmstate_save_field(QEMUFile *f, void *pv, = size_t size, return true; } =20 +/* + * Dump a whole VMSD field, including its JSON blob separately when @vmdesc + * is specified. + */ +static inline bool +vmstate_save_field_with_vmdesc(QEMUFile *f, void *pv, size_t size, + const VMStateDescription *vmsd, + const VMStateField *field, JSONWriter *vmde= sc, + int i, int max, Error **errp) +{ + uint64_t old_offset, written_bytes; + bool ok; + + vmsd_desc_field_start(vmsd, vmdesc, field, i, max); + + old_offset =3D qemu_file_transferred(f); + ok =3D vmstate_save_field(f, pv, size, field, vmdesc, errp); + written_bytes =3D qemu_file_transferred(f) - old_offset; + + vmsd_desc_field_end(vmsd, vmdesc, field, written_bytes); + + return ok; +} + static bool vmstate_save_vmsd_v(QEMUFile *f, const VMStateDescription *vms= d, void *opaque, JSONWriter *vmdesc, int version_id, Error **errp) @@ -542,7 +566,6 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, void *first_elem =3D opaque + field->offset; int i, n_elems =3D vmstate_n_elems(opaque, field); int size =3D vmstate_size(opaque, field); - uint64_t old_offset, written_bytes; JSONWriter *vmdesc_loop =3D vmdesc; bool is_prev_null =3D false; =20 @@ -558,7 +581,6 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, bool is_null; int max_elems =3D n_elems - i; =20 - old_offset =3D qemu_file_transferred(f); if (field->flags & VMS_ARRAY_OF_POINTER) { assert(curr_elem); curr_elem =3D *(void **)curr_elem; @@ -606,15 +628,9 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMS= tateDescription *vmsd, } } =20 - vmsd_desc_field_start(vmsd, vmdesc_loop, inner_field, - i, max_elems); - - ok =3D vmstate_save_field(f, curr_elem, size, inner_field, - vmdesc_loop, errp); - - written_bytes =3D qemu_file_transferred(f) - old_offset; - vmsd_desc_field_end(vmsd, vmdesc_loop, inner_field, - written_bytes); + ok =3D vmstate_save_field_with_vmdesc(f, curr_elem, size, = vmsd, + inner_field, vmdesc_lo= op, + i, max_elems, errp); =20 /* If we used a fake temp field.. free it now */ if (is_null) { --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789908; cv=none; d=zohomail.com; s=zohoarc; b=TBuevDqoZWZ8OnfG0jofb1vBMwJNk9ug/4jkAuAUJ/a6ouyBCaUSKyRZp18ubmzHyzAJOf4IykwDElz47P1x3onN3Ctx+x/zvRT+jN52C9RE7/CuVLiWbJNUU/fFcbyAmpudfYAejNxb5qkpJQLs8LAFgvqHOZTgJP/W94FiRBs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789908; 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=vfA5YcifimYKy9d+Sw13K1+9EHiev9I6GS953l5fS1Y=; b=VrwYzopgr2ogPDyGxKTs7yoAFzsVWbLKCznQ/aiW4XvmWA8hDN7jUd92S1UdZNCWyTJU8s6bx3iV4PvMAQNvZI3PKJKC7oe5THD1NE6O8vjxMQixtWkQ/teFaoHIvwSzbU/5xE1T1yN4dKLTbX2UcvJOaPr+3np2dlkO4TAMPKY= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789908641457.86061384672496; Tue, 17 Mar 2026 16:25:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlQ-0003yQ-Dt; Tue, 17 Mar 2026 19:23:52 -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 1w2dlO-0003y4-OE for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:50 -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 1w2dlN-0006Sy-0W for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:50 -0400 Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-646-Po7e13FrMxqPShKpMuDKFw-1; Tue, 17 Mar 2026 19:23:47 -0400 Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-5092135f2e9so351827611cf.2 for ; Tue, 17 Mar 2026 16:23:47 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789828; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vfA5YcifimYKy9d+Sw13K1+9EHiev9I6GS953l5fS1Y=; b=EFt8RCZzBO5KpkXr6TKNzKCUF5Pg5HKatSIKjuNOADoFzEen8Lg3Nf6jkQ71GrJ6TXkjh7 oq97J0DmlxhOUwyk5mGt8KAmxsoTRQ02WMbO2ryxiqwujERS4k/Ps620xGcmuj6mQvkmUK 5JmcCLvZ1YZHskykhHMkEqjoXLfj8+8= X-MC-Unique: Po7e13FrMxqPShKpMuDKFw-1 X-Mimecast-MFC-AGG-ID: Po7e13FrMxqPShKpMuDKFw_1773789827 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789826; x=1774394626; 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=vfA5YcifimYKy9d+Sw13K1+9EHiev9I6GS953l5fS1Y=; b=t3q/NDM2iG29iqSCJeY7vTlWm/B5xXwl0yCIiLuVRj72H14pkLlCSD8n5Q38E/fMvV S4iqNPNkbDhCtE6z6YCQhhFh7bVsAqABsgfXW24fasEibmKZrFl0pjl0xSb2vzubB7Sy QVUGNyR6p+7PpKXz3w682tRfXRgHB7Zo0P7QSINH8OdUWzjCzYBpJ8leG/MiV1fiYNrj P8pIknodgh03JXAA+BtNpWHSbfaqoyCyMAk1Yix6/a2InuuGnSOzMl4PfmYg2Vv1133N 08yvcBy7Lh6c3H+AFv7mjNCggTo7rGmUr/ltzSFgLu1Up2XS/gPxjFdC89u8/+5qaln/ Ddbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789826; x=1774394626; 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=vfA5YcifimYKy9d+Sw13K1+9EHiev9I6GS953l5fS1Y=; b=gguMc6Y12fSBPaBXN3FE+3vOc2gEKsf0Nk1gghM+NGXebIF3iXgRv4sAnbFzwc/V9W sPphtlalDW/AfCwvkxVWUaA6G7/QsP0gdKxnwoMJj4QW8guyH5bdu1Xk78+Le6+hv0Bh gTK/wcYP3rOtlFiacfhVcxC2+JVsFUVT1le2Ufhkbkwddvg9Dl4SyZBZnF2tzHy89B/a t0xrX1V3LevqwavWcgQkaRPvsYUnecWtqb23+Ap/twrat2wzVK4Xkhy4EX72PmxxH0j4 uGctAADoJDkkUnCSb6VQ0d9cEmD4aY2egZrFPM5qu2rhDLU+TZByLXcPVKejeM9Scbci HUgg== X-Gm-Message-State: AOJu0YwMBS7IENO4x+mw+0AcMMfiny8z9XePpVkZowQ8RMyhCt6pE2Zh qxUpXMBXbpMy7Y3o5rpaJ0TY9elPvDN9IL5QdGI7/7UZtdMpWuV53GPqlYBUrqEUQb1STBlLi7M iWqKYfu5U88NmUsR0h/IVpGsOiexbsTDhWHgli2aSIg+CW1/K82YcbBMMkTPsa86HhNQsIW4jEu X9pi/ZKl6N6MAyr0Jqcliq02stcdKmGj4z9f4ngg== X-Gm-Gg: ATEYQzwI1aGVup5lLz/xukK/Dix5oVWRJT/N8Psy5CdeyuG8u+GbsHBTPwfLofq2QgA 3l+EMBCJwLzsTj7fOGHZp0KOm92w0gfRU6QRKeLL19PMAEXeShay0L5BCh27m9ZATf7aGXhqJdB DrtMRlfCjjFLxD8yJ1Id3E3pHEekHGqnOVHY9aeINVsmAGO8Va7iuGBgyaT6fMZYRwTZ3mqE84z OuvDtmICC4BHX95NMNrdFf9RfISK4Kto+wS3iVKR0ox0yXqKCtelbt6IGP0fv8gPvlmRBlPxrLV yNsQdsKJCENoocSILyTb1wDXoUYeUa8IP6TAXe6CDvrDim8lrJy/4ksYC9dFuAIVsFy4cLUnhfk hcrg+4IZ/OHY53A== X-Received: by 2002:ac8:7c4a:0:b0:4f1:adf6:5b77 with SMTP id d75a77b69052e-50b148c68d1mr14836241cf.59.1773789826306; Tue, 17 Mar 2026 16:23:46 -0700 (PDT) X-Received: by 2002:ac8:7c4a:0:b0:4f1:adf6:5b77 with SMTP id d75a77b69052e-50b148c68d1mr14835901cf.59.1773789825777; Tue, 17 Mar 2026 16:23:45 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 07/10] vmstate: Allow vmstate_info_nullptr to emit non-NULL markers Date: Tue, 17 Mar 2026 19:23:29 -0400 Message-ID: <20260317232332.15209-8-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; 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: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789910369158500 Content-Type: text/plain; charset="utf-8" We used to have one vmstate called "nullptr" which is only used to generate one-byte hint to say one pointer is NULL. Let's extend its use so that it will generate another byte to say the pointer is non-NULL. With that, the name of the info struct (or functions) do not apply anymore. Update correspondingly. No functional change intended yet. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- include/migration/vmstate.h | 9 +++++++-- migration/vmstate-types.c | 34 ++++++++++++++++------------------ migration/vmstate.c | 29 ++++++++++++++--------------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 092e8f7e9a..2e51b5ea04 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -282,9 +282,14 @@ extern const VMStateInfo vmstate_info_uint32; extern const VMStateInfo vmstate_info_uint64; extern const VMStateInfo vmstate_info_fd; =20 -/** Put this in the stream when migrating a null pointer.*/ +/* + * Put this in the stream when migrating a pointer to reflect either a NULL + * or valid pointer. + */ #define VMS_MARKER_PTR_NULL (0x30U) /* '0' */ -extern const VMStateInfo vmstate_info_nullptr; +#define VMS_MARKER_PTR_VALID (0x31U) /* '1' */ + +extern const VMStateInfo vmstate_info_ptr_marker; =20 extern const VMStateInfo vmstate_info_cpudouble; =20 diff --git a/migration/vmstate-types.c b/migration/vmstate-types.c index 7622cf8f01..b31689fc3c 100644 --- a/migration/vmstate-types.c +++ b/migration/vmstate-types.c @@ -359,36 +359,34 @@ const VMStateInfo vmstate_info_fd =3D { .save =3D save_fd, }; =20 -static bool load_nullptr(QEMUFile *f, void *pv, size_t size, - const VMStateField *field, Error **errp) +static bool load_ptr_marker(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, Error **errp) =20 { - if (qemu_get_byte(f) =3D=3D VMS_MARKER_PTR_NULL) { + int byte =3D qemu_get_byte(f); + + if (byte =3D=3D VMS_MARKER_PTR_NULL || byte =3D=3D VMS_MARKER_PTR_VALI= D) { + /* TODO: process PTR_VALID case */ return true; } =20 - error_setg(errp, "vmstate: load_nullptr expected VMS_NULLPTR_MARKER"); + error_setg(errp, "%s: unexpected ptr marker: %d", __func__, byte); return false; } =20 -static bool save_nullptr(QEMUFile *f, void *pv, size_t size, - const VMStateField *field, JSONWriter *vmdesc, - Error **errp) +static bool save_ptr_marker(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, JSONWriter *vmdesc, + Error **errp) =20 { - if (pv =3D=3D NULL) { - qemu_put_byte(f, VMS_MARKER_PTR_NULL); - return true; - } - - error_setg(errp, "vmstate: save_nullptr must be called with pv =3D=3D = NULL"); - return false; + qemu_put_byte(f, pv ? VMS_MARKER_PTR_VALID : VMS_MARKER_PTR_NULL); + return true; } =20 -const VMStateInfo vmstate_info_nullptr =3D { - .name =3D "nullptr", - .load =3D load_nullptr, - .save =3D save_nullptr, +const VMStateInfo vmstate_info_ptr_marker =3D { + .name =3D "ptr-marker", + .load =3D load_ptr_marker, + .save =3D save_ptr_marker, }; =20 /* 64 bit unsigned int. See that the received value is the same than the o= ne diff --git a/migration/vmstate.c b/migration/vmstate.c index 5a6b352764..a3a5f25946 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -55,12 +55,12 @@ vmstate_field_exists(const VMStateDescription *vmsd, co= nst VMStateField *field, } =20 /* - * Create a fake nullptr field when there's a NULL pointer detected in the + * Create a ptr marker field when there's a NULL pointer detected in the * array of a VMS_ARRAY_OF_POINTER VMSD field. It's needed because we * can't dereference the NULL pointer. */ static const VMStateField * -vmsd_create_fake_nullptr_field(const VMStateField *field) +vmsd_create_ptr_marker_field(const VMStateField *field) { VMStateField *fake =3D g_new0(VMStateField, 1); =20 @@ -76,7 +76,7 @@ vmsd_create_fake_nullptr_field(const VMStateField *field) =20 /* See vmstate_info_nullptr - use 1 byte to represent nullptr */ fake->size =3D 1; - fake->info =3D &vmstate_info_nullptr; + fake->info =3D &vmstate_info_ptr_marker; fake->flags =3D VMS_SINGLE; =20 /* All the rest fields shouldn't matter.. */ @@ -278,7 +278,7 @@ bool vmstate_load_vmsd(QEMUFile *f, const VMStateDescri= ption *vmsd, * an array of pointers), use null placeholder and do * not follow. */ - inner_field =3D vmsd_create_fake_nullptr_field(field); + inner_field =3D vmsd_create_ptr_marker_field(field); } else { inner_field =3D field; } @@ -567,7 +567,7 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, int i, n_elems =3D vmstate_n_elems(opaque, field); int size =3D vmstate_size(opaque, field); JSONWriter *vmdesc_loop =3D vmdesc; - bool is_prev_null =3D false; + bool use_marker_field_prev =3D false; =20 trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems= ); if (field->flags & VMS_POINTER) { @@ -578,7 +578,7 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, for (i =3D 0; i < n_elems; i++) { void *curr_elem =3D first_elem + size * i; const VMStateField *inner_field; - bool is_null; + bool use_marker_field; int max_elems =3D n_elems - i; =20 if (field->flags & VMS_ARRAY_OF_POINTER) { @@ -586,17 +586,16 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VM= StateDescription *vmsd, curr_elem =3D *(void **)curr_elem; } =20 - if (!curr_elem && size) { + use_marker_field =3D !curr_elem && size; + if (use_marker_field) { /* * If null pointer found (which should only happen in * an array of pointers), use null placeholder and do * not follow. */ - inner_field =3D vmsd_create_fake_nullptr_field(field); - is_null =3D true; + inner_field =3D vmsd_create_ptr_marker_field(field); } else { inner_field =3D field; - is_null =3D false; } =20 /* @@ -612,16 +611,16 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VM= StateDescription *vmsd, */ if (vmdesc && vmsd_can_compress(field) && (field->flags & VMS_ARRAY_OF_POINTER) && - is_null !=3D is_prev_null) { + use_marker_field !=3D use_marker_field_prev) { =20 - is_prev_null =3D is_null; + use_marker_field_prev =3D use_marker_field; vmdesc_loop =3D vmdesc; =20 for (int j =3D i + 1; j < n_elems; j++) { void *elem =3D *(void **)(first_elem + size * j); - bool elem_is_null =3D !elem && size; + bool elem_use_marker_field =3D !elem && size; =20 - if (is_null !=3D elem_is_null) { + if (use_marker_field !=3D elem_use_marker_field) { max_elems =3D j - i; break; } @@ -633,7 +632,7 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMSt= ateDescription *vmsd, i, max_elems, errp); =20 /* If we used a fake temp field.. free it now */ - if (is_null) { + if (use_marker_field) { g_clear_pointer((gpointer *)&inner_field, g_free); } =20 --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789908; cv=none; d=zohomail.com; s=zohoarc; b=h0H7bVvqtdSr8IuT22OLWf2zQx6D0sPqU3t2MdjVgNHCju6JZhVKPUQdQjaHknCPo7dlanl8phCxFkf0oa3beMgMYkfUSfCnQsBnmSSH2AvthgOyqV2d+ApIUWqXarJrI9acbWPpbME4AYLtiPq/WQKcmy0jBXSnz92/zCUjL1s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789908; 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=4VIfJwVvQOqSfZotFMcnTmIgI+32r03PnWffChaegzo=; b=MuUEnIMQPO64ahuaaAreXnpxaUAUkr7sROIwMvahoQhEo8g9ZRzIswsfzx5xC0BfpP0sDc4RXwHtKhAiQCWQmwoP1w96fuX6d74inItY7wWjME/yuI0a9ZnfPW+eo9NPKA7PY/P3rSa2OX+fbfm9UFEOWqYeEVNuLEkcueoCXcg= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789908985296.795178961847; Tue, 17 Mar 2026 16:25:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlR-0003yj-9U; Tue, 17 Mar 2026 19:23:53 -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 1w2dlP-0003yG-KC for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:51 -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 1w2dlO-0006TD-3C for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:51 -0400 Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-18-ZMTcE3RUPkWeuGF17uVYbw-1; Tue, 17 Mar 2026 19:23:48 -0400 Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-5092033798eso237515481cf.1 for ; Tue, 17 Mar 2026 16:23:48 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789829; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4VIfJwVvQOqSfZotFMcnTmIgI+32r03PnWffChaegzo=; b=HjR4qz2WF4LHnee9t+E0fnux/CL2K83CK+OgOU8b45a0B1iUhvlHvyi9eMmLG+XqjWXgbK ajXpahQa+koN3bp4vBaLLNL8isKIFyXgYv5pAif/qFeIlxsETsaFCefv4d4zKUYEVDDul7 j9ZF1uoLRJW2yMHcBVZRFcNUiUt82PU= X-MC-Unique: ZMTcE3RUPkWeuGF17uVYbw-1 X-Mimecast-MFC-AGG-ID: ZMTcE3RUPkWeuGF17uVYbw_1773789828 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789827; x=1774394627; 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=4VIfJwVvQOqSfZotFMcnTmIgI+32r03PnWffChaegzo=; b=rPkuunHKf6dN8l1BlGe/TXzcqPbJ5IPv4FCsLcYigjgcqLURvxbNres6BbrkfCBYMH 20ea774Tek0mpiGZIJ6+O/PpRkJiB+oDzBZdjqZiTgwBIs8X42ecihds+F49SOWSb4Wk Bg8GK+nYgo0sSpGbFvt5fXSIPsY77QwaQZU7FrdlDoXTQAQdYfpgY7qELUmqeVzHv+nv GbxX7R3sZPrfcDFJCrIV5Zjgc/EeO6iFT20/evkRxS3Wfw1cnwk9c60hS6hV2a10mxb3 uv1IGQmKEcIlOeVrbL5T8l5Kjqdu+Z3HWYv4T377sQl4UMwdsLWd1+SDcuFmrtIpMKvR MCCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789827; x=1774394627; 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=4VIfJwVvQOqSfZotFMcnTmIgI+32r03PnWffChaegzo=; b=rGJwkTdbVRfIaFKokhmRe2OafW6mPmaCcT0R/Jm+eeX20T1hrfuT6ivPc1kRkWu013 LIuIn9lJ0wSrvCxEX6d5ehfBeNQXacEDLMlXgK5pzpjNIgwS3oAxsongvLmjuD7kOxeR Eqpew7pV2ZzMvy3TBhQXOc7qHac2bnOs71Yl/hmg4Fq8FezU5HpLdre1cRjI5EhHf97t ZuID6C6O8VZeXvThhSf3rfcA5n82UAX8BJYNGpS/i+9zDxDf69zAH1wJvx3kEwsbjmYN zpTUuSTQ1rmMHNYi3Mx+pKO4D8plv42ignttKYHC4sJpjMTtphemD9LIlGlawxT+yKTZ IpnQ== X-Gm-Message-State: AOJu0Yz160zvRLZZ1EJhM1k5sMEyaBxZLCCCtEkMGMdvyGuWcorEiiZz nY7UGzU3Z+O+0RHtCqykit4z5IrUkh0sdS/nIFyta5igYVzIlgr/9hNvKYbAIQvHWxeLAoCGwmb WQelUBcu2JueBwqL4Tn0rycvZViwCJpx0/ab+7NjpDHH7gAdM3Rlu45Te96w5XrPOLKsEVmZ306 ZJUHMArVpxrIEDhLrMKoh5QaUD9Eh0l/FI0o0MaQ== X-Gm-Gg: ATEYQzwuRYWZDd9STulXPOJ6/Q+iYErNV63Jww5T4RXefb1ehmnYUkQjLtaLMRTpw+X 3tJy2hg0CM9WyLElbSmWSGyElCtsEo4lKY+K+Yvg9GyOc1WfUNERO/hkJ5hIbv+Ws+C+0srV4Pi E0IIq1O7QHlCbEvI0rFIlfW2StekCcZ/Qr2kpOl4P3UPwtXFu0W3dUbvDgnS9Yz19BbDPOckPHJ rJvj7vwFfiRu31d3LcqRXwMrwXojyHkVQ6x1xMrXFTT/CcL+lak5ky8g8jQT9tGXXFz3wfTBMbL wuzOkbHuLZ/BALG0BhBL7U07cZtY57TSC3zyYEDS1PJD85R9nv5+Q/kGqS2x1B/lt+rTl0dRDsp hvVSkpTAiYc+Zqw== X-Received: by 2002:a05:620a:4081:b0:8cd:98c1:762e with SMTP id af79cd13be357-8cfad38a797mr207316985a.63.1773789827233; Tue, 17 Mar 2026 16:23:47 -0700 (PDT) X-Received: by 2002:a05:620a:4081:b0:8cd:98c1:762e with SMTP id af79cd13be357-8cfad38a797mr207314385a.63.1773789826783; Tue, 17 Mar 2026 16:23:46 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 08/10] vmstate: Implement load of ptr marker in vmstate core Date: Tue, 17 Mar 2026 19:23:30 -0400 Message-ID: <20260317232332.15209-9-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; 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: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789910316158500 Content-Type: text/plain; charset="utf-8" The loader side of ptr marker is pretty straightforward, instead of playing the inner_field trick, just do the load manually assuming the marker layout is a stable ABI (which it is true already). This will remove some logic while loading VMSD, and hopefully it makes it slightly easier to read. Unfortunately, we still need to keep the sender side because of the JSON blob we're maintaining.. This paves way for future processing of non-NULL markers as well. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn --- migration/vmstate-types.c | 12 ++++-------- migration/vmstate.c | 40 ++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/migration/vmstate-types.c b/migration/vmstate-types.c index b31689fc3c..ae465c5c2c 100644 --- a/migration/vmstate-types.c +++ b/migration/vmstate-types.c @@ -363,14 +363,10 @@ static bool load_ptr_marker(QEMUFile *f, void *pv, si= ze_t size, const VMStateField *field, Error **errp) =20 { - int byte =3D qemu_get_byte(f); - - if (byte =3D=3D VMS_MARKER_PTR_NULL || byte =3D=3D VMS_MARKER_PTR_VALI= D) { - /* TODO: process PTR_VALID case */ - return true; - } - - error_setg(errp, "%s: unexpected ptr marker: %d", __func__, byte); + /* + * Load is done in vmstate core, see vmstate_ptr_marker_load(). + */ + g_assert_not_reached(); return false; } =20 diff --git a/migration/vmstate.c b/migration/vmstate.c index a3a5f25946..d65fc84dfa 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -142,6 +142,21 @@ static void vmstate_handle_alloc(void *ptr, const VMSt= ateField *field, } } =20 +static bool vmstate_ptr_marker_load(QEMUFile *f, bool *load_field, + Error **errp) +{ + int byte =3D qemu_get_byte(f); + + if (byte =3D=3D VMS_MARKER_PTR_NULL) { + /* When it's a null ptr marker, do not continue the load */ + *load_field =3D false; + return true; + } + + error_setg(errp, "Unexpected ptr marker: %d", byte); + return false; +} + static bool vmstate_pre_load(const VMStateDescription *vmsd, void *opaque, Error **errp) { @@ -264,30 +279,25 @@ bool vmstate_load_vmsd(QEMUFile *f, const VMStateDesc= ription *vmsd, } =20 for (i =3D 0; i < n_elems; i++) { - bool ok; + /* If we will process the load of field? */ + bool load_field =3D true; + bool ok =3D true; void *curr_elem =3D first_elem + size * i; - const VMStateField *inner_field; =20 if (field->flags & VMS_ARRAY_OF_POINTER) { curr_elem =3D *(void **)curr_elem; } =20 if (!curr_elem && size) { - /* - * If null pointer found (which should only happen in - * an array of pointers), use null placeholder and do - * not follow. - */ - inner_field =3D vmsd_create_ptr_marker_field(field); - } else { - inner_field =3D field; + /* Read the marker instead of VMSD itself */ + if (!vmstate_ptr_marker_load(f, &load_field, errp)) { + trace_vmstate_load_field_error(field->name, -EINVA= L); + return false; + } } =20 - ok =3D vmstate_load_field(f, curr_elem, size, inner_field,= errp); - - /* If we used a fake temp field.. free it now */ - if (inner_field !=3D field) { - g_clear_pointer((gpointer *)&inner_field, g_free); + if (load_field) { + ok =3D vmstate_load_field(f, curr_elem, size, field, e= rrp); } =20 if (ok) { --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789909; cv=none; d=zohomail.com; s=zohoarc; b=kuFYPwvhgep6Ak/jFof+tLSsuRTcZtyADhfXvhMsZ+tWm4IX46ta2HA9XPhqcJc6+ANdHccSvRKBKgEOn+TcqHxh2bgNk+ErnXdrZYAHiQHl5ecCMvuoMxUSOQAavk9JS2I8vWXUxSDke0zQbjx2MmDdHjpqUMS0AqUcpDVTEkk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789909; 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=5vkvO/aSwVfWwyf4C8OnQy+aocu9TdzvUh0BD1i35+o=; b=nn6lQecUjBdALhByrwgdf3VynepcbAzsUS8gH4dQ05wmR0618S7cjJ3J2shQbrIssTZCuHBs12yFOMOBSCH0axyKjLcysm5agaD8PnpLceldaLdL5+3H5Wso5YS4lra7PpcHXEBB80niD20gvpkikShVLU8GGSfslePqNCSF7rk= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789909517174.62900013400565; Tue, 17 Mar 2026 16:25:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlT-0003zE-OW; Tue, 17 Mar 2026 19:23:55 -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 1w2dlS-0003yr-4N for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:54 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w2dlP-0006TP-Us for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:53 -0400 Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-263-OtvGoDePMH6E8_Sdz7hP6w-1; Tue, 17 Mar 2026 19:23:50 -0400 Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-8950562d351so536728406d6.3 for ; Tue, 17 Mar 2026 16:23:50 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789831; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5vkvO/aSwVfWwyf4C8OnQy+aocu9TdzvUh0BD1i35+o=; b=XykeSZvZjYqLI1eoVzSUbSiGuOqPMqkMZWRp8lQ3MZq2BTBbIiesWLPE1UG2Zqeq5IsBso DYpYkDi1GKw/nZvfA7BRN9qspA8BsE4fj/8BRJRdSUnqasVnWWg8FZWY4D7wAcn0XM40// jLxwSrHAbPjpblVF3dwia7vwkO/FNW4= X-MC-Unique: OtvGoDePMH6E8_Sdz7hP6w-1 X-Mimecast-MFC-AGG-ID: OtvGoDePMH6E8_Sdz7hP6w_1773789829 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789829; x=1774394629; 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=5vkvO/aSwVfWwyf4C8OnQy+aocu9TdzvUh0BD1i35+o=; b=GORS2I3m8WYytfXy6yEvnVaZuc2d4GFmXNTnzdbf0G4nChL3VseQp8xCplLJToSyb1 3Z1sStnEdlocg8F2LXH3cnTOFu4rijiSrHHNQaGinAHNCdKcyeZbKYqnwf5lyfQvMhMC 8r4S9ywk+OVqeg14TNSOYSo5LZXb9ipqaMNbrosQ8yaDwzfY7TSFcUVMEftSnOOnkexf 4j8wdOMcWvKpjP7j0PrFTaj8F0yEfjKN9X2Awi+USbKBlBRJ64c1kR91vMz3Ozb16kNO JGKodo3NzcvyJZIFelcTfqBglxAmhfTYdjDKNtsGEsTR7cN38dDKJIFZ0LeSHtbqU8kh AqTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789829; x=1774394629; 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=5vkvO/aSwVfWwyf4C8OnQy+aocu9TdzvUh0BD1i35+o=; b=eqjHu4fZnDS/k2647WoclEV+OeaI+oY/nN8IMn6Ln9dRgDOUPBcL7zFuIQ1XiJ365l YkRtv1+8uj81j+0j+2Wt5w38t3KS9KJNUPGYCYhK9u1js0/7w8AfZMY1OAeDBCzW99LL UOlwy7qt2LH/BeEYEkRzEXe3Ede6nSzo+WK2Xq5YAfFyuCI/auFN3GzXgmKwsZU/Vlc6 zGWHYUA7BiaVFGxmNfkYb9jSVNddzgI4VD6GMaxOfor0AQsMKpy+dShA18YLovEklbZX yCxbY1UdalDZER4NAyLfIPmJTc7nr8DlF4AVh6a0m8g2UJZZ24QVxoW5QLs6y9TDSZvZ PuHQ== X-Gm-Message-State: AOJu0YwZsh6AeeIgLqnymeEgyhpana640J8NdUbvQrGa0o8tsaghuq+m tnJ8/xQHxC5sWUfLg+RNKFXLgy33BFdYSuwmt5NL5oDbvzeLjDroc+Sjvy53ik0T90fuaIDU912 Gg7wiZxcZ5ihYbyA/ZIilGfqBd6YV3ClcFlHojY55X9v9VBLYoE1nrg6Z6EAloxEHrKMJ7UtIjT 9hLyW54fBosjeKfnJ413und+RxCIoiV7nEjETvdQ== X-Gm-Gg: ATEYQzxg7c/evdvle6DDgptBTxhgwlI2kyjghNqZHbgPVhQ5XDrM9eyndo08jmfjBm6 vcMrXOVjPpF32eTFLxuHGBZQ2v2MnXDy+1C6kAZ2FrzJtvdCASe1/STtL4y3MHW5Aa5H4w0EG2E pZxQJ8Tk10Baz/D78ntn/m962O4ihD0ojyLjCMWwxf3tQwKfBH9bbJzg/RlSNzzmkPPBTWvfAPF 7y3Y1Syk/osbYWGYjMUNH6MdqiOPkE+RPhOUbkQc/CtoYPDTmYyi0W8NCJUjfU3GRXKDZYnbxtD NdKuhIVDcqqlFS2o3/p56u0vFHbLkLSe1RsHAKQf0sfDCPpsiErOKAmdKZxOOPx3wkUZg+vq+t3 ftsBtzuaB72rSSg== X-Received: by 2002:a05:6214:6115:b0:89c:488b:bd37 with SMTP id 6a1803df08f44-89c6b50c95amr20820986d6.21.1773789828990; Tue, 17 Mar 2026 16:23:48 -0700 (PDT) X-Received: by 2002:a05:6214:6115:b0:89c:488b:bd37 with SMTP id 6a1803df08f44-89c6b50c95amr20820596d6.21.1773789828333; Tue, 17 Mar 2026 16:23:48 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas Subject: [PATCH RFC 09/10] vmstate: Implement VMS_ARRAY_OF_POINTER_AUTO_ALLOC Date: Tue, 17 Mar 2026 19:23:31 -0400 Message-ID: <20260317232332.15209-10-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=peterx@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789911933154100 Content-Type: text/plain; charset="utf-8" Introduce a new flag, VMS_ARRAY_OF_POINTER_AUTO_ALLOC, for VMSD field. It must be used together with VMS_ARRAY_OF_POINTER. It can be used to allow migration of an array of pointers where the pointers may point to NULLs. Note that we used to allow migration of a NULL pointer within an array that is being migrated. That corresponds to the code around vmstate_info_nullptr where we may get/put one byte showing that the element of an array is NULL. That usage is fine but very limited, it's because even if it will migrate a NULL pointer with a marker, it still works in a way that both src and dest QEMUs must know exactly which elements of the array are non-NULL, so instead of dynamically loading an array (which can have NULL pointers), it actually only verifies the known NULL pointers are still NULL pointers after migration. Also, in that case since dest QEMU knows exactly which element is NULL, which is not NULL, dest QEMU's device code will manage all allocations for the elements before invoking vmstate_load_vmsd(). That's not enough per evolving needs of new device states that may want to provide real dynamic array of pointers, like what Alexander proposed here with the NVMe device migration: https://lore.kernel.org/r/20260317102708.126725-1-alexander@mihalicyn.com This patch is an alternative approach to address the problem. Along with the flag, introduce two new macros: VMSTATE_VARRAY_OF_POINTER_TO_STRUCT_UINT{8|32}_ALLOC() Which will be used very soon in the NVMe series. Signed-off-by: Peter Xu Reviewed-by: Alexander Mikhalitsyn Tested-by: Alexander Mikhalitsyn --- include/migration/vmstate.h | 49 ++++++++++++++++- migration/savevm.c | 31 ++++++++++- migration/vmstate.c | 101 ++++++++++++++++++++++++++++++++---- 3 files changed, 169 insertions(+), 12 deletions(-) diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 2e51b5ea04..70bebc60ed 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -161,8 +161,19 @@ enum VMStateFlags { * structure we are referencing to use. */ VMS_VSTRUCT =3D 0x8000, =20 + /* + * This is a sub-flag for VMS_ARRAY_OF_POINTER, so VMS_ARRAY_OF_POINTER + * must be set altogether. When set, it means array elements can + * contain either valid or NULL pointers, vmstate core will sync it + * between the two QEMU instances via the stream protocol. When it's a + * valid pointer, the vmstate core will be responsible to do the proper + * memory allocations. It also means user of this flag must prepare + * the array to be all NULLs otherwise memory may leak. + */ + VMS_ARRAY_OF_POINTER_AUTO_ALLOC =3D 0x10000, + /* Marker for end of list */ - VMS_END =3D 0x10000 + VMS_END =3D 0x20000, }; =20 typedef enum { @@ -580,6 +591,42 @@ extern const VMStateInfo vmstate_info_qlist; .offset =3D vmstate_offset_array(_s, _f, _type*, _n), \ } =20 +/* + * For migrating a dynamically allocated uint{8,32}-indexed array of + * pointers to structures (with NULL entries and with auto memory + * allocation). + * + * _type: type of structure pointed to + * _vmsd: VMSD for structure _type (when VMS_STRUCT is set) + * _info: VMStateInfo for _type (when VMS_STRUCT is not set) + * start: size of (_type) pointed to (for auto memory allocation) + */ +#define VMSTATE_VARRAY_OF_POINTER_TO_STRUCT_UINT8_ALLOC(\ + _field, _state, _field_num, _version, _vmsd, _type) { \ + .name =3D (stringify(_field)), \ + .version_id =3D (_version), \ + .num_offset =3D vmstate_offset_value(_state, _field_num, uint8_t), \ + .vmsd =3D &(_vmsd), \ + .size =3D sizeof(_type), \ + .flags =3D VMS_POINTER | VMS_VARRAY_UINT8 | \ + VMS_ARRAY_OF_POINTER | VMS_STRUCT | \ + VMS_ARRAY_OF_POINTER_AUTO_ALLOC, \ + .offset =3D vmstate_offset_pointer(_state, _field, _type *), \ +} + +#define VMSTATE_VARRAY_OF_POINTER_TO_STRUCT_UINT32_ALLOC(\ + _field, _state, _field_num, _version, _vmsd, _type) { \ + .name =3D (stringify(_field)), \ + .version_id =3D (_version), \ + .num_offset =3D vmstate_offset_value(_state, _field_num, uint32_t), \ + .vmsd =3D &(_vmsd), \ + .size =3D sizeof(_type), \ + .flags =3D VMS_POINTER | VMS_VARRAY_UINT32 | \ + VMS_ARRAY_OF_POINTER | VMS_STRUCT | \ + VMS_ARRAY_OF_POINTER_AUTO_ALLOC, \ + .offset =3D vmstate_offset_pointer(_state, _field, _type *), \ +} + #define VMSTATE_VARRAY_OF_POINTER_UINT32(_field, _state, _field_num, _vers= ion, _info, _type) { \ .name =3D (stringify(_field)), = \ .version_id =3D (_version), = \ diff --git a/migration/savevm.c b/migration/savevm.c index f5a6fd0c66..34223de818 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -869,8 +869,37 @@ static void vmstate_check(const VMStateDescription *vm= sd) if (field) { while (field->name) { if (field->flags & VMS_ARRAY_OF_POINTER) { - assert(field->size =3D=3D 0); + if (VMS_ARRAY_OF_POINTER_AUTO_ALLOC) { + /* + * Size must be provided because dest QEMU needs that + * info to know what to allocate + */ + assert(field->size || field->size_offset); + } else { + /* + * Otherwise size info isn't useful (because it's + * always the size of host pointer), enforce accidental + * setup of sizes in this case. + */ + assert(field->size =3D=3D 0 && field->size_offset =3D= =3D 0); + } + /* + * VMS_ARRAY_OF_POINTER must be used only together with one + * of VMS_(V)ARRAY* flags. + */ + assert(field->flags & (VMS_ARRAY | VMS_VARRAY_INT32 | + VMS_VARRAY_UINT16 | VMS_VARRAY_UINT= 8 | + VMS_VARRAY_UINT32)); } + + /* + * When VMS_ARRAY_OF_POINTER_ALLOW_NULL is used, we must have + * VMS_ARRAY_OF_POINTER set too. + */ + if (field->flags & VMS_ARRAY_OF_POINTER_AUTO_ALLOC) { + assert(field->flags & VMS_ARRAY_OF_POINTER); + } + if (field->flags & (VMS_STRUCT | VMS_VSTRUCT)) { /* Recurse to sub structures */ vmstate_check(field->vmsd); diff --git a/migration/vmstate.c b/migration/vmstate.c index d65fc84dfa..7d7d9c7e18 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -153,6 +153,12 @@ static bool vmstate_ptr_marker_load(QEMUFile *f, bool = *load_field, return true; } =20 + if (byte =3D=3D VMS_MARKER_PTR_VALID) { + /* We need to load this field right after the marker */ + *load_field =3D true; + return true; + } + error_setg(errp, "Unexpected ptr marker: %d", byte); return false; } @@ -234,6 +240,22 @@ static bool vmstate_post_load(const VMStateDescription= *vmsd, return true; } =20 + +/* + * If we will use a ptr marker in the stream for a field? Two use cases: + * + * (1) When used with VMS_ARRAY_OF_POINTER_ALLOW_NULL, it must always be + * present to imply the population status of the pointer. + * + * (2) When used with normal VMSD array fields, only emit a null ptr marker + * if the pointer is NULL. + */ +static inline bool +vmstate_use_marker_field(void *ptr, int size, bool dynamic_array) +{ + return (!ptr && size) || dynamic_array; +} + bool vmstate_load_vmsd(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, int version_id, Error **errp) { @@ -271,6 +293,12 @@ bool vmstate_load_vmsd(QEMUFile *f, const VMStateDescr= iption *vmsd, void *first_elem =3D opaque + field->offset; int i, n_elems =3D vmstate_n_elems(opaque, field); int size =3D vmstate_size(opaque, field); + /* + * When this is enabled, it means we will always push a ptr + * marker first for each element saying if it's populated. + */ + bool use_dynamic_array =3D + field->flags & VMS_ARRAY_OF_POINTER_AUTO_ALLOC; =20 vmstate_handle_alloc(first_elem, field, opaque); if (field->flags & VMS_POINTER) { @@ -282,18 +310,37 @@ bool vmstate_load_vmsd(QEMUFile *f, const VMStateDesc= ription *vmsd, /* If we will process the load of field? */ bool load_field =3D true; bool ok =3D true; - void *curr_elem =3D first_elem + size * i; + bool use_marker_field; + void *curr_elem_p =3D first_elem + size * i; + void *curr_elem =3D curr_elem_p; =20 if (field->flags & VMS_ARRAY_OF_POINTER) { - curr_elem =3D *(void **)curr_elem; + curr_elem =3D *(void **)curr_elem_p; } =20 - if (!curr_elem && size) { - /* Read the marker instead of VMSD itself */ + use_marker_field =3D vmstate_use_marker_field(curr_elem, s= ize, + use_dynamic_ar= ray); + if (use_marker_field) { + /* Read the marker instead of VMSD first */ if (!vmstate_ptr_marker_load(f, &load_field, errp)) { trace_vmstate_load_field_error(field->name, -EINVA= L); return false; } + + if (load_field) { + /* + * When reaching here, it means we received a + * non-NULL ptr marker, so we need to populate the + * field before loading it. + * + * NOTE: do not use vmstate_size() here, because we + * need the object size, not entry size of the + * array. + */ + curr_elem =3D g_malloc0(field->size); + /* Remember to update the root pointer! */ + *(void **)curr_elem_p =3D curr_elem; + } } =20 if (load_field) { @@ -397,6 +444,16 @@ static bool vmsd_can_compress(const VMStateField *fiel= d) return false; } =20 + if (field->flags & VMS_ARRAY_OF_POINTER_AUTO_ALLOC) { + /* + * This may involve two VMSD fields to be dumped, one for the + * marker to show if the pointer is NULL, followed by the real + * vmstate object. To make it simple at least for now, skip + * compression for this one. + */ + return false; + } + if (field->flags & VMS_STRUCT) { const VMStateField *sfield =3D field->vmsd->fields; while (sfield->name) { @@ -578,6 +635,12 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMS= tateDescription *vmsd, int size =3D vmstate_size(opaque, field); JSONWriter *vmdesc_loop =3D vmdesc; bool use_marker_field_prev =3D false; + /* + * When this is enabled, it means we will always push a ptr + * marker first for each element saying if it's populated. + */ + bool use_dynamic_array =3D + field->flags & VMS_ARRAY_OF_POINTER_AUTO_ALLOC; =20 trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems= ); if (field->flags & VMS_POINTER) { @@ -596,13 +659,10 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VM= StateDescription *vmsd, curr_elem =3D *(void **)curr_elem; } =20 - use_marker_field =3D !curr_elem && size; + use_marker_field =3D vmstate_use_marker_field(curr_elem, s= ize, + use_dynamic_ar= ray); + if (use_marker_field) { - /* - * If null pointer found (which should only happen in - * an array of pointers), use null placeholder and do - * not follow. - */ inner_field =3D vmsd_create_ptr_marker_field(field); } else { inner_field =3D field; @@ -652,6 +712,27 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const VMS= tateDescription *vmsd, goto out; } =20 + /* + * If we're using dynamic array and the element is + * populated, dump the real object right after the marker. + */ + if (use_dynamic_array && curr_elem) { + /* + * NOTE: do not use vmstate_size() here because we want + * to dump the real VMSD object now. + */ + ok =3D vmstate_save_field_with_vmdesc(f, curr_elem, + field->size, vmsd, + field, vmdesc_loop, + i, max_elems, errp= ); + + if (!ok) { + error_prepend(errp, "Save of field %s/%s failed: ", + vmsd->name, field->name); + goto out; + } + } + /* Compressed arrays only care about the first element */ if (vmdesc_loop && vmsd_can_compress(field)) { vmdesc_loop =3D NULL; --=20 2.50.1 From nobody Mon Apr 6 20:18:27 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1773789920; cv=none; d=zohomail.com; s=zohoarc; b=BRicEkPDCuN7OtqJIrgcRBHhN6s1e+zwkb7AZf1jaf8r1+45DRUw+3RKnwAZYGoTujDsbkW/tITRgXJ3Qm5SO9ZhjM2/2oWlB8D5LI9GxXedNcWrzT+ydas9oiFXWs0uGTfbU3OJ0dgLXI3vKg+uGU2oLakYn/+PFVjdPKnEE74= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773789920; 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=BTcRRki4RVI+IH0q3dAynZQWyxZQTTE18znN3ItjLD4=; b=bU/ByK+G7+DjukXkoiEYsdFRY9E7TVLsLY2uokhXtdK0GTk0t4BF9X25knzoZ1P+hHuS08p0lGWgmmTY+AgGduciqM9Ui99ZU9If/HfhUKHJQSAmWUcnrnxgkIWhPGrpfLDgKbB0WEvYi+4pmjxyjB/0mW9aXxnzrllmGinS8ks= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1773789920243353.7391825782265; Tue, 17 Mar 2026 16:25:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w2dlX-0003zg-6u; Tue, 17 Mar 2026 19:23:59 -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 1w2dlV-0003zW-BI for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:57 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w2dlT-0006Ti-MG for qemu-devel@nongnu.org; Tue, 17 Mar 2026 19:23:57 -0400 Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-329-o0Rf9xeQPqGUbX8IIEQj9g-1; Tue, 17 Mar 2026 19:23:51 -0400 Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-899f671ceb2so480546916d6.3 for ; Tue, 17 Mar 2026 16:23:51 -0700 (PDT) Received: from x1.local ([142.189.10.167]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-89c6b9ea39asm8203806d6.37.2026.03.17.16.23.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 16:23:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1773789835; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BTcRRki4RVI+IH0q3dAynZQWyxZQTTE18znN3ItjLD4=; b=gPTUT+rqSJxwd2YLjxU24wPG3n91cTQAtezPMFCagSH2Y5f2WRWFK4GLQwWa7oYIDYGX84 aLidUYnFOB6CoDqP0VL2v4Mm1hrC9ZFl6JdOqwStsfCkZwAlZpdxCJ3NBZcxsY8+RKLjUx 6HrLO/qkj+ZUx2WSBEvuN867ZIdF5Cc= X-MC-Unique: o0Rf9xeQPqGUbX8IIEQj9g-1 X-Mimecast-MFC-AGG-ID: o0Rf9xeQPqGUbX8IIEQj9g_1773789831 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1773789831; x=1774394631; 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=BTcRRki4RVI+IH0q3dAynZQWyxZQTTE18znN3ItjLD4=; b=QJjNZakIwGiMsJckghSJGel/sKUe2XYsKLYMoWN6g0nM1ZJ5khcVtsnxdMY7/pRTer D1ACHp0GcnBduKpEtO9iwBCNPWD/b4mdR3/INh1X9IhDtv1XYxCRKTpLhe8sFFE8/AqG 4dAsFIvHwMnMfTLdyFn/QcSwM1/wXPr+S0GIi1GOrDeatEY3O0s7TKhwHY+eXdROgb45 e3wGOf6IEAnEvcrDl2KNi+f68PLKPpKPNjpHZVljErn9y2DcPihP8i7fXmydKMYE+4bN zHw8n5PB/Ry5OorjH69nlkD5p7hS0NvqHYCGx7VeR0z7Rknfs43P1rbCAhJmtyZSlp0F /r/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773789831; x=1774394631; 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=BTcRRki4RVI+IH0q3dAynZQWyxZQTTE18znN3ItjLD4=; b=qddy+w8orLQ7cevl8H8Cuf1KBmcfA0wNg9apI1InDYm5RzSAF97QZtY6bPWLJRPNuM SPnrrR5CVF14cpA1EIlck6RRdSBQJTfSCK0dGz7JaFqilnmMdTZ0z6y32art+vDGq1LK Ri80VbK47jxDo+yyjJpMGo1iBLytn0J5FIC9hZE/D0Jr7KjkH/LKbGyjsXodSajEY4Om LMvnbLyZDRMO+kBgnG0SAhklHCZ9s/NEeTMsArBFZwqeJXQs+0mASuO0wK8urWstSWLe mkV9V/PxnNZpVQJCHM+87mMKaGBL8HS9DfnQfh0oJHhx1Fak54rDrwlHtixuyLgMHRGN jIMg== X-Gm-Message-State: AOJu0YxH0INdrvuCBkFPx0VxI2q3m0vhlwuqQb+ajTP1LDwycjH8No5I hK51134I67DiP0559cSjfPy2fwinPmBu5L/Z1kkHlKIxr2dIp1y56LmPp4i24g3j0PB7Jlzvtor C6dxhEB6Yg6DICY99JzGoqzlcBHLeHCHqCF9ryZKy5avs4mnuoAm8nD0oK3oCsFhCaIEi3GObnI p3YEn+dVF+p18tfyID2QBZyRvcvKnZIH0dz6LH7g== X-Gm-Gg: ATEYQzzl/mTMK7ZbMVBroO+dKtmpDfCW9A3jW5ewFD9lLa1Oy2bEWHRKn1D1C7tKpfz vX9yV4lU67NktkIJ8OLsQMjbOLL0SaasEEb8ow7FKGyranBFNwqUr+TYGVhLFjkKUxBTizKjk0m J8zaJLcFKPILgB4he61AlokuqJEmHmDLMWGjo4IUEUW/tr8cWcjnxfJWVQ96X7u+6OzjMDiAtux hG7kDb47xdxwhog7aIhum2g7SDFb39MGSB/TSXcbFdiXLC6LNDc8os+TmII4iiDu/cXoQmbeqzZ 4lVobGk9e/HFJmYQ4JIX4kuGCfa/xYsuvwfKDRQgJqZ8vUphHoTJGELrMwicMTgAuGIE6eIwGUD +zpWviAQpjiM0+A== X-Received: by 2002:a05:6214:4a8d:b0:89c:3ff5:78dc with SMTP id 6a1803df08f44-89c6b591469mr23226816d6.32.1773789830621; Tue, 17 Mar 2026 16:23:50 -0700 (PDT) X-Received: by 2002:a05:6214:4a8d:b0:89c:3ff5:78dc with SMTP id 6a1803df08f44-89c6b591469mr23226496d6.32.1773789830091; Tue, 17 Mar 2026 16:23:50 -0700 (PDT) From: Peter Xu To: qemu-devel@nongnu.org Cc: Alexander Mikhalitsyn , Juraj Marcin , peterx@redhat.com, Fabiano Rosas , Alexander Mikhalitsyn Subject: [PATCH RFC 10/10] tests/unit/test-vmstate: add tests for VMS_ARRAY_OF_POINTER_ALLOW_NULL Date: Tue, 17 Mar 2026 19:23:32 -0400 Message-ID: <20260317232332.15209-11-peterx@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260317232332.15209-1-peterx@redhat.com> References: <20260317232332.15209-1-peterx@redhat.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=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=peterx@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -3 X-Spam_score: -0.4 X-Spam_bar: / X-Spam_report: (-0.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.819, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.903, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 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 @redhat.com) X-ZM-MESSAGEID: 1773789922039154100 Content-Type: text/plain; charset="utf-8" From: Alexander Mikhalitsyn Add tests for VMSTATE_VARRAY_OF_POINTER_TO_STRUCT_UINT32_ALLOC. Signed-off-by: Alexander Mikhalitsyn [peterx: Removed two tests due to macro not used, rebase, fix warning] Signed-off-by: Peter Xu --- tests/unit/test-vmstate.c | 86 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/tests/unit/test-vmstate.c b/tests/unit/test-vmstate.c index dae15786aa..df1fb4c778 100644 --- a/tests/unit/test-vmstate.c +++ b/tests/unit/test-vmstate.c @@ -702,6 +702,88 @@ static void test_arr_ptr_prim_0_load(void) } } =20 +static uint8_t wire_arr_ptr_with_nulls[] =3D { + VMS_MARKER_PTR_VALID, + 0x00, 0x00, 0x00, 0x00, + VMS_MARKER_PTR_NULL, + VMS_MARKER_PTR_VALID, + 0x00, 0x00, 0x00, 0x02, + VMS_MARKER_PTR_VALID, + 0x00, 0x00, 0x00, 0x03, + QEMU_VM_EOF +}; + +typedef struct { + uint32_t ar_items_num; + TestStructTriv **ar; +} TestVArrayOfPtrToStuctWithNULLs; + +const VMStateDescription vmsd_arps_with_nulls =3D { + .name =3D "test/arps_with_nulls", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (const VMStateField[]) { + VMSTATE_VARRAY_OF_POINTER_TO_STRUCT_UINT32_ALLOC( + ar, TestVArrayOfPtrToStuctWithNULLs, ar_items_num, + 0, vmsd_tst, TestStructTriv), + VMSTATE_END_OF_LIST() + } +}; + +static void test_arr_ptr_nulls_str_save(void) +{ + TestStructTriv ar[AR_SIZE] =3D { {.i =3D 0}, {.i =3D 1}, {.i =3D 2}, {= .i =3D 3} }; + TestVArrayOfPtrToStuctWithNULLs sample =3D {}; + int idx; + + sample.ar_items_num =3D AR_SIZE; + sample.ar =3D g_new0(TestStructTriv*, sample.ar_items_num); + sample.ar[0] =3D g_new0(TestStructTriv, 1); + *sample.ar[0] =3D ar[0]; + /* note, sample.ar[1] remains NULL */ + sample.ar[2] =3D g_new0(TestStructTriv, 1); + *sample.ar[2] =3D ar[2]; + sample.ar[3] =3D g_new0(TestStructTriv, 1); + *sample.ar[3] =3D ar[3]; + + save_vmstate(&vmsd_arps_with_nulls, &sample); + compare_vmstate(wire_arr_ptr_with_nulls, sizeof(wire_arr_ptr_with_null= s)); + + for (idx =3D 0; idx < AR_SIZE; ++idx) { + g_free(sample.ar[idx]); + } + g_free(sample.ar); +} + +static void test_arr_ptr_nulls_str_load(void) +{ + TestStructTriv ar_gt[AR_SIZE] =3D {{.i =3D 0}, {.i =3D 0}, {.i =3D 2},= {.i =3D 3} }; + TestVArrayOfPtrToStuctWithNULLs obj =3D {}; + int idx; + + obj.ar_items_num =3D AR_SIZE; + obj.ar =3D g_new0(TestStructTriv*, obj.ar_items_num); + + save_buffer(wire_arr_ptr_with_nulls, sizeof(wire_arr_ptr_with_nulls)); + SUCCESS(load_vmstate_one( + &vmsd_arps_with_nulls, &obj, 1, + wire_arr_ptr_with_nulls, sizeof(wire_arr_ptr_with_nulls))); + + for (idx =3D 0; idx < AR_SIZE; ++idx) { + if (idx =3D=3D 1) { + g_assert_cmpint((uintptr_t)(obj.ar[idx]), =3D=3D, 0); + } else { + /* compare the target array ar with the ground truth array ar_= gt */ + g_assert_cmpint(ar_gt[idx].i, =3D=3D, obj.ar[idx]->i); + } + } + + for (idx =3D 0; idx < AR_SIZE; ++idx) { + g_free(obj.ar[idx]); + } + g_free(obj.ar); +} + /* test QTAILQ migration */ typedef struct TestQtailqElement TestQtailqElement; =20 @@ -1568,6 +1650,10 @@ int main(int argc, char **argv) test_arr_ptr_prim_0_save); g_test_add_func("/vmstate/array/ptr/prim/0/load", test_arr_ptr_prim_0_load); + g_test_add_func("/vmstate/array/ptr-nulls/str/save", + test_arr_ptr_nulls_str_save); + g_test_add_func("/vmstate/array/ptr-nulls/str/load", + test_arr_ptr_nulls_str_load); g_test_add_func("/vmstate/qtailq/save/saveq", test_save_q); g_test_add_func("/vmstate/qtailq/load/loadq", test_load_q); g_test_add_func("/vmstate/gtree/save/savedomain", test_gtree_save_doma= in); --=20 2.50.1