diff --git a/hooks/vfio-startup.sh b/hooks/vfio-startup.sh index 0a3585b..9d40d1b 100755 --- a/hooks/vfio-startup.sh +++ b/hooks/vfio-startup.sh @@ -8,46 +8,42 @@ short_delay=1 echo "Beginning of startup!" function stop_display_manager_if_running { - if systemctl is-active --quiet $1 ; then - echo $1 >> /tmp/vfio-store-display-manager - systemctl stop $1 + # Stop dm using systemd + if command -v systemctl; then + if systemctl is-active --quiet "$1.service" ; then + echo $1 >> /tmp/vfio-store-display-manager + systemctl stop "$1.service" + fi + + while systemctl is-active --quiet "$1.service" ; do + sleep "${short_delay}" + done + + return fi - while systemctl is-active --quiet $1 ; do - sleep "${short_delay}" - done -} - -function unload_module_if_loaded { - if lsmod | grep $1 &> /dev/null ; then - modprobe -r $1 - echo $1 >> /tmp/vfio-loaded-gpu-modules + # Stop dm using runit + if command -v sv; then + if sv status $1 ; then + echo $1 >> /tmp/vfio-store-display-manager + sv stop $1 + fi fi - while lsmod | grep $1 &> /dev/null ; do - sleep 1 - done } -function get_virsh_id { - python -c "print('pci_0000_'+'$1'.split(':')[0] + '_' + '$1'.split(':')[1].split('.')[0] + '_' + '$1'.split(':')[1].split('.')[1])" -} - -function get_pci_id_from_device_id { - lspci -nn | grep $1 | awk '{print $1}' -} # Stop currently running display manager if test -e "/tmp/vfio-store-display-manager" ; then rm -f /tmp/vfio-store-display-manager fi -stop_display_manager_if_running sddm.service -stop_display_manager_if_running gdm.service -stop_display_manager_if_running lightdm.service -stop_display_manager_if_running lxdm.service -stop_display_manager_if_running xdm.service -stop_display_manager_if_running mdm.service -stop_display_manager_if_running display-manager.service +stop_display_manager_if_running sddm +stop_display_manager_if_running gdm +stop_display_manager_if_running lightdm +stop_display_manager_if_running lxdm +stop_display_manager_if_running xdm +stop_display_manager_if_running mdm +stop_display_manager_if_running display-manager # Unbind VTconsoles if currently bound (adapted from https://www.kernel.org/doc/Documentation/fb/fbcon.txt) if test -e "/tmp/vfio-bound-consoles" ; then @@ -65,53 +61,14 @@ do fi done -# According to kernel documentation (https://www.kernel.org/doc/Documentation/fb/fbcon.txt), -# specifically unbinding efi-framebuffer is not necessary after all consoles -# are unbound (and often times harmful in my experience), so it was omitted here -# I leave it here for reference in case anyone needs it. - -#Unbind EFI-Framebuffer if currently bound -# if test -e "/sys/bus/platform/drivers/efi-framebuffer/unbind" ; then -# echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind -# else -# echo "Could not find framebuffer to unload!" - - -sleep "${long_delay}" - -# Unload loaded GPU drivers -if test -e "/tmp/vfio-loaded-gpu-modules" ; then - rm -f /tmp/vfio-loaded-gpu-modules +# Unbind EFI-Framebuffer +if test -e "/tmp/vfio-is-nvidia" ; then + rm -f /tmp/vfio-is-nvidia fi -unload_module_if_loaded amdgpu-pro -unload_module_if_loaded amdgpu -unload_module_if_loaded nvidia_drm -unload_module_if_loaded nvidia_modeset -unload_module_if_loaded nvidia_uvm -unload_module_if_loaded nvidia -unload_module_if_loaded ipmi_devintf -unload_module_if_loaded nouveau -unload_module_if_loaded i915 - -# Unbind the GPU from display driver -if test -e "/tmp/vfio-virsh-ids" ; then - rm -f /tmp/vfio-virsh-ids +if lsmod | grep "nvidia" &> /dev/null ; then + echo "true" >> /tmp/vfio-is-nvidia + echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind fi -gpu_device_id=$(modprobe -c vfio-pci | grep 'options vfio_pci ids' | cut -d '=' -f2 | cut -d ',' -f 1) -gpu_audio_device_id=$(modprobe -c vfio-pci | grep 'options vfio_pci ids' | cut -d '=' -f2 | cut -d ',' -f 2) -gpu_pci_id=$(get_pci_id_from_device_id ${gpu_device_id}) -gpu_audio_pci_id=$(get_pci_id_from_device_id ${gpu_audio_device_id}) -virsh_gpu_id=$(get_virsh_id ${gpu_pci_id}) -virsh_gpu_audio_id=$(get_virsh_id ${gpu_audio_pci_id}) -echo ${virsh_gpu_audio_id} >> /tmp/vfio-virsh-ids -echo ${virsh_gpu_id} >> /tmp/vfio-virsh-ids - -virsh nodedev-detach "${virsh_gpu_id}" -virsh nodedev-detach "${virsh_gpu_audio_id}" - -# Load VFIO kernel module -modprobe vfio-pci - echo "End of startup!" diff --git a/hooks/vfio-teardown.sh b/hooks/vfio-teardown.sh index 9aac128..2bcdb7d 100755 --- a/hooks/vfio-teardown.sh +++ b/hooks/vfio-teardown.sh @@ -3,15 +3,16 @@ set -x echo "Beginning of teardown!" -# Unload VFIO-PCI Kernel Driver -modprobe -r vfio-pci -modprobe -r vfio_iommu_type1 -modprobe -r vfio - -# Re-Bind GPU to AMD Driver -input="/tmp/vfio-virsh-ids" -while read virshId; do - virsh nodedev-reattach "$virshId" +# Restart Display Manager +input="/tmp/vfio-store-display-manager" +while read displayManager; do + if command -v systemctl; then + systemctl start "$displayManager.service" + else + if command -v sv; then + sv start $displayManager + fi + fi done < "$input" # Rebind VT consoles (adapted from https://www.kernel.org/doc/Documentation/fb/fbcon.txt) @@ -26,33 +27,9 @@ while read consoleNumber; do fi done < "$input" -# Hack that magically makes nvidia gpus work :) -if command -v nvidia-xconfig ; then - nvidia-xconfig --query-gpu-info > /dev/null 2>&1 +# Rebind framebuffer for nvidia +if test -e "/tmp/vfio-is-nvidia" ; then + echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind fi -# According to kernel documentation (https://www.kernel.org/doc/Documentation/fb/fbcon.txt), -# specifically unbinding efi-framebuffer is not necessary after all consoles -# are unbound (and often times harmful in my experience), so it was omitted here -# I leave it here for reference in case anyone needs it. - -# Re-Bind EFI-Framebuffer -# if test -e "/sys/bus/platform/drivers/efi-framebuffer/bind" ; then -# echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind -# else -# echo "Could not find framebuffer to bind!" -# fi - -#Load amd driver -input="/tmp/vfio-loaded-gpu-modules" -while read gpuModule; do - modprobe "$gpuModule" -done < "$input" - -# Restart Display Manager -input="/tmp/vfio-store-display-manager" -while read displayManager; do - systemctl start "$displayManager" -done < "$input" - echo "End of teardown!"