@@ -22,12 +22,15 @@ import (
22
22
23
23
"tags.cncf.io/container-device-interface/pkg/parser"
24
24
25
+ "github.com/NVIDIA/go-nvlib/pkg/nvlib/device"
26
+
25
27
"github.com/NVIDIA/nvidia-container-toolkit/internal/config"
26
28
"github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
27
29
"github.com/NVIDIA/nvidia-container-toolkit/internal/logger"
28
30
"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/root"
29
31
"github.com/NVIDIA/nvidia-container-toolkit/internal/modifier/cdi"
30
32
"github.com/NVIDIA/nvidia-container-toolkit/internal/oci"
33
+ "github.com/NVIDIA/nvidia-container-toolkit/internal/system/nvdevices"
31
34
"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi"
32
35
"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec"
33
36
)
@@ -198,12 +201,14 @@ func generateAutomaticCDISpec(logger logger.Interface, cfg *config.Config, drive
198
201
logger .Warningf ("Ignoring error(s) loading kernel modules: %v" , err )
199
202
}
200
203
201
- identifiers := []string {}
204
+ var identifiers []string
202
205
for _ , device := range devices {
203
206
_ , _ , id := parser .ParseDevice (device )
204
207
identifiers = append (identifiers , id )
205
208
}
206
209
210
+ tryCreateDeviceNodes (logger , driver , identifiers ... )
211
+
207
212
deviceSpecs , err := cdilib .GetDeviceSpecsByID (identifiers ... )
208
213
if err != nil {
209
214
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
221
226
spec .WithClass ("gpu" ),
222
227
)
223
228
}
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