This series adds two features that together enable transparent NVMe disk
hot-swap simulation in QEMU, matching the behavior of physical NVMe
drives being pulled and reinserted in the same PCIe slot.
Problem:
Currently, hot-swapping an NVMe disk in QEMU requires removing the
entire NVMe controller via device_del, which causes the Linux guest to
assign a new controller number on re-add (e.g. nvme2 becomes nvme4).
This breaks storage software that tracks drives by device name.
Solution:
Patch 1 adds hotplug support for nvme-ns devices on the NvmeBus, with
proper Asynchronous Event Notification (AEN) so the guest kernel detects
namespace changes. This allows namespace-level hot-swap without removing
the NVMe controller.
Patch 2 adds a drive_insert HMP command that reconnects a host block
device file to an existing guest device after drive_del. This is the
counterpart to drive_del for non-removable devices where
blockdev-change-medium cannot be used.
The recommended hot-swap sequence is:
1. drive_del <drive-id> # disconnect backing store
2. drive_insert <device> <file> # reconnect backing store
3. pcie_aer_inject_error <port> SDN # trigger controller reset
After this sequence, the guest sees the same controller and namespace
names (e.g. /dev/nvme2n1 remains /dev/nvme2n1), and the NVMe driver
recovers transparently via the standard AER recovery path.
Tested with:
- Linux 6.1 guest on QEMU aarch64 with HVF (macOS)
- NVMe subsystem model with multipath disabled
- DirectPV and MinIO AIStor storage stack
mr-083 (2):
hw/nvme: add namespace hotplug support
block/monitor: add drive_insert HMP command
block/monitor/block-hmp-cmds.c | 59 +++++++++++++++++++++++
hmp-commands.hx | 18 +++++++
hw/nvme/ctrl.c | 85 ++++++++++++++++++++++++++++++++++
hw/nvme/ns.c | 1 +
hw/nvme/subsys.c | 2 +
include/block/block-hmp-cmds.h | 1 +
6 files changed, 166 insertions(+)
--
2.50.1 (Apple Git-155)