@@ -47,23 +47,26 @@ const (
4747)
4848
4949type VfioPciManager struct {
50- driverRoot string
51- driver string
52- nvlib * deviceLib
50+ driverRoot string
51+ driver string
52+ nvlib * deviceLib
53+ nvidiaEnabled bool
5354}
5455
55- func NewVfioPciManager (driverRoot string , nvlib * deviceLib ) * VfioPciManager {
56+ func NewVfioPciManager (driverRoot string , nvlib * deviceLib , nvidiaEnabled bool ) * VfioPciManager {
5657 vm := & VfioPciManager {
57- driverRoot : driverRoot ,
58- driver : vfioPciDriver ,
59- nvlib : nvlib ,
58+ driverRoot : driverRoot ,
59+ driver : vfioPciDriver ,
60+ nvlib : nvlib ,
61+ nvidiaEnabled : nvidiaEnabled ,
6062 }
6163 if ! vm .isVfioPCIModuleLoaded () {
6264 err := vm .loadVfioPciModule ()
6365 if err != nil {
6466 klog .Fatalf ("failed to load vfio_pci module: %v" , err )
6567 }
6668 }
69+
6770 return vm
6871}
6972
@@ -124,7 +127,7 @@ func (vm *VfioPciManager) loadVfioPciModule() error {
124127 return nil
125128}
126129
127- func (vm * VfioPciManager ) WaitForGPUFree (info * VfioDeviceInfo ) error {
130+ func (vm * VfioPciManager ) WaitForGPUFree (ctx context. Context , info * VfioDeviceInfo ) error {
128131 if info .parent == nil {
129132 return nil
130133 }
@@ -175,7 +178,11 @@ func (vm *VfioPciManager) Configure(ctx context.Context, info *VfioDeviceInfo) e
175178 if driver == vm .driver {
176179 return nil
177180 }
178- err = vm .WaitForGPUFree (info )
181+ // Only support vfio-pci or nvidia (if vm.nvidiaEnabled) driver.
182+ if ! vm .nvidiaEnabled || driver != nvidiaDriver {
183+ return fmt .Errorf ("gpu is bound to %q driver, expected %q or %q" , driver , vm .driver , nvidiaDriver )
184+ }
185+ err = vm .WaitForGPUFree (ctx , info )
179186 if err != nil {
180187 return err
181188 }
@@ -191,10 +198,15 @@ func (vm *VfioPciManager) Configure(ctx context.Context, info *VfioDeviceInfo) e
191198}
192199
193200// Unconfigure binds the GPU to the nvidia driver.
194- func (vm * VfioPciManager ) Unconfigure (info * VfioDeviceInfo ) error {
201+ func (vm * VfioPciManager ) Unconfigure (ctx context. Context , info * VfioDeviceInfo ) error {
195202 perGpuLock .Get (info .pcieBusID ).Lock ()
196203 defer perGpuLock .Get (info .pcieBusID ).Unlock ()
197204
205+ // Do nothing if we dont expect to switch to nvidia driver.
206+ if ! vm .nvidiaEnabled {
207+ return nil
208+ }
209+
198210 driver , err := getDriver (pciDevicesRoot , info .pcieBusID )
199211 if err != nil {
200212 return err
0 commit comments