
As a starting point a trivial way to model this in the XML will be:
<controller type='nvme' index='1' model='nvme'>
And then add the storage into it as:
<disk type='file' device='disk'> <source dev='/Host/QEMUGuest1.qcow2'/> <target dev='sda' bus='nvme'/>
'target dev' is how the device appears in the guest, right? It should be something like 'nvme0n1'. I'm not sure though this is something that we can put here anyway, I think the guest driver can number controllers arbitrarily. Maybe we should specify something like BDF? Or is this something QEMU will have to figure out how to do?
<address type='drive' controller='1' bus='0' target='0' unit='0'/> </disk>
<disk type='file' device='disk'> <source dev='/Host/QEMUGuest2.qcow2'/> <target dev='sdb' bus='nvme'/> <address type='drive' controller='1' bus='0' target='0' unit='1'/> </disk>
The 'drive' address here maps the disk to the controller. This example uses unit= as the way to specify the namespace ID. Both 'bus' and 'target' must be 0.
You can theoretically also add your own address type if 'drive' doesn't look right.
This model will have problems with hotplug/unplug if the NVMe spec doesn't actually allow hotplug of a single namespace into a controller as libvirt's hotplug APIs only deal with one element at time.
The NVMe spec does allow hotplug/unplug of namespaces, so libvirt should be fine supporting this?