get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2217864/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2217864,
    "url": "http://patchwork.ozlabs.org/api/patches/2217864/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260330-fast-snapshot-refactor-v1-3-22143e70c467@gmail.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "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": "<20260330-fast-snapshot-refactor-v1-3-22143e70c467@gmail.com>",
    "list_archive_url": null,
    "date": "2026-03-30T19:04:43",
    "name": "[3/3] migration/ram: Split mapped-ram header and page loading",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "b9abc2db76b2ba9777bc73a43c45dee908b2a781",
    "submitter": {
        "id": 87325,
        "url": "http://patchwork.ozlabs.org/api/people/87325/?format=api",
        "name": "Takeru Hayasaka",
        "email": "hayatake396@gmail.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260330-fast-snapshot-refactor-v1-3-22143e70c467@gmail.com/mbox/",
    "series": [
        {
            "id": 498082,
            "url": "http://patchwork.ozlabs.org/api/series/498082/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=498082",
            "date": "2026-03-30T19:04:41",
            "name": "migration/postcopy: Preparatory refactoring for fast snapshot load",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/498082/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2217864/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2217864/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 (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=kTI0YU1s;\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=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.gnu.org (lists.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 4fl12Z6J2Hz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 31 Mar 2026 06:07:02 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w7HwW-0004cC-Dl; Mon, 30 Mar 2026 15:06:32 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <hayatake396@gmail.com>)\n id 1w7HvY-0003pM-EN\n for qemu-devel@nongnu.org; Mon, 30 Mar 2026 15:05:34 -0400",
            "from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <hayatake396@gmail.com>)\n id 1w7HvW-0005Dy-1w\n for qemu-devel@nongnu.org; Mon, 30 Mar 2026 15:05:32 -0400",
            "by mail-pf1-x42d.google.com with SMTP id\n d2e1a72fcca58-82bae83318bso2229487b3a.2\n for <qemu-devel@nongnu.org>; Mon, 30 Mar 2026 12:05:29 -0700 (PDT)",
            "from [127.0.1.1] (191.68.231.218.rev.ocx2915.net. [218.231.68.191])\n by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-82ca84644d9sm8496989b3a.13.2026.03.30.12.05.26\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 30 Mar 2026 12:05:27 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1774897528; x=1775502328; darn=nongnu.org;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:from:to:cc:subject:date:message-id\n :reply-to; bh=2mYxx14F73G5Col0sHTzc8b/F7FosUZb5oC/eLDVHtM=;\n b=kTI0YU1sCj2nTAJ2BINKBVXbIEZa3iw2TnFDRz70pdvdUrz0LWMfAHGdvmQTkdKSaO\n GtDi6SzfWN3+BMpkqMRbiAvcCdhkkkntq2J0uRyUiL5BIPLXWTsD/pGAy3gsz+NUk0n7\n Aa2vdSledGihXrHFsW/j4XtLJ/SfVpYVXzKG0SmQsJnhiQW9TnwRTvXAVH7YKV+JXBbM\n aa+j4G80EFgnjJXs8IwIpPis+7FtULRefQ7bpfMdfKMuxpu9ya2Un3WW0XOVCv5+ZagP\n w7zzVpmlAbtUBRLVwQEfh5LvwXmFL3sLAL6yEFHiUfC7TrP+GeQHn1VvdVjQIzTB3lkn\n Pxag==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774897528; x=1775502328;\n h=cc:to:in-reply-to:references:message-id:content-transfer-encoding\n :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=2mYxx14F73G5Col0sHTzc8b/F7FosUZb5oC/eLDVHtM=;\n b=AGson6+7q8oot0rnsh3egaHTVr22/uyk4To7i5efDIy8WD6mA2H/ZrHGokMdJviF62\n vn8cdcFjDND81Bu3WGFkoxw4TmSyKfKz4PbzKolwF8IjpU428ao2ych50eRS8bHSAMpU\n ITY/AVXaNta7M+r+DTbdJKQ+1Q9zj0gr6taYwIIkhUSqDmi51UKFz9H57WCee6bOV7mT\n BNmf0hVVTiCN9ZtIGEHPZioR31TsGijUcs5fcHR8yWg2fFydSZw7B6Hf4OizBQmMsbAg\n j49E6zTjQKZbxTStX/kbuAUEwzRE+hBj88uDGnLPb0j4v+29JGX4wwRLdlqmntyuT7/k\n Ek9w==",
        "X-Gm-Message-State": "AOJu0YxcUGTXIy4Tw0h3M2E/zC8h7FI6e8B4Kq8OAEIKx8HP/Y/xUlrU\n AZgjItN0fqco31WAu5ZtWajbD6W1+lwljIV8zG0beVmVe9ChgaQIhxfqI1i9Dw==",
        "X-Gm-Gg": "ATEYQzwDaKTUPM4+eGQOHpfMjF0UKbKI78G//ZParSoSQ3FvaG6K3pk+rVbqwYaStYj\n pHu60AyQbVEFVoAI6f6NaSCp0Wmui8bBe/qoYJSQno0Mqly9Mj68x82Emb+GwGZuTi7QVESkKm1\n fPUPLcRTQLIB+xNhC+8qyyrOz2QwcWUfgU3S2U7/mcPqARqEleNMkAH6geE897tGmnV2NhjwOCO\n Yc3r3vx+Pip5S9cfrZ06qNSqdWMjyLT3ic9uH4Mq+kFUBEHUt1NoRSU4EllKvcjnwbcNIdHsFp8\n 3fLEmNi+tCg+JySC80mScoictXnZuMPYBwp06wplO+63JE3JDjThchp/1OopDQdceEhI3H+U4W/\n n3DF8SUmMSxT0tcnGeJtK3ME/njP1QJzBKXIP/GPZGfbPcq56qV53a8PfKw4GzSHJdCpFSNX8p7\n EUdEGcBN/iTluvcgMYecA193PX+hOHvQQn17G/iPkDp9mkswiTP7X/OaCiowrrhOcpV9D6bS698\n ttTGM/Mch1+9F/kbLvJht5mCmi8",
        "X-Received": "by 2002:a05:6a00:8d3:b0:7aa:a2a8:9808 with SMTP id\n d2e1a72fcca58-82c95e650a6mr13547225b3a.20.1774897528018;\n Mon, 30 Mar 2026 12:05:28 -0700 (PDT)",
        "From": "Takeru Hayasaka <hayatake396@gmail.com>",
        "Date": "Mon, 30 Mar 2026 19:04:43 +0000",
        "Subject": "[PATCH 3/3] migration/ram: Split mapped-ram header and page\n loading",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "7bit",
        "Message-Id": "<20260330-fast-snapshot-refactor-v1-3-22143e70c467@gmail.com>",
        "References": "<20260330-fast-snapshot-refactor-v1-0-22143e70c467@gmail.com>",
        "In-Reply-To": "<20260330-fast-snapshot-refactor-v1-0-22143e70c467@gmail.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>,\n Takeru Hayasaka <hayatake396@gmail.com>",
        "X-Mailer": "b4 0.15.1",
        "Received-SPF": "pass client-ip=2607:f8b0:4864:20::42d;\n envelope-from=hayatake396@gmail.com; helo=mail-pf1-x42d.google.com",
        "X-Spam_score_int": "-17",
        "X-Spam_score": "-1.8",
        "X-Spam_bar": "-",
        "X-Spam_report": "(-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, 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": "Split parse_ramblock_mapped_ram() into two stages:\n\n- parse_ramblock_mapped_ram_header(): reads the MappedRamHeader and\n  dirty bitmap, storing pages_offset and file_bmap on the RAMBlock\n  for later use.\n\n- parse_ramblock_mapped_ram_pages(): reads all page data using the\n  bitmap and pages_offset populated by the header stage.\n\nThe original parse_ramblock_mapped_ram() becomes a thin wrapper that\ncalls both in sequence, preserving the existing behavior.\n\nThe bitmap is now stored in block->file_bmap (which already exists\non RAMBlock for the save side) instead of a function-local variable.\nThe pages function frees the bitmap after loading is complete.\n\nThis separation prepares for fast snapshot load, which will call\nonly the header stage at load time and defer page loading to a\nuserfaultfd-based demand paging mechanism.\n\nNo functional change.\n\nSigned-off-by: Takeru Hayasaka <hayatake396@gmail.com>\n---\n migration/ram.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++------\n 1 file changed, 46 insertions(+), 6 deletions(-)",
    "diff": "diff --git a/migration/ram.c b/migration/ram.c\nindex 979751f61b30..301ef9758e25 100644\n--- a/migration/ram.c\n+++ b/migration/ram.c\n@@ -4152,10 +4152,15 @@ err:\n     return false;\n }\n \n-static void parse_ramblock_mapped_ram(QEMUFile *f, RAMBlock *block,\n-                                      ram_addr_t length, Error **errp)\n+/*\n+ * Read the mapped-ram header and dirty bitmap for a RAM block.\n+ *\n+ * Populates block->pages_offset and block->file_bmap so that page\n+ * data can be loaded later (either eagerly or on demand).\n+ */\n+static void parse_ramblock_mapped_ram_header(QEMUFile *f, RAMBlock *block,\n+                                             ram_addr_t length, Error **errp)\n {\n-    g_autofree unsigned long *bitmap = NULL;\n     MappedRamHeader header;\n     size_t bitmap_size;\n     long num_pages;\n@@ -4187,19 +4192,54 @@ static void parse_ramblock_mapped_ram(QEMUFile *f, RAMBlock *block,\n     num_pages = length / header.page_size;\n     bitmap_size = BITS_TO_LONGS(num_pages) * sizeof(unsigned long);\n \n-    bitmap = g_malloc0(bitmap_size);\n-    if (qemu_get_buffer_at(f, (uint8_t *)bitmap, bitmap_size,\n+    block->file_bmap = g_malloc0(bitmap_size);\n+    if (qemu_get_buffer_at(f, (uint8_t *)block->file_bmap, bitmap_size,\n                            header.bitmap_offset) != bitmap_size) {\n         error_setg(errp, \"Error reading dirty bitmap\");\n+        g_free(block->file_bmap);\n+        block->file_bmap = NULL;\n         return;\n     }\n+}\n+\n+/*\n+ * Read all page data for a mapped-ram RAM block using the bitmap\n+ * and pages_offset previously populated by parse_ramblock_mapped_ram_header().\n+ */\n+static void parse_ramblock_mapped_ram_pages(QEMUFile *f, RAMBlock *block,\n+                                            ram_addr_t length, Error **errp)\n+{\n+    long num_pages;\n \n-    if (!read_ramblock_mapped_ram(f, block, num_pages, bitmap, errp)) {\n+    if (!block->file_bmap) {\n+        /* Shared block that was skipped during header parsing */\n         return;\n     }\n \n+    num_pages = length / TARGET_PAGE_SIZE;\n+\n+    if (!read_ramblock_mapped_ram(f, block, num_pages,\n+                                  block->file_bmap, errp)) {\n+        goto out;\n+    }\n+\n     /* Skip pages array */\n     qemu_set_offset(f, block->pages_offset + length, SEEK_SET);\n+\n+out:\n+    g_free(block->file_bmap);\n+    block->file_bmap = NULL;\n+}\n+\n+static void parse_ramblock_mapped_ram(QEMUFile *f, RAMBlock *block,\n+                                      ram_addr_t length, Error **errp)\n+{\n+    parse_ramblock_mapped_ram_header(f, block, length, errp);\n+    if (*errp) {\n+        return;\n+    }\n+\n+    parse_ramblock_mapped_ram_pages(f, block, length, errp);\n }\n \n static int parse_ramblock(QEMUFile *f, RAMBlock *block, ram_addr_t length)\n",
    "prefixes": [
        "3/3"
    ]
}