Yeah it seems this was discussed plenty of times but not accepted that (actually in any) way. I tried around a bit and discussed with more people, but didn't find a good way to hard control it. Note: on IRC it also came up that a hot-attach fails with the message in comment #23. But on a guest reboot it would work. Base on that the theory for now is that by default not init modern/legacy correctly. The hot add will add a modern-only device that fails to initialize. On a reboot this will be re-handshaked between guest/host and it works. (not sure just a thought - could even be vice versa) @admcleod - does that also imply that if the guest has the guest in it's xml right away, that it works on a start of the domain immediately as well? @admcleod - that test (direct start with disk) would also help us to show the cmdline with the rbd device added to check if they would today use modern or old syntax modern should be: -drive driver=rbd,filename=%s, ... ,password-secret legacy should be: -drive file=%s, ... ,file.password-secret Well the hot add will use commands instead of cmdline anyway. virtip-pci is generic, but you never know, so I first checked if forcing modern exist as cmdline arg as expected. $ qemu-system-aarch64 -machine virt-2.10,accel=kvm,gic-version=3 -device virtio-blk,help 2>&1 | egrep 'modern|legacy' virtio-blk-pci.disable-modern=bool virtio-blk-pci.disable-legacy=OnOffAuto (on/off/auto) virtio-blk-pci.modern-pio-notify=bool (on/off) In general we should have (see qemu include/hw/compat.h) <=2.6 disable-modern=on,disable-legacy=off (old) >2.6 disable-modern=off,disable-legacy=on (new) So you should be by default using modern - without forcing anything. I went to check the runtime info, the following gives some info, please feel free to look around for more differences in there: $ virsh qemu-monitor-command --hmp 'info qtree' | grep -A 10 virtio-blk-pci I already saw that on qemu2.10 x86 vs aarch64 there are differences (with basic discs without rbd): arm: disable-legacy = "on", disable-modern = false x86: disable-legacy = "off", disable-modern = false So at least in my case x86 seems effectively to provide both, but arm ONLY the new one. There might be reasons for that (bad pre 1.0 support on arm or so), so that is not an issue but interesting. Note: I was trying to derive a fake-rbd from your device xml, but that hung my host for a while - so maybe you should test the above as you have it set up. @admcleod - for your described lifecycle it would be interesting to query those attributes above. 1 after fresh guest start 2 after attaching the rbd device (that fails) 3 after reboot with rbd device attached (device now works) 4 after fresh guest start with rbd device = all of the above comparing the same stack on x86 vs aarch64 Pick all of the devices output in qtree, and "info block" on it as well. This list we can then compare in Y axis (1-4) and between arches (arm vs x86 on each step). Hopefully that would lead to an insight that helps. Finally by more discussions I actually found a way to control disable-modern/legacy via libvirt xml. You can see an example to get to "both enabled" that works on my arm box at: http://paste.ubuntu.com/26534642/ @admcleod - with the config above you could also try if tweaking on that would fixup your case as a debug-workaround.