11package daemon
22
33import (
4+ "errors"
5+ "fmt"
6+ "os/exec"
47 "strings"
58
9+ "github.com/moby/moby/v2/daemon/internal/capabilities"
610 "github.com/opencontainers/runtime-spec/specs-go"
11+ "tags.cncf.io/container-device-interface/pkg/cdi"
12+ )
13+
14+ const (
15+ amdContainerRuntimeExecutableName = "amd-container-runtime"
716)
817
918func setAMDGPUs (s * specs.Spec , dev * deviceInstance ) error {
@@ -25,3 +34,46 @@ func setAMDGPUs(s *specs.Spec, dev *deviceInstance) error {
2534
2635 return nil
2736}
37+
38+ func createAMDCDIUpdater (cdiCache * cdi.Cache ) func (* specs.Spec , * deviceInstance ) error {
39+ return func (s * specs.Spec , dev * deviceInstance ) error {
40+ vendor , err := getFirstAvailableVendor (cdiCache .ListVendors ())
41+ if err != nil {
42+ return fmt .Errorf ("failed to discover GPU vendor from CDI: %w" , err )
43+ }
44+
45+ if vendor != "amd.com" {
46+ return errors .New ("AMD CDI spec not found" )
47+ }
48+
49+ injector := & cdiDeviceInjector {
50+ defaultCDIDeviceKind : "amd.com/gpu" ,
51+ }
52+ return injector .injectDevices (s , dev )
53+ }
54+ }
55+
56+ func getAMDDeviceDrivers (cdiCache * cdi.Cache ) * deviceDriver {
57+ var composite firstSuccessfulUpdater
58+
59+ if cdiCache != nil {
60+ composite = append (composite , createAMDCDIUpdater (cdiCache ))
61+ }
62+
63+ if _ , err := exec .LookPath (amdContainerRuntimeExecutableName ); err == nil {
64+ composite = append (composite , setAMDGPUs )
65+ }
66+
67+ if len (composite ) == 0 {
68+ return nil
69+ }
70+
71+ // We do not support specifying driver with device requests for AMD GPUs.
72+ // Hence only use the composite updater and try cdi and runtime driver in sequence
73+ // based on availability.
74+ capset := capabilities.Set {"gpu" : struct {}{}, "amd" : struct {}{}}
75+ return & deviceDriver {
76+ capset : capset ,
77+ updateSpec : composite .updateSpec ,
78+ }
79+ }
0 commit comments