From 90b76ace376d8e896c5ba4c6cf95923f0eff2ceb Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Sun, 9 Mar 2025 13:49:56 +0200 Subject: [PATCH] Create device nodes in JIT-CDI mode Signed-off-by: Evan Lezar --- internal/modifier/cdi.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/internal/modifier/cdi.go b/internal/modifier/cdi.go index bc9a7de3..517e09f9 100644 --- a/internal/modifier/cdi.go +++ b/internal/modifier/cdi.go @@ -18,6 +18,7 @@ package modifier import ( "fmt" + "os/exec" "strings" "tags.cncf.io/container-device-interface/pkg/parser" @@ -28,6 +29,7 @@ import ( "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/root" "github.com/NVIDIA/nvidia-container-toolkit/internal/modifier/cdi" "github.com/NVIDIA/nvidia-container-toolkit/internal/oci" + "github.com/NVIDIA/nvidia-container-toolkit/internal/system/nvdevices" "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi" "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" ) @@ -204,6 +206,8 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, drive identifiers = append(identifiers, id) } + tryCreateDeviceNodes(logger, driver, identifiers...) + deviceSpecs, err := cdilib.GetDeviceSpecsByID(identifiers...) if err != nil { return nil, fmt.Errorf("failed to get CDI device specs: %w", err) @@ -221,3 +225,22 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, drive spec.WithClass("gpu"), ) } + +func tryCreateDeviceNodes(logger logger.Interface, driver *root.Driver, identifiers ...string) { + devices, err := nvdevices.New( + nvdevices.WithLogger(logger), + nvdevices.WithDevRoot(driver.Root), + ) + if err != nil { + return + } + if err := devices.CreateNVIDIAControlDevices(); err != nil { + logger.Warningf("Failed to create control devices: %v", err) + } + + // We run nvidia-smi -L to force the creation of the device nodes. + nvidiaSMI := exec.Command("nvidia-smi", "-L") + if err := nvidiaSMI.Run(); err != nil { + logger.Warningf("Failed to run nvidia-smi: %v", err) + } +}