Skip to content

Commit 1220e91

Browse files
committed
Add KERNEL_MODULE_TYPE envvar to driver container
Signed-off-by: Christopher Desiniotis <[email protected]>
1 parent fd841c8 commit 1220e91

File tree

4 files changed

+187
-35
lines changed

4 files changed

+187
-35
lines changed

rhel8/nvidia-driver

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ USE_HOST_MOFED="${USE_HOST_MOFED:-false}"
1717
DNF_RELEASEVER=${DNF_RELEASEVER:-""}
1818
RHEL_VERSION=${RHEL_VERSION:-""}
1919
RHEL_MAJOR_VERSION=8
20-
21-
OPEN_KERNEL_MODULES_ENABLED=${OPEN_KERNEL_MODULES_ENABLED:-false}
22-
[[ "${OPEN_KERNEL_MODULES_ENABLED}" == "true" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
20+
KERNEL_MODULE_TYPE=${KERNEL_MODULE_TYPE:-auto}
2321

2422
DRIVER_ARCH=${TARGETARCH/amd64/x86_64} && DRIVER_ARCH=${DRIVER_ARCH/arm64/aarch64}
2523
echo "DRIVER_ARCH is $DRIVER_ARCH"
@@ -535,6 +533,36 @@ _shutdown() {
535533
return 1
536534
}
537535

536+
# _resolve_kernel_type determines which kernel module type, open or proprietary, to install.
537+
# This function assumes that the nvidia-installer binary is in the PATH, so this function
538+
# should only be invoked after the userspace driver components have been installed.
539+
#
540+
# KERNEL_MODULE_TYPE is the frontend interface that users can use to configure which module
541+
# to install. Valid values for KERNEL_MODULE_TYPE are 'auto' (default), 'open', and 'proprietary'.
542+
# When 'auto' is configured, we use the nvidia-installer to recommend the module type to install.
543+
_resolve_kernel_type() {
544+
if [ "${KERNEL_MODULE_TYPE}" == "proprietary" ]; then
545+
KERNEL_TYPE=kernel
546+
elif [ "${KERNEL_MODULE_TYPE}" == "open" ]; then
547+
KERNEL_TYPE=kernel-open
548+
elif [ "${KERNEL_MODULE_TYPE}" == "auto" ]; then
549+
kernel_module_type=$(nvidia-installer --print-recommended-kernel-module-type)
550+
if [ $? -ne 0 ]; then
551+
echo "failed to retrieve the recommended kernel module type from nvidia-installer, falling back to using the driver branch"
552+
_resolve_kernel_type_from_driver_branch
553+
return 0
554+
fi
555+
[[ "${kernel_module_type}" == "open" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
556+
else
557+
echo "invalid value for the KERNEL_MODULE_TYPE variable: ${KERNEL_MODULE_TYPE}"
558+
return 1
559+
fi
560+
}
561+
562+
_resolve_kernel_type_from_driver_branch() {
563+
[[ "${DRIVER_BRANCH}" -lt 560 ]] && KERNEL_TYPE=kernel || KERNEL_TYPE=kernel-open
564+
}
565+
538566
_find_vgpu_driver_version() {
539567
local count=""
540568
local version=""
@@ -582,11 +610,16 @@ _prepare() {
582610
_find_vgpu_driver_version || exit 1
583611
fi
584612

585-
# Install the userspace components and copy the kernel module sources.
613+
# Install the userspace components
586614
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
587615
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
588-
sh /tmp/install.sh nvinstall && \
589-
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
616+
sh /tmp/install.sh nvinstall
617+
618+
# Determine the kernel module type
619+
_resolve_kernel_type || exit 1
620+
621+
# Copy the kernel module sources
622+
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
590623
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-$DRIVER_VERSION && \
591624
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-$DRIVER_VERSION/.manifest
592625

@@ -674,12 +707,15 @@ update() {
674707
# vgpu driver version is chosen dynamically during runtime, so pre-compile modules for
675708
# only non-vgpu driver types
676709
if [ "${DRIVER_TYPE}" != "vgpu" ]; then
677-
# Install the userspace components and copy the kernel module sources.
678710
if [ ! -e /usr/src/nvidia-${DRIVER_VERSION}/mkprecompiled ]; then
711+
# Install the userspace components
679712
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
680713
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
681-
sh /tmp/install.sh nvinstall && \
682-
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
714+
sh /tmp/install.sh nvinstall
715+
# Determine the kernel module type
716+
_resolve_kernel_type || exit 1
717+
# Copy the kernel module sources
718+
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
683719
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-$DRIVER_VERSION && \
684720
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-$DRIVER_VERSION/.manifest
685721
fi
@@ -694,6 +730,8 @@ update() {
694730
_resolve_kernel_version || exit 1
695731
_install_prerequisites
696732
if _kernel_requires_package; then
733+
# ensure KERNEL_TYPE is set before compiling kernel modules
734+
[[ -n "${KERNEL_TYPE}" ]] || _resolve_kernel_type || exit 1
697735
_create_driver_package
698736
fi
699737
_remove_prerequisites

rhel9/nvidia-driver

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ USE_HOST_MOFED="${USE_HOST_MOFED:-false}"
1717
DNF_RELEASEVER=${DNF_RELEASEVER:-""}
1818
RHEL_VERSION=${RHEL_VERSION:-""}
1919
RHEL_MAJOR_VERSION=9
20-
21-
OPEN_KERNEL_MODULES_ENABLED=${OPEN_KERNEL_MODULES_ENABLED:-false}
22-
[[ "${OPEN_KERNEL_MODULES_ENABLED}" == "true" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
20+
KERNEL_MODULE_TYPE=${KERNEL_MODULE_TYPE:-auto}
2321

2422
DRIVER_ARCH=${TARGETARCH/amd64/x86_64} && DRIVER_ARCH=${DRIVER_ARCH/arm64/aarch64}
2523
echo "DRIVER_ARCH is $DRIVER_ARCH"
@@ -535,6 +533,36 @@ _shutdown() {
535533
return 1
536534
}
537535

536+
# _resolve_kernel_type determines which kernel module type, open or proprietary, to install.
537+
# This function assumes that the nvidia-installer binary is in the PATH, so this function
538+
# should only be invoked after the userspace driver components have been installed.
539+
#
540+
# KERNEL_MODULE_TYPE is the frontend interface that users can use to configure which module
541+
# to install. Valid values for KERNEL_MODULE_TYPE are 'auto' (default), 'open', and 'proprietary'.
542+
# When 'auto' is configured, we use the nvidia-installer to recommend the module type to install.
543+
_resolve_kernel_type() {
544+
if [ "${KERNEL_MODULE_TYPE}" == "proprietary" ]; then
545+
KERNEL_TYPE=kernel
546+
elif [ "${KERNEL_MODULE_TYPE}" == "open" ]; then
547+
KERNEL_TYPE=kernel-open
548+
elif [ "${KERNEL_MODULE_TYPE}" == "auto" ]; then
549+
kernel_module_type=$(nvidia-installer --print-recommended-kernel-module-type)
550+
if [ $? -ne 0 ]; then
551+
echo "failed to retrieve the recommended kernel module type from nvidia-installer, falling back to using the driver branch"
552+
_resolve_kernel_type_from_driver_branch
553+
return 0
554+
fi
555+
[[ "${kernel_module_type}" == "open" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
556+
else
557+
echo "invalid value for the KERNEL_MODULE_TYPE variable: ${KERNEL_MODULE_TYPE}"
558+
return 1
559+
fi
560+
}
561+
562+
_resolve_kernel_type_from_driver_branch() {
563+
[[ "${DRIVER_BRANCH}" -lt 560 ]] && KERNEL_TYPE=kernel || KERNEL_TYPE=kernel-open
564+
}
565+
538566
_find_vgpu_driver_version() {
539567
local count=""
540568
local version=""
@@ -585,8 +613,13 @@ _prepare() {
585613
# Install the userspace components and copy the kernel module sources.
586614
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
587615
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
588-
sh /tmp/install.sh nvinstall && \
589-
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
616+
sh /tmp/install.sh nvinstall
617+
618+
# Determine the kernel module type
619+
_resolve_kernel_type || exit 1
620+
621+
# Copy the kernel module sources
622+
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
590623
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-$DRIVER_VERSION && \
591624
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-$DRIVER_VERSION/.manifest
592625

@@ -674,12 +707,15 @@ update() {
674707
# vgpu driver version is chosen dynamically during runtime, so pre-compile modules for
675708
# only non-vgpu driver types
676709
if [ "${DRIVER_TYPE}" != "vgpu" ]; then
677-
# Install the userspace components and copy the kernel module sources.
678710
if [ ! -e /usr/src/nvidia-${DRIVER_VERSION}/mkprecompiled ]; then
711+
# Install the userspace components
679712
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
680713
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
681-
sh /tmp/install.sh nvinstall && \
682-
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
714+
sh /tmp/install.sh nvinstall
715+
# Determine the kernel module type
716+
_resolve_kernel_type || exit 1
717+
# Copy the kernel module sources
718+
mkdir -p /usr/src/nvidia-$DRIVER_VERSION && \
683719
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-$DRIVER_VERSION && \
684720
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-$DRIVER_VERSION/.manifest
685721
fi
@@ -694,6 +730,8 @@ update() {
694730
_resolve_kernel_version || exit 1
695731
_install_prerequisites
696732
if _kernel_requires_package; then
733+
# ensure KERNEL_TYPE is set before compiling kernel modules
734+
[[ -n "${KERNEL_TYPE}" ]] || _resolve_kernel_type || exit 1
697735
_create_driver_package
698736
fi
699737
_remove_prerequisites

ubuntu20.04/nvidia-driver

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ NVIDIA_UVM_MODULE_PARAMS=()
1515
NVIDIA_MODESET_MODULE_PARAMS=()
1616
NVIDIA_PEERMEM_MODULE_PARAMS=()
1717
TARGETARCH=${TARGETARCH:?"Missing TARGETARCH env"}
18-
19-
OPEN_KERNEL_MODULES_ENABLED=${OPEN_KERNEL_MODULES_ENABLED:-false}
20-
[[ "${OPEN_KERNEL_MODULES_ENABLED}" == "true" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
18+
KERNEL_MODULE_TYPE=${KERNEL_MODULE_TYPE:-auto}
2119

2220
export DEBIAN_FRONTEND=noninteractive
2321

@@ -477,6 +475,36 @@ _shutdown() {
477475
return 1
478476
}
479477

478+
# _resolve_kernel_type determines which kernel module type, open or proprietary, to install.
479+
# This function assumes that the nvidia-installer binary is in the PATH, so this function
480+
# should only be invoked after the userspace driver components have been installed.
481+
#
482+
# KERNEL_MODULE_TYPE is the frontend interface that users can use to configure which module
483+
# to install. Valid values for KERNEL_MODULE_TYPE are 'auto' (default), 'open', and 'proprietary'.
484+
# When 'auto' is configured, we use the nvidia-installer to recommend the module type to install.
485+
_resolve_kernel_type() {
486+
if [ "${KERNEL_MODULE_TYPE}" == "proprietary" ]; then
487+
KERNEL_TYPE=kernel
488+
elif [ "${KERNEL_MODULE_TYPE}" == "open" ]; then
489+
KERNEL_TYPE=kernel-open
490+
elif [ "${KERNEL_MODULE_TYPE}" == "auto" ]; then
491+
kernel_module_type=$(nvidia-installer --print-recommended-kernel-module-type)
492+
if [ $? -ne 0 ]; then
493+
echo "failed to retrieve the recommended kernel module type from nvidia-installer, falling back to using the driver branch"
494+
_resolve_kernel_type_from_driver_branch
495+
return 0
496+
fi
497+
[[ "${kernel_module_type}" == "open" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
498+
else
499+
echo "invalid value for the KERNEL_MODULE_TYPE variable: ${KERNEL_MODULE_TYPE}"
500+
return 1
501+
fi
502+
}
503+
504+
_resolve_kernel_type_from_driver_branch() {
505+
[[ "${DRIVER_BRANCH}" -lt 560 ]] && KERNEL_TYPE=kernel || KERNEL_TYPE=kernel-open
506+
}
507+
480508
_find_vgpu_driver_version() {
481509
local count=""
482510
local version=""
@@ -520,7 +548,7 @@ init() {
520548
_find_vgpu_driver_version || exit 1
521549
fi
522550

523-
# Install the userspace components and copy the kernel module sources.
551+
# Install the userspace components
524552
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
525553
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
526554
./nvidia-installer --silent \
@@ -535,8 +563,13 @@ init() {
535563
--x-prefix=/tmp/null \
536564
--x-module-path=/tmp/null \
537565
--x-library-path=/tmp/null \
538-
--x-sysconfig-path=/tmp/null && \
539-
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
566+
--x-sysconfig-path=/tmp/null
567+
568+
# Determine the kernel module type
569+
_resolve_kernel_type || exit 1
570+
571+
# Copy the kernel module sources
572+
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
540573
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-${DRIVER_VERSION} && \
541574
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-${DRIVER_VERSION}/.manifest
542575

@@ -595,8 +628,8 @@ update() {
595628
# vgpu driver version is choosen dynamically during runtime, so pre-compile modules for
596629
# only non-vgpu driver types
597630
if [ "${DRIVER_TYPE}" != "vgpu" ]; then
598-
# Install the userspace components and copy the kernel module sources.
599631
if [ ! -e /usr/src/nvidia-${DRIVER_VERSION}/mkprecompiled ]; then
632+
# Install the userspace components
600633
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
601634
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
602635
./nvidia-installer --silent \
@@ -611,8 +644,11 @@ update() {
611644
--x-prefix=/tmp/null \
612645
--x-module-path=/tmp/null \
613646
--x-library-path=/tmp/null \
614-
--x-sysconfig-path=/tmp/null && \
615-
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
647+
--x-sysconfig-path=/tmp/null
648+
# Determine the kernel module type
649+
_resolve_kernel_type || exit 1
650+
# Copy the kernel module sources
651+
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
616652
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-${DRIVER_VERSION} && \
617653
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-${DRIVER_VERSION}/.manifest
618654
fi
@@ -627,6 +663,8 @@ update() {
627663
_resolve_kernel_version || exit 1
628664
_install_prerequisites
629665
if _kernel_requires_package; then
666+
# ensure KERNEL_TYPE is set before compiling kernel modules
667+
[[ -n "${KERNEL_TYPE}" ]] || _resolve_kernel_type || exit 1
630668
_create_driver_package
631669
fi
632670
_remove_prerequisites

ubuntu22.04/nvidia-driver

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ NVIDIA_UVM_MODULE_PARAMS=()
1515
NVIDIA_MODESET_MODULE_PARAMS=()
1616
NVIDIA_PEERMEM_MODULE_PARAMS=()
1717
TARGETARCH=${TARGETARCH:?"Missing TARGETARCH env"}
18-
19-
OPEN_KERNEL_MODULES_ENABLED=${OPEN_KERNEL_MODULES_ENABLED:-false}
20-
[[ "${OPEN_KERNEL_MODULES_ENABLED}" == "true" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
18+
KERNEL_MODULE_TYPE=${KERNEL_MODULE_TYPE:-auto}
2119

2220
export DEBIAN_FRONTEND=noninteractive
2321

@@ -481,6 +479,36 @@ _shutdown() {
481479
return 1
482480
}
483481

482+
# _resolve_kernel_type determines which kernel module type, open or proprietary, to install.
483+
# This function assumes that the nvidia-installer binary is in the PATH, so this function
484+
# should only be invoked after the userspace driver components have been installed.
485+
#
486+
# KERNEL_MODULE_TYPE is the frontend interface that users can use to configure which module
487+
# to install. Valid values for KERNEL_MODULE_TYPE are 'auto' (default), 'open', and 'proprietary'.
488+
# When 'auto' is configured, we use the nvidia-installer to recommend the module type to install.
489+
_resolve_kernel_type() {
490+
if [ "${KERNEL_MODULE_TYPE}" == "proprietary" ]; then
491+
KERNEL_TYPE=kernel
492+
elif [ "${KERNEL_MODULE_TYPE}" == "open" ]; then
493+
KERNEL_TYPE=kernel-open
494+
elif [ "${KERNEL_MODULE_TYPE}" == "auto" ]; then
495+
kernel_module_type=$(nvidia-installer --print-recommended-kernel-module-type)
496+
if [ $? -ne 0 ]; then
497+
echo "failed to retrieve the recommended kernel module type from nvidia-installer, falling back to using the driver branch"
498+
_resolve_kernel_type_from_driver_branch
499+
return 0
500+
fi
501+
[[ "${kernel_module_type}" == "open" ]] && KERNEL_TYPE=kernel-open || KERNEL_TYPE=kernel
502+
else
503+
echo "invalid value for the KERNEL_MODULE_TYPE variable: ${KERNEL_MODULE_TYPE}"
504+
return 1
505+
fi
506+
}
507+
508+
_resolve_kernel_type_from_driver_branch() {
509+
[[ "${DRIVER_BRANCH}" -lt 560 ]] && KERNEL_TYPE=kernel || KERNEL_TYPE=kernel-open
510+
}
511+
484512
_find_vgpu_driver_version() {
485513
local count=""
486514
local version=""
@@ -524,7 +552,7 @@ init() {
524552
_find_vgpu_driver_version || exit 1
525553
fi
526554

527-
# Install the userspace components and copy the kernel module sources.
555+
# Install the userspace components
528556
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
529557
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
530558
./nvidia-installer --silent \
@@ -539,8 +567,13 @@ init() {
539567
--x-prefix=/tmp/null \
540568
--x-module-path=/tmp/null \
541569
--x-library-path=/tmp/null \
542-
--x-sysconfig-path=/tmp/null && \
543-
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
570+
--x-sysconfig-path=/tmp/null
571+
572+
# Determine the kernel module type
573+
_resolve_kernel_type || exit 1
574+
575+
# Copy the kernel module sources
576+
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
544577
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-${DRIVER_VERSION} && \
545578
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-${DRIVER_VERSION}/.manifest
546579

@@ -599,8 +632,8 @@ update() {
599632
# vgpu driver version is choosen dynamically during runtime, so pre-compile modules for
600633
# only non-vgpu driver types
601634
if [ "${DRIVER_TYPE}" != "vgpu" ]; then
602-
# Install the userspace components and copy the kernel module sources.
603635
if [ ! -e /usr/src/nvidia-${DRIVER_VERSION}/mkprecompiled ]; then
636+
# Install the userspace components
604637
sh NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION.run -x && \
605638
cd NVIDIA-Linux-$DRIVER_ARCH-$DRIVER_VERSION && \
606639
./nvidia-installer --silent \
@@ -615,8 +648,11 @@ update() {
615648
--x-prefix=/tmp/null \
616649
--x-module-path=/tmp/null \
617650
--x-library-path=/tmp/null \
618-
--x-sysconfig-path=/tmp/null && \
619-
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
651+
--x-sysconfig-path=/tmp/null
652+
# Determine the kernel module type
653+
_resolve_kernel_type || exit 1
654+
# Copy the kernel module sources
655+
mkdir -p /usr/src/nvidia-${DRIVER_VERSION} && \
620656
mv LICENSE mkprecompiled ${KERNEL_TYPE} /usr/src/nvidia-${DRIVER_VERSION} && \
621657
sed '9,${/^\(kernel\|LICENSE\)/!d}' .manifest > /usr/src/nvidia-${DRIVER_VERSION}/.manifest
622658
fi
@@ -631,6 +667,8 @@ update() {
631667
_resolve_kernel_version || exit 1
632668
_install_prerequisites
633669
if _kernel_requires_package; then
670+
# ensure KERNEL_TYPE is set before compiling kernel modules
671+
[[ -n "${KERNEL_TYPE}" ]] || _resolve_kernel_type || exit 1
634672
_create_driver_package
635673
fi
636674
_remove_prerequisites

0 commit comments

Comments
 (0)