diff options
-rwxr-xr-x | kvm-wrapper.sh | 42 |
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 |