1d3b32b3dSRob Bradford# Cloud Hypervisor VFIO-user HOWTO 2d3b32b3dSRob Bradford 3d3b32b3dSRob BradfordVFIO-user is an *experimental* protocol for allowing devices to be implemented in another process and communicate over a socket; ie.e VFIO-user is to VFIO as virtio is to vhost-user. 4d3b32b3dSRob Bradford 5d3b32b3dSRob BradfordThe protocol is documented here: https://github.com/nutanix/libvfio-user/blob/master/docs/vfio-user.rst 6d3b32b3dSRob Bradford 7e7893b9aSRob BradfordThe Cloud Hypervisor support for such devices is *experimental*. Not all Cloud Hypervisor functionality is supported in particular: virtio-mem and iommu are not supported. 8d3b32b3dSRob Bradford 9d3b32b3dSRob Bradford## Usage 10d3b32b3dSRob Bradford 11e7893b9aSRob BradfordThe `--user-device socket=<path>` parameter is used to create a vfio-user device when creating the VM specifying the socket to connect to. The device can also be hotplugged with `ch-remote add-user-device socket=<path>`. 12d3b32b3dSRob Bradford 13d3b32b3dSRob Bradford## Example (GPIO device) 14d3b32b3dSRob Bradford 15d3b32b3dSRob BradfordThere is a simple GPIO device included in the libvfio-user repository: https://github.com/nutanix/libvfio-user#gpio 16d3b32b3dSRob Bradford 17d3b32b3dSRob BradfordRun the example from the libvfio-user repository: 18d3b32b3dSRob Bradford 19d3b32b3dSRob Bradford```sh 20d3b32b3dSRob Bradfordrm /tmp/vfio-user.sock 21d3b32b3dSRob Bradford./build/dbg/samples/gpio-pci-idio-16 -v /tmp/vfio-user.sock & 22d3b32b3dSRob Bradford``` 23d3b32b3dSRob Bradford 24d3b32b3dSRob BradfordStart Cloud Hypervisor: 25d3b32b3dSRob Bradford 26d3b32b3dSRob Bradford```sh 27d3b32b3dSRob Bradfordtarget/debug/cloud-hypervisor \ 28d3b32b3dSRob Bradford --memory size=1G,shared=on \ 29d3b32b3dSRob Bradford --disk path=~/images/focal-server-cloudimg-amd64.raw \ 30d3b32b3dSRob Bradford --kernel ~/src/linux/vmlinux \ 31d3b32b3dSRob Bradford --cmdline "root=/dev/vda1 console=hvc0" \ 32d3b32b3dSRob Bradford --user-device socket=/tmp/vfio-user.sock 33d3b32b3dSRob Bradford``` 34d3b32b3dSRob Bradford 35d3b32b3dSRob BradfordInside the VM you can test the device with: 36d3b32b3dSRob Bradford 37d3b32b3dSRob Bradford```sh 38d3b32b3dSRob Bradfordcat /sys/class/gpio/gpiochip480/base > /sys/class/gpio/export 39d3b32b3dSRob Bradfordfor ((i=0;i<12;i++)); do cat /sys/class/gpio/OUT0/value; done 40d3b32b3dSRob Bradford``` 41d3b32b3dSRob Bradford 42d3b32b3dSRob Bradford## Example (NVMe device) 43d3b32b3dSRob Bradford 44d3b32b3dSRob BradfordUse SPDK: https://github.com/spdk/spdk 45d3b32b3dSRob Bradford 46d3b32b3dSRob BradfordCompile with `./configure --with-vfio-user` 47d3b32b3dSRob Bradford 48*ef1ac5c6SZiye YangCreate an NVMe controller listening on a vfio-user socket with a simple AIO block device in spdk. 49*ef1ac5c6SZiye YangMore details of configuring SPDK bdev can be viewed in [SPDK bdev](https://spdk.io/doc/bdev.html). 50*ef1ac5c6SZiye YangMore details of setting SPDK NVMe-oF target can be viewed in [SDPK NVMe-oF tgt](https://spdk.io/doc/nvmf.html). 51d3b32b3dSRob Bradford 52d3b32b3dSRob Bradford```sh 53d3b32b3dSRob Bradfordsudo scripts/setup.sh 54d3b32b3dSRob Bradfordrm ~/images/test-disk.raw 55d3b32b3dSRob Bradfordtruncate ~/images/test-disk.raw -s 128M 56b075aadaSRob Bradfordmkfs.ext4 ~/images/test-disk.raw 57d3b32b3dSRob Bradfordsudo killall ./build/bin/nvmf_tgt 58d3b32b3dSRob Bradfordsudo ./build/bin/nvmf_tgt -i 0 -e 0xFFFF -m 0x1 & 59d3b32b3dSRob Bradfordsleep 2 60d3b32b3dSRob Bradfordsudo ./scripts/rpc.py nvmf_create_transport -t VFIOUSER 61d3b32b3dSRob Bradfordsudo rm -rf /tmp/nvme-vfio-user 62d3b32b3dSRob Bradfordsudo mkdir -p /tmp/nvme-vfio-user 63ea5a0503SRob Bradfordsudo ./scripts/rpc.py bdev_aio_create ~/images/test-disk.raw test 512 64d3b32b3dSRob Bradfordsudo ./scripts/rpc.py nvmf_create_subsystem nqn.2019-07.io.spdk:cnode -a -s test 65d3b32b3dSRob Bradfordsudo ./scripts/rpc.py nvmf_subsystem_add_ns nqn.2019-07.io.spdk:cnode test 66d3b32b3dSRob Bradfordsudo ./scripts/rpc.py nvmf_subsystem_add_listener nqn.2019-07.io.spdk:cnode -t VFIOUSER -a /tmp/nvme-vfio-user -s 0 67d3b32b3dSRob Bradfordsudo chown $USER.$USER -R /tmp/nvme-vfio-user 68d3b32b3dSRob Bradford``` 69d3b32b3dSRob Bradford 70d3b32b3dSRob BradfordStart Cloud Hypervisor: 71d3b32b3dSRob Bradford 72d3b32b3dSRob Bradford```sh 73d3b32b3dSRob Bradfordtarget/debug/cloud-hypervisor \ 74ea5a0503SRob Bradford --memory size=1G,shared=on \ 75d3b32b3dSRob Bradford --disk path=~/images/focal-server-cloudimg-amd64.raw \ 76d3b32b3dSRob Bradford --kernel ~/src/linux/vmlinux \ 77d3b32b3dSRob Bradford --cmdline "root=/dev/vda1 console=hvc0" \ 78d3b32b3dSRob Bradford --user-device socket=/tmp/nvme-vfio-user/cntrl 79d3b32b3dSRob Bradford``` 80