@@ -48,6 +48,9 @@ const (
4848// When the device's firmware crashes the driver reports these values
4949unhealthyAfuID = "ffffffffffffffffffffffffffffffff"
5050unhealthyInterfaceID = "ffffffffffffffffffffffffffffffff"
51+
52+ // Frequency of device scans
53+ scanFrequency = 5 * time .Second
5154)
5255
5356type getDevTreeFunc func (devices []device ) dpapi.DeviceTree
@@ -172,17 +175,33 @@ type devicePlugin struct {
172175ignoreAfuIDs bool
173176ignoreEmptyRegions bool
174177annotationValue string
178+
179+ scanTicker * time.Ticker
180+ scanDone chan bool
175181}
176182
177183// newDevicePlugin returns new instance of devicePlugin
178184func newDevicePlugin (mode string ) (* devicePlugin , error ) {
185+ var dp * devicePlugin
186+ var err error
187+
179188if _ , err := os .Stat (sysfsDirectoryOPAE ); os .IsNotExist (err ) {
180189if _ , err = os .Stat (sysfsDirectoryDFL ); os .IsNotExist (err ) {
181190return nil , fmt .Errorf ("kernel driver is not loaded: neither %s nor %s sysfs entry exists" , sysfsDirectoryOPAE , sysfsDirectoryDFL )
182191}
183- return newDevicePluginDFL (sysfsDirectoryDFL , devfsDirectory , mode )
192+ dp , err = newDevicePluginDFL (sysfsDirectoryDFL , devfsDirectory , mode )
193+ } else {
194+ dp , err = newDevicePluginOPAE (sysfsDirectoryOPAE , devfsDirectory , mode )
184195}
185- return newDevicePluginOPAE (sysfsDirectoryOPAE , devfsDirectory , mode )
196+
197+ if err != nil {
198+ return nil , err
199+ }
200+
201+ dp .scanTicker = time .NewTicker (scanFrequency )
202+ dp .scanDone = make (chan bool , 1 ) // buffered as we may send to it before Scan starts receiving from it
203+
204+ return dp , nil
186205}
187206
188207func (dp * devicePlugin ) PostAllocate (response * pluginapi.AllocateResponse ) error {
@@ -200,6 +219,7 @@ func (dp *devicePlugin) PostAllocate(response *pluginapi.AllocateResponse) error
200219
201220// Scan starts scanning FPGA devices on the host
202221func (dp * devicePlugin ) Scan (notifier dpapi.Notifier ) error {
222+ defer dp .scanTicker .Stop ()
203223for {
204224devTree , err := dp .scanFPGAs ()
205225if err != nil {
@@ -208,7 +228,11 @@ func (dp *devicePlugin) Scan(notifier dpapi.Notifier) error {
208228
209229notifier .Notify (devTree )
210230
211- time .Sleep (5 * time .Second )
231+ select {
232+ case <- dp .scanDone :
233+ return nil
234+ case <- dp .scanTicker .C :
235+ }
212236}
213237}
214238
0 commit comments