{"id":2221318,"url":"http://patchwork.ozlabs.org/api/1.0/covers/2221318/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/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":""},"msgid":"<20260409060155.94704-1-matthieu@min.io>","date":"2026-04-09T06:01:52","name":"[0/2] NVMe namespace hotplug and drive reconnection support","submitter":{"id":93098,"url":"http://patchwork.ozlabs.org/api/1.0/people/93098/?format=json","name":"mr-083","email":"matthieu@minio.io"},"series":[{"id":499253,"url":"http://patchwork.ozlabs.org/api/1.0/series/499253/?format=json","date":"2026-04-09T06:01:52","name":"NVMe namespace hotplug and drive reconnection support","version":1,"mbox":"http://patchwork.ozlabs.org/series/499253/mbox/"}],"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 secure) header.d=minio.io header.i=@minio.io header.a=rsa-sha256\n header.s=minio header.b=XuqLuOoN;\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 (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 4frtCJ4GmQz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 18:19:54 +1000 (AEST)","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 1wAkbe-0006LU-7c; Thu, 09 Apr 2026 04:19:18 -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 <matthieu@minio.io>) id 1wAiSe-0005lq-Bi\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 02:01:52 -0400","from mail-wm1-x330.google.com ([2a00:1450:4864:20::330])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <matthieu@minio.io>) id 1wAiSc-0006pI-Lo\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 02:01:52 -0400","by mail-wm1-x330.google.com with SMTP id\n 5b1f17b1804b1-488a9033b2cso5267135e9.2\n for <qemu-devel@nongnu.org>; Wed, 08 Apr 2026 23:01:49 -0700 (PDT)","from localhost\n (2a01cb00141148004df9ec80d3fa1cac.ipv6.abo.wanadoo.fr.\n [2a01:cb00:1411:4800:4df9:ec80:d3fa:1cac])\n by smtp.gmail.com with UTF8SMTPSA id\n 5b1f17b1804b1-488cfa75ae2sm48909875e9.14.2026.04.08.23.01.47\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Wed, 08 Apr 2026 23:01:47 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=minio.io; s=minio; t=1775714508; x=1776319308; 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=BQIDX/WNV5Pzl0aC//tD4ssejDFf4jBgsYoG1vBrsEc=;\n b=XuqLuOoNIKtp3/yxPUHMcHk2xeBNzntD3Giza3ASjeeUZRVWxHobogqiHG9OiljI+W\n HD48iOks+JCINi1ly1yFmmA9znLsrRTz6gnAgt4k+jhE376iBtgKJe8y2zPn9x73S98L\n CFtevKlUdlKrKhMLjin8sSQiJ46R4FQmFhz/tBgSjgm6HzMbIjQILUo8XHUG2wP6alnV\n /NUJLyoRejGjh7ismiw1t/wCmhyOOc7K0R6zRxRkwLQs/TzGB4ZcWDjLXLZXG7t/iWQ8\n RiFIotC7IXqYu0q9u6H5b3DJ9Oe5pxBXQrpTfMVvosmC0wdljqoKBeOXKsQH7sTlb316\n hkhw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775714508; x=1776319308;\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=BQIDX/WNV5Pzl0aC//tD4ssejDFf4jBgsYoG1vBrsEc=;\n b=paQI95mXhoZwzIwxkLjocc8+G2T4PjOt5SPH3y6xRVY+61I5o4a4yow17FY6HegoeL\n N9aTmFkoJpSUonNiq1A9ElHvjzXDDE60gV8g2OyzqlQJu/n7tIF98lUnoKGEuMSrk1N8\n R24rBDlzjrlQD3j8/ErVy4NRalB5eil2FTrJ80cG5iHjJvddh0w/979xc45RntlyotrB\n 63J3FBN8CpmSSrzs/A2Dsk/juf/0ooPAdNdq6zB82IA8j7e4ThoP6FLSGijRp3c0yRg4\n q8SAv21nHozlQ3OBaQKBa/OZTfb76EyNcXQb+8ygVK6QsSiL+DUTpLVvDTiHFC3WtGjz\n qvsg==","X-Gm-Message-State":"AOJu0Yw8guG6YEcxZHwrN59cKrBaTnMHJH0qYqBMx8Mr1A76zuAnAzya\n 7dTKkihZla9bemEWWm0V6nk2QV0JptkV/rXlxMd9lwpKyXx7zLHNY/seI1I12kVu5NGf0TifRdx\n k6QyNMRRNO7n/rd4Xj/5EF2mzSwsr6sleCUzULRCgJpuCDTI9uC/InFWg+Q5hxAxeIzNbhb8FLG\n qAOb4z6sDjZLONzEiFHmFhZ24N/oGleaqyvSNirqM=","X-Gm-Gg":"AeBDieuTXm7E8ejVKWhHrTgcsLOY5nQi9oH75k7FBlhnzLxPJ7PNDUqs9rYkUpgIvVK\n m2XACMqxvyYVIk6XgiWml9KvzAPijOZUeLGpNpwVjbrd7rT4et/uvmO5LWTt4JjzHXEEvr8y98J\n J9QIKzLBBC1kcylw9LACO+IUWz1BmJ9GqEdqJA/hG0R8hya+X+et+kXcGqxH/8PmgTCvU+vomxl\n lAxrz6lZtH+arH/7RaCuKHKcHLyh7Vc5aVUDAqB5RM3S4BsXbEBDXjhhqe+BNyCzsWi5cEyj4YV\n AGAjFwaPd7oPRyizbOp7gWxMSoCKcEfEiaI0FDAuiybJt1adcwfAdxBSiKDMyzzN3dInP/EOb3Q\n 4KXSQsgtYAVGC9EFdxo+4lO2UMFfROUIe+LgCfVC0a1Vba36YjVXBGpLOZjguK+6JKf2aQVaIe1\n X3xJX4p3N/BTrcsJ3ox0mZId0xzF6hOcaqcItpEUHnWRiopCnYSvsqQAGCbesObMnr4IcK+KpvV\n +zHxRmPhg2M4JM4XBtYm8WpqRh9dhReBpz+MEwGvGwXK8OnjXyupXKG2xGWFUL1uJdlw2U/","X-Received":"by 2002:a05:600c:358b:b0:485:4135:5c92 with SMTP id\n 5b1f17b1804b1-488995cb858mr393204295e9.0.1775714508006;\n Wed, 08 Apr 2026 23:01:48 -0700 (PDT)","From":"mr-083 <matthieu@minio.io>","X-Google-Original-From":"mr-083 <matthieu@min.io>","To":"qemu-devel@nongnu.org,\n\tqemu-block@nongnu.org","Cc":"its@irrelevant.dk, kbusch@kernel.org, stefanha@redhat.com,\n mr-083 <matthieu@min.io>","Subject":"[PATCH 0/2] NVMe namespace hotplug and drive reconnection support","Date":"Thu,  9 Apr 2026 08:01:52 +0200","Message-ID":"<20260409060155.94704-1-matthieu@min.io>","X-Mailer":"git-send-email 2.53.0","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2a00:1450:4864:20::330;\n envelope-from=matthieu@minio.io; helo=mail-wm1-x330.google.com","X-Spam_score_int":"-10","X-Spam_score":"-1.1","X-Spam_bar":"-","X-Spam_report":"(-1.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 HK_NAME_MR_MRS=0.998,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=no autolearn_force=no","X-Spam_action":"no action","X-Mailman-Approved-At":"Thu, 09 Apr 2026 04:19:17 -0400","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":"This series adds two features that together enable transparent NVMe disk\nhot-swap simulation in QEMU, matching the behavior of physical NVMe\ndrives being pulled and reinserted in the same PCIe slot.\n\nProblem:\nCurrently, hot-swapping an NVMe disk in QEMU requires removing the\nentire NVMe controller via device_del, which causes the Linux guest to\nassign a new controller number on re-add (e.g. nvme2 becomes nvme4).\nThis breaks storage software that tracks drives by device name.\n\nSolution:\nPatch 1 adds hotplug support for nvme-ns devices on the NvmeBus, with\nproper Asynchronous Event Notification (AEN) so the guest kernel detects\nnamespace changes. This allows namespace-level hot-swap without removing\nthe NVMe controller.\n\nPatch 2 adds a drive_insert HMP command that reconnects a host block\ndevice file to an existing guest device after drive_del. This is the\ncounterpart to drive_del for non-removable devices where\nblockdev-change-medium cannot be used.\n\nThe recommended hot-swap sequence is:\n  1. drive_del <drive-id>          # disconnect backing store\n  2. drive_insert <device> <file>  # reconnect backing store\n  3. pcie_aer_inject_error <port> SDN  # trigger controller reset\n\nAfter this sequence, the guest sees the same controller and namespace\nnames (e.g. /dev/nvme2n1 remains /dev/nvme2n1), and the NVMe driver\nrecovers transparently via the standard AER recovery path.\n\nTested with:\n- Linux 6.1 guest on QEMU aarch64 with HVF (macOS)\n- NVMe subsystem model with multipath disabled\n- DirectPV and MinIO AIStor storage stack\n\nmr-083 (2):\n  hw/nvme: add namespace hotplug support\n  block/monitor: add drive_insert HMP command\n\n block/monitor/block-hmp-cmds.c | 59 +++++++++++++++++++++++\n hmp-commands.hx                | 18 +++++++\n hw/nvme/ctrl.c                 | 85 ++++++++++++++++++++++++++++++++++\n hw/nvme/ns.c                   |  1 +\n hw/nvme/subsys.c               |  2 +\n include/block/block-hmp-cmds.h |  1 +\n 6 files changed, 166 insertions(+)\n\n--\n2.50.1 (Apple Git-155)"}