summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xkvm-wrapper.sh42
1 files changed, 31 insertions, 11 deletions
diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh
index 758300d..db5e002 100755
--- a/kvm-wrapper.sh
+++ b/kvm-wrapper.sh
@@ -325,28 +325,41 @@ function lvm_umount_disk()
set +e
}
-# PCI assign helper (pci-stub)
-function pci_stubify ()
+# PCI rebind helper
+function pci_bind_driver ()
{
- local PCIDOMAIN=$1
+ local BIND_DRIVER_NAME=$1
+ local PCIDOMAIN=$2
[[ "$(echo "$PCIDOMAIN" | tr -dc ":" | wc -c)" == "1" ]] && PCIDOMAIN="0000:$PCIDOMAIN"
- local PCI_STUB_DRIVER="/sys/bus/pci/drivers/pci-stub"
+ local PCI_BIND_DRIVER="/sys/bus/pci/drivers/$BIND_DRIVER_NAME"
- # In case pci-stub is not loaded
- test_file_rw "$PCI_STUB_DRIVER/new_id" || modprobe pci-stub
- test_file_rw "$PCI_STUB_DRIVER/new_id" || fail_exit "pci-stub driver not available"
+ # In case driver is not loaded
+ test_file_rw "$PCI_BIND_DRIVER/new_id" || modprobe "$BIND_DRIVER_NAME"
+ test_file_rw "$PCI_BIND_DRIVER/new_id" || fail_exit "$BIND_DRIVER_NAME driver not available"
# Retrieve vendor/device id
local PCIVENDOR="$(cat "/sys/bus/pci/devices/$PCIDOMAIN/vendor" |sed 's/^0x//')"
PCIVENDOR+=" $(cat "/sys/bus/pci/devices/$PCIDOMAIN/device" |sed 's/^0x//')"
- echo "Unbinding pci device ($PCIDOMAIN [$PCIVENDOR]) and binding to pci-stub"
+ echo "Unbinding pci device ($PCIDOMAIN [$PCIVENDOR]) and binding to $BIND_DRIVER_NAME"
# Add id, unbind, and bind
- echo "$PCIVENDOR" > "$PCI_STUB_DRIVER/new_id"
+ echo "$PCIVENDOR" > "$PCI_BIND_DRIVER/new_id"
echo "$PCIDOMAIN" > "/sys/bus/pci/devices/$PCIDOMAIN/driver/unbind"
- echo "$PCIDOMAIN" > "$PCI_STUB_DRIVER/bind"
+ echo "$PCIDOMAIN" > "$PCI_BIND_DRIVER/bind"
+}
+
+# PCI assign helper (pci-stub)
+function pci_stubify ()
+{
+ pci_bind_driver "pci-stub" "$1"
+}
+
+# PCI vfio helper (vfio-pci)
+function pci_vfiofy ()
+{
+ pci_bind_driver "vfio-pci" "$1"
}
# Change perms. Meant to run forked.
@@ -535,12 +548,19 @@ function kvm_start_vm ()
KVM_PCIASSIGN+="-device pci-assign,id=${KVM_PCIASSIGN_ID[$i]:-pciassign${i}},host=${KVM_PCIASSIGN_DOMAIN[$i]} "
done
+ # vfio assignement
+ local KVM_VFIO=""
+ for i in ${!KVM_VFIO_DOMAIN[@]}; do
+ pci_vfiofy "${KVM_VFIO_DOMAIN[$i]}"
+ KVM_VFIO+="-device vfio-pci,id=${KVM_VFIO_ID[$i]:-vfio${i}},host=${KVM_VFIO_DOMAIN[$i]} "
+ done
+
# Monitor/serial devices
KVM_MONITORDEV="-monitor unix:$MONITOR_FILE,server,nowait"
KVM_SERIALDEV="-serial unix:$SERIAL_FILE,server,nowait"
# Build kvm exec string
- local EXEC_STRING="$KVM_BIN -name $VM_NAME,process=\"kvm-$VM_NAME\" -m $KVM_MEM -smp $KVM_CPU_NUM $KVM_PCIASSIGN $KVM_NET $KVM_DRIVES $KVM_BOOTDEVICE $KVM_KEYMAP $KVM_OUTPUT $LINUXBOOT $KVM_MONITORDEV $KVM_SERIALDEV -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS"
+ local EXEC_STRING="$KVM_BIN -name $VM_NAME,process=\"kvm-$VM_NAME\" -m $KVM_MEM -smp $KVM_CPU_NUM $KVM_PCIASSIGN $KVM_VFIO $KVM_NET $KVM_DRIVES $KVM_BOOTDEVICE $KVM_KEYMAP $KVM_OUTPUT $LINUXBOOT $KVM_MONITORDEV $KVM_SERIALDEV -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS"
# More sanity checks: VM running, monitor socket existing, etc.
if [[ -z "$FORCE" ]]; then