[libvirt] Add support for vhost-user-scsi-pci/vhost-user-blk-pci

Cole Robinson crobinso at redhat.com
Wed Oct 9 22:48:30 UTC 2019


Sorry for the late reply, and thanks Jano for pointing out elsewhere 
that this didn't receive a response.

On 8/12/19 5:56 AM, Li Feng wrote:
> Hi Guys,
> 
> And I want to add the vhost-user-scsi-pci/vhost-user-blk-pci support
> for libvirt.
> 
> The usage in qemu like this:
> 
> Vhost-SCSI
> -chardev socket,id=char0,path=/var/tmp/vhost.0
> -device vhost-user-scsi-pci,id=scsi0,chardev=char0
> Vhost-BLK
> -chardev socket,id=char1,path=/var/tmp/vhost.1
> -device vhost-user-blk-pci,id=blk0,chardev=char1
> 

Indeed that matches what I see for the qemu commits too:

https://git.qemu.org/?p=qemu.git;a=commit;h=00343e4b54b
https://git.qemu.org/?p=qemu.git;a=commit;h=f12c1ebddf7

> What type should I add for libvirt.
> Type1:
>      <hostdev mode='subsystem' type='vhost-user'>
>          <source protocol='vhost-user-scsi' path='/tmp/vhost-scsi.sock'></source>
>          <alias name="vhost-user-scsi-disk1"/>
>      </hostdev>
> 
> 
> Type2:
> 
>      <disk type='network' device='disk'>
>        <driver name='qemu' type='raw' cache='none' io='native'/>
>        <source protocol='vhost-user' path='/tmp/vhost-scsi.sock'>
>        </source>
>        <target dev='sdb' bus='vhost-user-scsi'/>
>        <boot order='3'/>
>        <alias name='scsi0-0-0-1'/>
>        <address type='drive' controller='0' bus='0' target='0' unit='1'/>
>      </disk>
> 
> 
>      <disk type='network' device='disk'>
>        <driver name='qemu' type='raw' cache='none' io='native'/>
>        <source protocol='vhost-user' path='/tmp/vhost-blk.sock'>
>        </source>
>        <target dev='vda' bus='vhost-user-blk'/>
>        <boot order='1'/>
>        <alias name='virtio-disk0'/>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x07'
> function='0x0'/>
>      </disk>
>

I think wiring this into <disk> makes more sense. <hostdev> is really an 
abstraction for assigning a (typically) physical host device to the VM, 
so it handles things like hiding a PCI device from the host, and passing 
that exact device to the VM.

In the vhost-user-scsi/blk case, the host device is just a special 
process running on the other side of a socket, and the device 
represented to the guest is a typical virtio device. So to me it makes 
more sense as a <disk> with a <source> that points at that socket.

target bus=virtio vs bus=scsi is already used to distinguish between 
virtio-blk and virtio-scsi, so I think we can keep that bit as is, with 
the <address type=drive|pci> to match. We just need to differentiate 
between plain virtio and vhost-user

network devices already have vhostuser support:

   <interface type='vhostuser'>
     <source type='unix' path='/tmp/vhost1.sock' mode='server|client'/>
     <model type='virtio'/>
   </interface>

Internally that <source> is a virDomainChrSourceDefPtr which is our 
internal representation of a chardev. So I think something akin to this 
is the way to go. It will likely require updating a LOT of places in the 
code that check disk type= field, probably most places that care about 
whether type=NETWORK or type=!NETWORK will need to be mirrored for the 
new type.

<disk type='vhostuser' device='disk'>
   <source type='unix' path='/path/to/vhost-user-blk.sock' mode='client'/>
   <target dev='vda' bus='virtio'/>
</disk>

<disk type='vhostuser' device='disk'>
   <source type='unix' path='/path/to/vhost-user-scsi.sock' mode='client'/>
   <target dev='sda' bus='scsi'/>
</disk>

- Cole




More information about the libvir-list mailing list