Show a cover letter.

GET /api/1.1/covers/2224898/?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2224898,
    "url": "http://patchwork.ozlabs.org/api/1.1/covers/2224898/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260419130139.15554-1-alexander@mihalicyn.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.1/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": ""
    },
    "msgid": "<20260419130139.15554-1-alexander@mihalicyn.com>",
    "date": "2026-04-19T13:01:31",
    "name": "[v6,0/8] hw/nvme: add basic live migration support",
    "submitter": {
        "id": 81630,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/81630/?format=api",
        "name": "Alexander Mikhalitsyn",
        "email": "alexander@mihalicyn.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260419130139.15554-1-alexander@mihalicyn.com/mbox/",
    "series": [
        {
            "id": 500500,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/500500/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500500",
            "date": "2026-04-19T13:01:32",
            "name": "hw/nvme: add basic live migration support",
            "version": 6,
            "mbox": "http://patchwork.ozlabs.org/series/500500/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/covers/2224898/comments/",
    "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 secure) header.d=mihalicyn.com header.i=@mihalicyn.com header.a=rsa-sha256\n header.s=mihalicyn header.b=EAEaGz3z;\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)"
        ],
        "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 4fz82L6pzZz1yD4\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 19 Apr 2026 23:03:54 +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 1wERn7-00011Y-CJ; Sun, 19 Apr 2026 09:02:25 -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 <alexander@mihalicyn.com>)\n id 1wERmf-0000tq-08\n for qemu-devel@nongnu.org; Sun, 19 Apr 2026 09:02:00 -0400",
            "from mail-wm1-x329.google.com ([2a00:1450:4864:20::329])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <alexander@mihalicyn.com>)\n id 1wERmX-0008IM-St\n for qemu-devel@nongnu.org; Sun, 19 Apr 2026 09:01:53 -0400",
            "by mail-wm1-x329.google.com with SMTP id\n 5b1f17b1804b1-488e1a8ac40so30345725e9.2\n for <qemu-devel@nongnu.org>; Sun, 19 Apr 2026 06:01:43 -0700 (PDT)",
            "from alex-laptop.lan\n (p200300cf57228c00995e4e0d3496e07b.dip0.t-ipconnect.de.\n [2003:cf:5722:8c00:995e:4e0d:3496:e07b])\n by smtp.gmail.com with ESMTPSA id\n ffacd0b85a97d-43fe4cc2cacsm20734304f8f.13.2026.04.19.06.01.40\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sun, 19 Apr 2026 06:01:41 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=mihalicyn.com; s=mihalicyn; t=1776603702; x=1777208502; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=fk349AO3pKfAG0FFpQJLVXFefEF3d09SJA53kGdnCyw=;\n b=EAEaGz3zfAWja6i9mY23DsJ7forbv6rFi1mugV2BpXTZAA+TXpK7avmK6y8TMSAFfB\n YZVNtAKCus++7K3QwOQOcl2W3ZSCQyyH1VpGnAmRZT92WkL5nH8J/lAwtLcbkoUC4uLk\n J344WB1VMXOZdR+YHms8RU+u0uPQDfPCvh5xA=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776603702; x=1777208502;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=fk349AO3pKfAG0FFpQJLVXFefEF3d09SJA53kGdnCyw=;\n b=BMk69/FyWhqDJ1tyxav3Jbf3PQJMTHj/YxwCmEPCsj+/NfCOYi+bi+pgNynqd1p9B3\n UFf0l7oaC9MY5so/soMPou1o+lTT1957cOrkkMf981Q4+GhXzqKRDhjte64jxM78bkKa\n iDwblG7vWr+7jr/wFIjEbdN4CLD0MTo0FhqslY0fzQ4c161E5xhdioYxbaTIhwFlJNpQ\n YvSb8GkuLq3LQLDJLnafAM6i0i+MyZIMnJhWwjctPYcpQ7K5RviGJIf1K2tS1f3VUSYO\n bcrR3dc5mzR4iuiIpmn2ohPTfsFjFjslZm4BsXQJPv0Z4vQyZbleybACj2QQ1kCg1us2\n 2Tcg==",
        "X-Gm-Message-State": "AOJu0YzGqefHI7NAH4lZBkZsD5G0iDpXl8whcjBIMhHIyqmxXiHlyWEM\n QUdQ/et4qWdIDZl3e+s6QylN+trqRq/TyNnssaBtEQiPILUGWvrHmXHIwg5UMAyyORNP/54QC4C\n 9ox6Qe2I=",
        "X-Gm-Gg": "AeBDiesA0bapiam+viy0N+h6bHZCwQgq0WJ5u159ahSZun4WpWpIsyzVBIXmR2guwQQ\n /9XCHZL8xfLqSZz7apQEWcUJHF+DyqFU5vDuNsonaEHfDRFNnLj6YK6q+BJ/YA6uZUXrFAmhhw6\n YtZm8ve5+4FQZoIVzFYXh7/vHga+0r/rPfJOm9yIVmbU69lYL4TA2eDuhLTHCjz1oZgxGnlQ+pl\n IAdr78hPiv6Ib1dninTzTY2sXtqRZ6H4VaiR73dCnLq5dA2V8F4AGHcwecG9TPUPBN9/M51Vz4r\n 0oUgvx5TiQfGYv40XUdoVQ3hlmeouh/HgFp5jT+LzIVev/1NLekhoTxRR/AkYHThNo17XTL8CD6\n 9rZJaXokczB347bIFl23KEOFtdyvf9Qid0BvP8nWmnlAWJUjVSTKEfOx9ql78kESe3OfTZt1nZu\n 9PSM3P29FnlAslq24ns5AXlBn9055SlHq9AzoNGl/JkqUZX3h7grcw4SG/oW4tEwQm30R8kSu6l\n Lmq8pv4B6gllbK86iXsaUJiR/DD8yTeoA==",
        "X-Received": "by 2002:a05:600c:4ec8:b0:485:7f02:afd5 with SMTP id\n 5b1f17b1804b1-488fb755caamr145885785e9.13.1776603701710;\n Sun, 19 Apr 2026 06:01:41 -0700 (PDT)",
        "From": "Alexander Mikhalitsyn <alexander@mihalicyn.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "Alexander Mikhalitsyn <alexander@mihalicyn.com>,\n Kevin Wolf <kwolf@redhat.com>, qemu-block@nongnu.org,\n Fam Zheng <fam@euphon.net>,\n =?utf-8?q?St=C3=A9phane_Graber?= <stgraber@stgraber.org>, =?utf-8?q?Philipp?=\n\t=?utf-8?q?e_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Paolo Bonzini <pbonzini@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>,\n Laurent Vivier <lvivier@redhat.com>, Jesper Devantier <foss@defmacro.it>,\n Klaus Jensen <its@irrelevant.dk>, Fabiano Rosas <farosas@suse.de>,\n Zhao Liu <zhao1.liu@intel.com>, Keith Busch <kbusch@kernel.org>,\n Peter Xu <peterx@redhat.com>, Hanna Reitz <hreitz@redhat.com>,\n Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>",
        "Subject": "[PATCH v6 0/8] hw/nvme: add basic live migration support",
        "Date": "Sun, 19 Apr 2026 15:01:31 +0200",
        "Message-ID": "<20260419130139.15554-1-alexander@mihalicyn.com>",
        "X-Mailer": "git-send-email 2.47.3",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Received-SPF": "pass client-ip=2a00:1450:4864:20::329;\n envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x329.google.com",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 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_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=unavailable 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: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>\n\nDear friends,\n\nThis patchset adds basic live migration support for\nQEMU emulated NVMe device.\n\nImplementation has some limitations:\n- only one NVMe namespace is supported\n- SMART counters are not preserved\n- CMB is not supported\n- PMR is not supported\n- SPDM is not supported\n- SR-IOV is not supported\n\nI believe this is something I can support in next patchset versions or\nseparately on-demand (when usecase appears).\n\nTesting.\n\nThis patch series was manually tested on:\n- Debian 13.3 VM (kernel 6.12.69+deb13-amd64) using fio on *non-root* NVMe disk\n  (root disk was virtio-scsi):\n\ntime fio --name=nvme-verify \\\n    --filename=/dev/nvme0n1 \\\n    --size=5G \\\n    --rw=randwrite \\\n    --bs=4k \\\n    --iodepth=16 \\\n    --numjobs=1 \\\n    --direct=0 \\\n    --ioengine=io_uring \\\n    --verify=crc32c \\\n    --verify_fatal=1\n\n- Windows Server 2022 VM (NVMe drive was a *root* disk) with opened browser\n  playing video.\n\nNo defects were found.\n\nGit tree:\nhttps://github.com/mihalicyn/qemu/commits/nvme-live-migration\n\nChangelog for version 6:\n- rebased on top of:\n  https://gitlab.com/peterx/qemu/-/tree/vmstate-array-null\n  (see also https://lore.kernel.org/all/20260401202844.673494-1-peterx@redhat.com)\n- addressed review comments from Stefan Hajnoczi:\n  - supported \"full CQ\" case by serializing NvmeRequest state\n  - added qtest for NVMe device migration with full CQ\n\nChangelog for version 5:\n- rebased on top of https://lore.kernel.org/all/20260304212303.667141-1-vsementsov@yandex-team.ru/\n  (as Peter has requested)\n\nChangelog for version 4:\n- vmstate dynamic array support reworked as suggested by Peter Xu\n  VMS_ARRAY_OF_POINTER_ALLOW_NULL flag was introduced\n  qtests were added\n- NVMe migration blockers were reworked as Klaus has requested earlier\n  Now, instead of having \"deny list\" approach, we have more strict pattern\n  of NVMe features filtering and it should be harded to break migration when\n  adding new NVMe features.\n\nChangelog for version 3:\n- rebased\n- simple functional test was added (in accordance with Klaus Jensen's review comment)\n  $ meson test 'func-x86_64-nvme_migration' --setup thorough -C build\n\nChangelog for version 2:\n- full support for AERs (in-flight requests and queued events too)\n\nKind regards,\nAlex\n\nAlexander Mikhalitsyn (8):\n  tests/functional/migration: add VM launch/configure hooks\n  hw/nvme: add migration blockers for non-supported cases\n  hw/nvme: split nvme_init_sq/nvme_init_cq into helpers\n  hw/nvme: set CQE.sq_id earlier in nvme_process_sq\n  hw/nvme: unmap req->sg earlier in nvme_enqueue_req_completion\n  hw/nvme: add basic live migration support\n  tests/functional/x86_64: add migration test for NVMe device\n  tests/qtest/nvme-test: add migration test with full CQ\n\n hw/nvme/ctrl.c                                | 992 +++++++++++++++++-\n hw/nvme/ns.c                                  | 160 +++\n hw/nvme/nvme.h                                |  12 +\n hw/nvme/trace-events                          |  10 +\n include/block/nvme.h                          |  12 +\n tests/functional/migration.py                 |  22 +-\n tests/functional/x86_64/meson.build           |   1 +\n .../functional/x86_64/test_nvme_migration.py  | 159 +++\n tests/qtest/nvme-test.c                       | 393 +++++++\n 9 files changed, 1725 insertions(+), 36 deletions(-)\n create mode 100755 tests/functional/x86_64/test_nvme_migration.py"
}