xref: /cloud-hypervisor/docs/vfio-user.md (revision ef1ac5c6702a206ac70c335c5b60fad87191cb6a)
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