Libvirt NVME support

Peter Krempa pkrempa at redhat.com
Mon Nov 23 14:36:42 UTC 2020


On Mon, Nov 23, 2020 at 15:32:20 +0100, Michal Privoznik wrote:
> On 11/23/20 3:03 PM, Daniel P. Berrangé wrote:
> > On Wed, Nov 18, 2020 at 11:24:30AM +0100, Peter Krempa wrote:
> > > On Wed, Nov 18, 2020 at 09:57:14 +0000, Thanos Makatos wrote:
> > > > > As a separate question, is there any performance benefit of emulating a
> > > > > NVMe controller compared to e.g. virtio-scsi?
> > > > 
> > > > We haven't measured that yet; I would expect it to be slight faster and/or more
> > > > CPU efficient but wouldn't be surprised if it isn't. The main benefit of using
> > > > NVMe is that we don't have to install VirtIO drivers in the guest.
> > > 
> > > Okay, I'm not sold on the drivers bit but that is definitely not a
> > > problem in regards of adding support for emulating NVME controllers to
> > > libvirt.
> > > 
> > > 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'/>
> > >        <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.
> > 
> > FWIW, I think that our overloeading of type=drive for FDC, IDE, and SCSI
> > was a mistake in retrospect. We should have had type=fdc, type=ide, type=scsi,
> > since each uses a different subset of the attributes.
> > 
> > Lets not continue this mistake with NVME - create a type=nvme address
> > type.
> 
> Don't NVMes live on a PCI(e) bus? Can't we just threat NVMes as PCI devices?
> Or are we targeting sata too? Bcause we also have that type of address.

No, the NVMe controller lives on PCIe. Here we are trying to emulate a
NVMe controller (as <contoller> if you look elsewhere in the other
subthread. The <disk> element here maps to individual emulated
namespaces for the emulated NVMe controller.

If we'd try to map one <disk> per PCIe device, you'd prevent us from
emulating multiple namespaces.




More information about the libvir-list mailing list