{"id":2227466,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2227466/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260423191958.1440-32-farosas@suse.de/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.2/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260423191958.1440-32-farosas@suse.de>","list_archive_url":null,"date":"2026-04-23T19:19:45","name":"[PULL,31/43] vmstate: Implement load of ptr marker in vmstate core","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"5a51c079123783e1a61b3a5b66dad1aa15a5818e","submitter":{"id":85343,"url":"http://patchwork.ozlabs.org/api/1.2/people/85343/?format=json","name":"Fabiano Rosas","email":"farosas@suse.de"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260423191958.1440-32-farosas@suse.de/mbox/","series":[{"id":501236,"url":"http://patchwork.ozlabs.org/api/1.2/series/501236/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=501236","date":"2026-04-23T19:19:14","name":"[PULL,01/43] checkpatch: Allow spaces after all coroutine annotations","version":1,"mbox":"http://patchwork.ozlabs.org/series/501236/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2227466/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2227466/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=o2J3aGfm;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=/4FPKCk+;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=RvJIVEsP;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=0bwMSfnS;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)","smtp-out2.suse.de;\n dkim=pass header.d=suse.de header.s=susede2_rsa header.b=RvJIVEsP;\n dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=0bwMSfnS"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g1mH00wrLz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 05:23:56 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wFzcs-0004qo-BL; Thu, 23 Apr 2026 15:22:14 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <farosas@suse.de>) id 1wFzcL-0003Bw-9j\n for qemu-devel@nongnu.org; Thu, 23 Apr 2026 15:21:41 -0400","from smtp-out2.suse.de ([195.135.223.131])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <farosas@suse.de>) id 1wFzcJ-00027I-Bg\n for qemu-devel@nongnu.org; Thu, 23 Apr 2026 15:21:41 -0400","from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org\n [IPv6:2a07:de40:b281:104:10:150:64:97])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out2.suse.de (Postfix) with ESMTPS id E4C285BD8F;\n Thu, 23 Apr 2026 19:20:48 +0000 (UTC)","from imap1.dmz-prg2.suse.org (localhost [127.0.0.1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id A6E5B593A3;\n Thu, 23 Apr 2026 19:20:47 +0000 (UTC)","from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167])\n by imap1.dmz-prg2.suse.org with ESMTPSA id GIN6HA9x6mlJCwAAD6G6ig\n (envelope-from <farosas@suse.de>); Thu, 23 Apr 2026 19:20:47 +0000"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776972049;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=GSE7um/bB6HXlabEMCP8ZpFG/3SzyZrOvtKbDelG4/g=;\n b=o2J3aGfmZrO8yh6aDcv9ff7buX3QlbDEBonPG7UnG0wPxMI2WYpIZ/sKGo/cV7r+DCr2EE\n +PjBPaza5Tz76micM2Nc6oiW054pRiXAmZpg5N+/bH0Fo1llj18xtrsQ/6YD2oEczVDtrl\n 54mkQAGlaD4bikw+kZUB9k6ELQnFXlQ=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776972049;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=GSE7um/bB6HXlabEMCP8ZpFG/3SzyZrOvtKbDelG4/g=;\n b=/4FPKCk+YBvFb24jd+ChoIULklyhObYhr3lRxBwy9ncCWhUV8t08eIDCtiSbuQNbNiaDWC\n qfysEbH6ONqi4BAg==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776972048;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=GSE7um/bB6HXlabEMCP8ZpFG/3SzyZrOvtKbDelG4/g=;\n b=RvJIVEsPBlRoKPePNWvKgbxYG0xvvLra6kYvpIy5GxvvSZKqapamBD4S3rCOw1GPF+7h12\n bcSX6wIOlNWYCqlpWLAO8F3iFN1HsMS33fuJZk/NX/eEm/1VUt0oRIOSiWV7DqUiKkM4LP\n GjxyOMB0KWHwdtY+e2i4nqHGJq9lF9o=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776972048;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=GSE7um/bB6HXlabEMCP8ZpFG/3SzyZrOvtKbDelG4/g=;\n b=0bwMSfnS4ePHW0wIZpOdQJb3k/ww/47H3kZm04bZV2Oo0Yb41z4iAPljC3VZa+RkSSxZ4z\n 8jQzSHHhEHpGCzDA=="],"From":"Fabiano Rosas <farosas@suse.de>","To":"qemu-devel@nongnu.org","Cc":"Peter Xu <peterx@redhat.com>,\n Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>,\n Juraj Marcin <jmarcin@redhat.com>","Subject":"[PULL 31/43] vmstate: Implement load of ptr marker in vmstate core","Date":"Thu, 23 Apr 2026 16:19:45 -0300","Message-ID":"<20260423191958.1440-32-farosas@suse.de>","X-Mailer":"git-send-email 2.51.0","In-Reply-To":"<20260423191958.1440-1-farosas@suse.de>","References":"<20260423191958.1440-1-farosas@suse.de>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Rspamd-Action":"no action","X-Rspamd-Server":"rspamd2.dmz-prg2.suse.org","X-Spamd-Result":"default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n NEURAL_HAM_LONG(-1.00)[-1.000]; MID_CONTAINS_FROM(1.00)[];\n R_MISSING_CHARSET(0.50)[];\n R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain];\n MX_GOOD(-0.01)[]; ARC_NA(0.00)[];\n FUZZY_RATELIMITED(0.00)[rspamd.com]; RCVD_COUNT_TWO(0.00)[2];\n MIME_TRACE(0.00)[0:+]; RCVD_VIA_SMTP_AUTH(0.00)[];\n SPAMHAUS_XBL(0.00)[2a07:de40:b281:104:10:150:64:97:from];\n TO_DN_SOME(0.00)[];\n RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:104:10:150:64:97:from];\n RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:106:10:150:64:167:received];\n FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[];\n DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:dkim,suse.de:mid,suse.de:email,imap1.dmz-prg2.suse.org:helo,imap1.dmz-prg2.suse.org:rdns];\n RCVD_TLS_ALL(0.00)[]; FROM_EQ_ENVFROM(0.00)[];\n RCPT_COUNT_THREE(0.00)[4];\n DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n DKIM_TRACE(0.00)[suse.de:+]","X-Rspamd-Queue-Id":"E4C285BD8F","X-Spam-Score":"-3.01","Received-SPF":"pass client-ip=195.135.223.131; envelope-from=farosas@suse.de;\n helo=smtp-out2.suse.de","X-Spam_score_int":"-43","X-Spam_score":"-4.4","X-Spam_bar":"----","X-Spam_report":"(-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"From: Peter Xu <peterx@redhat.com>\n\nThe loader side of ptr marker is pretty straightforward, instead of playing\nthe inner_field trick, just do the load manually assuming the marker layout\nis a stable ABI (which it is true already).\n\nThis will remove some logic while loading VMSD, and hopefully it makes it\nslightly easier to read.  Unfortunately, we still need to keep the sender\nside because of the JSON blob we're maintaining..\n\nThis paves way for future processing of non-NULL markers as well.\n\nWhen at it, not check \"size\" anymore for existing NULL markers, and move it\nunder the same VMS_ARRAY_OF_POINTER section because that's the only place\nthat NULL marker can happen (which guarantess size==host ptr size, which is\nnon-zero).\n\nReviewed-by: Fabiano Rosas <farosas@suse.de>\nReviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>\nSigned-off-by: Peter Xu <peterx@redhat.com>\nReviewed-by: Juraj Marcin <jmarcin@redhat.com>\nLink: https://lore.kernel.org/qemu-devel/20260401202844.673494-9-peterx@redhat.com\nSigned-off-by: Fabiano Rosas <farosas@suse.de>\n---\n migration/vmstate-types.c | 12 ++++------\n migration/vmstate.c       | 46 ++++++++++++++++++++++++---------------\n 2 files changed, 32 insertions(+), 26 deletions(-)","diff":"diff --git a/migration/vmstate-types.c b/migration/vmstate-types.c\nindex b31689fc3c..ae465c5c2c 100644\n--- a/migration/vmstate-types.c\n+++ b/migration/vmstate-types.c\n@@ -363,14 +363,10 @@ static bool load_ptr_marker(QEMUFile *f, void *pv, size_t size,\n                             const VMStateField *field, Error **errp)\n \n {\n-    int byte = qemu_get_byte(f);\n-\n-    if (byte == VMS_MARKER_PTR_NULL || byte == VMS_MARKER_PTR_VALID) {\n-        /* TODO: process PTR_VALID case */\n-        return true;\n-    }\n-\n-    error_setg(errp, \"%s: unexpected ptr marker: %d\", __func__, byte);\n+    /*\n+     * Load is done in vmstate core, see vmstate_ptr_marker_load().\n+     */\n+    g_assert_not_reached();\n     return false;\n }\n \ndiff --git a/migration/vmstate.c b/migration/vmstate.c\nindex b333aa1744..47812eb882 100644\n--- a/migration/vmstate.c\n+++ b/migration/vmstate.c\n@@ -142,6 +142,21 @@ static void vmstate_handle_alloc(void *ptr, const VMStateField *field,\n     }\n }\n \n+static bool vmstate_ptr_marker_load(QEMUFile *f, bool *load_field,\n+                                    Error **errp)\n+{\n+    int byte = qemu_get_byte(f);\n+\n+    if (byte == VMS_MARKER_PTR_NULL) {\n+        /* When it's a null ptr marker, do not continue the load */\n+        *load_field = false;\n+        return true;\n+    }\n+\n+    error_setg(errp, \"Unexpected ptr marker: %d\", byte);\n+    return false;\n+}\n+\n static bool vmstate_pre_load(const VMStateDescription *vmsd, void *opaque,\n                              Error **errp)\n {\n@@ -264,30 +279,25 @@ bool vmstate_load_vmsd(QEMUFile *f, const VMStateDescription *vmsd,\n             }\n \n             for (i = 0; i < n_elems; i++) {\n-                bool ok;\n+                /* If we will process the load of field? */\n+                bool load_field = true;\n+                bool ok = true;\n                 void *curr_elem = first_elem + size * i;\n-                const VMStateField *inner_field;\n \n                 if (field->flags & VMS_ARRAY_OF_POINTER) {\n                     curr_elem = *(void **)curr_elem;\n+                    if (!curr_elem) {\n+                        /* Read the marker instead of VMSD itself */\n+                        if (!vmstate_ptr_marker_load(f, &load_field, errp)) {\n+                            trace_vmstate_load_field_error(field->name,\n+                                                           -EINVAL);\n+                            return false;\n+                        }\n+                    }\n                 }\n \n-                if (!curr_elem && size) {\n-                    /*\n-                     * If null pointer found (which should only happen in\n-                     * an array of pointers), use null placeholder and do\n-                     * not follow.\n-                     */\n-                    inner_field = vmsd_create_ptr_marker_field(field);\n-                } else {\n-                    inner_field = field;\n-                }\n-\n-                ok = vmstate_load_field(f, curr_elem, size, inner_field, errp);\n-\n-                /* If we used a fake temp field.. free it now */\n-                if (inner_field != field) {\n-                    g_clear_pointer((gpointer *)&inner_field, g_free);\n+                if (load_field) {\n+                    ok = vmstate_load_field(f, curr_elem, size, field, errp);\n                 }\n \n                 if (ok) {\n","prefixes":["PULL","31/43"]}