
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