diff --git a/nvidiactl/nvidiactl b/nvidiactl/nvidiactl index 7944b08..1a3cfbc 100755 --- a/nvidiactl/nvidiactl +++ b/nvidiactl/nvidiactl @@ -16,6 +16,12 @@ use_nouveau () { exit 1 } +# Replace an existing node, for example from an earlier run of the service. +make_chardev () { + rm -f "$1" + mknod -m 666 "$1" c "$2" "$3" +} + if [ -d /sys/module/nouveau ] ; then echo >&2 "NOTE: nouveau driver loaded already, using 'mxgfx-generic'." set_generic_mxgfx_link @@ -26,17 +32,17 @@ PCIIDHINT_DIR=/usr/share/nvidia/pciidhints kver=$(uname -r) -nvidiacards=( $(lspci -n | grep " 030[0,2]: 10de:" | cut -d ' ' -f 3) ) +mapfile -t nvidiacards < <(lspci -n | grep " 030[0,2]: 10de:" | cut -d ' ' -f 3) -nvver=${nvidiacards[0]} +pciid=${nvidiacards[0]} -if [ -z ${nvver} ] ; then +if [ -z "${pciid}" ] ; then echo >&2 "WARNING: no nvidia card found.." set_generic_mxgfx_link exit 0 fi -pciids="${PCIIDHINT_DIR}/${kver}-${nvver} ${PCIIDHINT_DIR}/${nvver}" +pciids="${PCIIDHINT_DIR}/${kver}-${pciid} ${PCIIDHINT_DIR}/${pciid}" for leglvlhint in ${pciids} ; do if [ -h "${leglvlhint}" ] ; then @@ -82,19 +88,19 @@ NVDEVS=$(lspci | grep -i NVIDIA) N3D=$(echo "$NVDEVS" | grep "3D controller" | wc -l) NVGA=$(echo "$NVDEVS" | grep "VGA compatible controller" | wc -l) N=$(( $N3D + $NVGA )) -if [ ! -z $N ]; then +if [ $N -gt 0 ]; then N=$(( $N - 1 )) for i in $(seq 0 $N); do - mknod -m 666 /dev/nvidia$i c 195 $i + make_chardev /dev/nvidia$i 195 $i done - mknod -m 666 /dev/nvidiactl c 195 255 + make_chardev /dev/nvidiactl 195 255 # CUDA if [ -e ${nvlink}/nvidia-uvm.ko ]; then insmod ${nvlink}/nvidia-uvm.ko D=$(grep nvidia-uvm /proc/devices | awk '{print $1}') if [ ! -z $D ]; then - mknod -m 666 /dev/nvidia-uvm c $D 0 + make_chardev /dev/nvidia-uvm $D 0 fi fi test -e ${nvlink}/nvidia-modeset.ko && insmod ${nvlink}/nvidia-modeset.ko