@@ -18,6 +18,7 @@ package modifier
1818
1919import (
2020 "fmt"
21+ "os/exec"
2122 "strings"
2223
2324 "tags.cncf.io/container-device-interface/pkg/parser"
@@ -28,6 +29,7 @@ import (
2829 "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/root"
2930 "github.com/NVIDIA/nvidia-container-toolkit/internal/modifier/cdi"
3031 "github.com/NVIDIA/nvidia-container-toolkit/internal/oci"
32+ "github.com/NVIDIA/nvidia-container-toolkit/internal/system/nvdevices"
3133 "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi"
3234 "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec"
3335)
@@ -204,6 +206,8 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, drive
204206 identifiers = append (identifiers , id )
205207 }
206208
209+ tryCreateDeviceNodes (logger , driver , identifiers ... )
210+
207211 deviceSpecs , err := cdilib .GetDeviceSpecsByID (identifiers ... )
208212 if err != nil {
209213 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
221225 spec .WithClass ("gpu" ),
222226 )
223227}
228+
229+ func tryCreateDeviceNodes (logger logger.Interface , driver * root.Driver , identifiers ... string ) {
230+ devices , err := nvdevices .New (
231+ nvdevices .WithLogger (logger ),
232+ nvdevices .WithDevRoot (driver .Root ),
233+ )
234+ if err != nil {
235+ return
236+ }
237+ if err := devices .CreateNVIDIAControlDevices (); err != nil {
238+ logger .Warningf ("Failed to create control devices: %v" , err )
239+ }
240+
241+ // We run nvidia-smi -L to force the creation of the device nodes.
242+ nvidiaSMI := exec .Command ("nvidia-smi" , "-L" )
243+ if err := nvidiaSMI .Run (); err != nil {
244+ logger .Warningf ("Failed to run nvidia-smi: %v" , err )
245+ }
246+ }
0 commit comments