@@ -22,12 +22,15 @@ import (
2222
2323 "tags.cncf.io/container-device-interface/pkg/parser"
2424
25+ "github.com/NVIDIA/go-nvlib/pkg/nvlib/device"
26+
2527 "github.com/NVIDIA/nvidia-container-toolkit/internal/config"
2628 "github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
2729 "github.com/NVIDIA/nvidia-container-toolkit/internal/logger"
2830 "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/root"
2931 "github.com/NVIDIA/nvidia-container-toolkit/internal/modifier/cdi"
3032 "github.com/NVIDIA/nvidia-container-toolkit/internal/oci"
33+ "github.com/NVIDIA/nvidia-container-toolkit/internal/system/nvdevices"
3134 "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi"
3235 "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec"
3336)
@@ -198,12 +201,14 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, drive
198201 logger .Warningf ("Ignoring error(s) loading kernel modules: %v" , err )
199202 }
200203
201- identifiers := []string {}
204+ var identifiers []string
202205 for _ , device := range devices {
203206 _ , _ , id := parser .ParseDevice (device )
204207 identifiers = append (identifiers , id )
205208 }
206209
210+ tryCreateDeviceNodes (logger , driver , identifiers ... )
211+
207212 deviceSpecs , err := cdilib .GetDeviceSpecsByID (identifiers ... )
208213 if err != nil {
209214 return nil , fmt .Errorf ("failed to get CDI device specs: %w" , err )
@@ -221,3 +226,27 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, drive
221226 spec .WithClass ("gpu" ),
222227 )
223228}
229+
230+ func tryCreateDeviceNodes (logger logger.Interface , driver * root.Driver , identifiers ... string ) {
231+ devices , err := nvdevices .New (
232+ nvdevices .WithLogger (logger ),
233+ nvdevices .WithDevRoot (driver .Root ),
234+ )
235+ if err != nil {
236+ logger .Warningf ("Failed to create devices library: %v" , err )
237+ return
238+ }
239+ if err := devices .CreateNVIDIAControlDevices (); err != nil {
240+ logger .Warningf ("Failed to create control devices: %v" , err )
241+ }
242+ if err := devices .CreateNVIDIACapsControlDeviceNodes (); err != nil {
243+ logger .Warningf ("Failed to create nvidia-caps control devices: %v" , err )
244+ }
245+
246+ for _ , id := range identifiers {
247+ identifier := device .Identifier (id )
248+ if err := devices .CreateDeviceNodes (identifier ); err != nil {
249+ logger .Warningf ("Error creating device nodes for %v: %v" , identifier , err )
250+ }
251+ }
252+ }
0 commit comments