diff --git a/CHANGELOG.md b/CHANGELOG.md index bbc75663..62155ab6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Include `nvidia/nvoptix.bin` in list of graphics mounts. * Include `vulkan/icd.d/nvidia_layers.json` in list of graphics mounts. * Add support for `--library-search-paths` to `nvidia-ctk cdi generate` command. +* Add support for injecting /dev/nvidia-nvswitch* devices if the NVIDIA_NVSWITCH=enabled envvar is specified. * [libnvidia-container] Fix device permission check when using cgroupv2 (fixes #227) diff --git a/internal/discover/nvswitch.go b/internal/discover/nvswitch.go new file mode 100644 index 00000000..fb956d11 --- /dev/null +++ b/internal/discover/nvswitch.go @@ -0,0 +1,33 @@ +/** +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +**/ + +package discover + +import "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" + +// NewNvSwitchDiscoverer creates a discoverer for NVSWITCH devices. +func NewNvSwitchDiscoverer(logger logger.Interface, devRoot string) (Discover, error) { + devices := NewCharDeviceDiscoverer( + logger, + devRoot, + []string{ + "/dev/nvidia-nvswitchctl", + "/dev/nvidia-nvswitch*", + }, + ) + + return devices, nil +} diff --git a/internal/modifier/gated.go b/internal/modifier/gated.go index 1881f174..c3b6df39 100644 --- a/internal/modifier/gated.go +++ b/internal/modifier/gated.go @@ -27,8 +27,9 @@ import ( ) const ( - nvidiaGDSEnvvar = "NVIDIA_GDS" - nvidiaMOFEDEnvvar = "NVIDIA_MOFED" + nvidiaGDSEnvvar = "NVIDIA_GDS" + nvidiaMOFEDEnvvar = "NVIDIA_MOFED" + nvidiaNVSWITCHEnvvar = "NVIDIA_NVSWITCH" ) // NewFeatureGatedModifier creates the modifiers for optional features. @@ -36,6 +37,7 @@ const ( // // NVIDIA_GDS=enabled // NVIDIA_MOFED=enabled +// NVIDIA_NVSWITCH=enabled // // If not devices are selected, no changes are made. func NewFeatureGatedModifier(logger logger.Interface, cfg *config.Config, image image.CUDA) (oci.SpecModifier, error) { @@ -65,5 +67,13 @@ func NewFeatureGatedModifier(logger logger.Interface, cfg *config.Config, image discoverers = append(discoverers, d) } + if image.Getenv(nvidiaNVSWITCHEnvvar) == "enabled" { + d, err := discover.NewNvSwitchDiscoverer(logger, devRoot) + if err != nil { + return nil, fmt.Errorf("failed to construct discoverer for NVSWITCH devices: %w", err) + } + discoverers = append(discoverers, d) + } + return NewModifierFromDiscoverer(logger, discover.Merge(discoverers...)) }