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

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 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> Could anyone give some suggestions? Thanks, Feng Li -- The SmartX email address is only for business purpose. Any sent message that is not related to the business is not authorized or permitted by SmartX. 本邮箱为北京志凌海纳科技有限公司(SmartX)工作邮箱. 如本邮箱发出的邮件与工作无关,该邮件未得到本公司任何的明示或默示的授权.

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
participants (2)
-
Cole Robinson
-
Li Feng