
Hi all, Host device passthrough is to directly assign host device to guest exclusively, so there is no virtualization overhead, and it improves guest performance greatly. It's useful if you have a server with lots of PCIe slots and cards. Changelog: This v12 patch improves the coding style. For example, using reflection instead of maintaining method map, using lxml.builder to generate XML strings. The v11 patch series improve disto compatibility and device filtering. Firstly, the patches adapt to Ubuntu 14.04, RHEL 6.5, RHEL 7, Fedora 20 and Fedora 19. It just relies on libvirt node-device API, kernel vfio framework and /sys/kernel/iommu_group. So any distribution providing these features should work. On old distributions like RHEL 6.5, they are shipped with 2.6.X kernel which do not support vfio and sysfs iommu group. We also try to be compatible, but as far as we tested, the PCI passthrough feature using the traditional pci-stub + kvm approach is buggy and not mature. So in this patch series, the back-end provides a capability in /config/capabilities for the front-end to check, and then freezes PCI passthrough web UI in this case. Didn't test on SuSe, just because the author could not find a physical SuSe server. The patches should work on SuSe as long as it provides the dependencies. Secondly, there is 2 changes in PCI device filtering. Previously, we only allowed to assign the "leaf" devices to guest. For example, instead of assigning a USB controller, we assign the connected USB device. We also made a PCI device whitelist according to the class code. After some tests, we find that it's hardly useful if we only allow "leaf" device, because in many cases the user wants to assign a parent device. For example, the user may want to assign an HBA card to guest, while there are many children LUNs under this card. The PCI device code is also not a good way for checking if a device is suitable to be passed through. There are too many vendors and devices, you'll always find some "good" devices are out of the whitelist, and if we grant the relared class code, it'll introduce "bad" devices. So in this patch we just filter out video cards and PCI bridges. They are not for passthrough absolutely. We also allow to passthrough a parent device. The back-end provides API to check the affected devices if you passthrough a particular one. The affected devices are the devices in the same iommu group and their children devices. As regard to the front-end, we only implemented PCI device passthrough, PCI devices are the mostly useful and interesting devices to passthrough. The back-end actually supports passing through LUNs and USB devices. To test the patches, firstly reboot your host os, enable vt-d in BIOS. Before loading Linux kernel, append "intel_iommu=on" to kernel arguments. If you want to make it persistent, edit "grub.conf" and append it. Then just apply the patch, start Kimchi daemon, edit a shutdown guest, you'll see "Host PCI Device" tab. In the listing, select "To Add", then click "+" besides one of the device. You'll find PCI devices in the same group are also added. Then close the dialogue and start the guest. In guest OS, "lspci" can show you the passthrough devices. In future, we plan to add more helpful information to assist user. For example, when the user selects an NIC card, the front-end shows the configured IP address. When the user selects an HBA card, the front-end shows the related block devices such as sda sdb ... So the user can avoid assigning a device in use by the host. Yu Xin Huo (1): Host device passthrough (Front-end): Add PCI Devices to VM Zhou Zheng Sheng (5): Host device passthrough: List all types of host devices Host device passthrough: List eligible device to passthrough Host device passthrough: Directly assign and dissmis host device from VM Host device passthrough: List VMs that are holding a host device Host device passthrough: Add unit tests and documents docs/API.md | 66 ++++++- src/kimchi/API.json | 38 ++++ src/kimchi/control/host.py | 7 + src/kimchi/control/vm/hostdevs.py | 43 +++++ src/kimchi/featuretests.py | 10 +- src/kimchi/i18n.py | 13 ++ src/kimchi/mockmodel.py | 94 +++++++++- src/kimchi/model/config.py | 6 +- src/kimchi/model/host.py | 48 +++-- src/kimchi/model/hostdev.py | 323 +++++++++++++++++++++++++++++++++ src/kimchi/model/libvirtstoragepool.py | 18 +- src/kimchi/model/vmhostdevs.py | 314 ++++++++++++++++++++++++++++++++ src/kimchi/rollbackcontext.py | 3 + src/kimchi/xmlutils.py | 24 +++ tests/test_model.py | 31 ++++ tests/test_rest.py | 12 +- tests/test_storagepool.py | 7 +- ui/css/theme-default/guest-edit.css | 86 ++++++++- ui/js/src/kimchi.api.js | 55 ++++++ ui/js/src/kimchi.guest_edit_main.js | 81 +++++++++ ui/pages/guest-edit.html.tmpl | 28 +++ 21 files changed, 1251 insertions(+), 56 deletions(-) create mode 100644 src/kimchi/control/vm/hostdevs.py create mode 100644 src/kimchi/model/hostdev.py create mode 100644 src/kimchi/model/vmhostdevs.py -- 1.9.3