15
15
package kernel
16
16
17
17
import (
18
- "bufio"
19
18
"fmt"
20
19
"io"
21
20
22
21
"gvisor.dev/gvisor/pkg/cleanup"
23
22
"gvisor.dev/gvisor/pkg/context"
24
- "gvisor.dev/gvisor/pkg/fd"
25
23
"gvisor.dev/gvisor/pkg/log"
26
24
"gvisor.dev/gvisor/pkg/sentry/pgalloc"
25
+ "gvisor.dev/gvisor/pkg/sentry/state/stateio"
27
26
"gvisor.dev/gvisor/pkg/state"
28
27
"gvisor.dev/gvisor/pkg/sync"
29
28
"gvisor.dev/gvisor/pkg/timing"
@@ -272,7 +271,7 @@ type AsyncMFLoader struct {
272
271
// If timeline is provided, it will be used to track async page loading.
273
272
// It takes ownership of the timeline, and will end it when done loading all
274
273
// pages.
275
- func NewAsyncMFLoader (pagesMetadata , pagesFile * fd. FD , mainMF * pgalloc.MemoryFile , timeline * timing.Timeline ) * AsyncMFLoader {
274
+ func NewAsyncMFLoader (pagesMetadata io. ReadCloser , pagesFile stateio. AsyncReader , mainMF * pgalloc.MemoryFile , timeline * timing.Timeline ) * AsyncMFLoader {
276
275
mfl := & AsyncMFLoader {
277
276
privateMFsChan : make (chan map [string ]* pgalloc.MemoryFile , 1 ),
278
277
}
@@ -283,27 +282,25 @@ func NewAsyncMFLoader(pagesMetadata, pagesFile *fd.FD, mainMF *pgalloc.MemoryFil
283
282
return mfl
284
283
}
285
284
286
- func (mfl * AsyncMFLoader ) backgroundGoroutine (pagesMetadataFD , pagesFileFD * fd. FD , mainMF * pgalloc.MemoryFile , timeline * timing.Timeline ) {
285
+ func (mfl * AsyncMFLoader ) backgroundGoroutine (pagesMetadata io. ReadCloser , pagesFile stateio. AsyncReader , mainMF * pgalloc.MemoryFile , timeline * timing.Timeline ) {
287
286
defer timeline .End ()
288
- defer pagesMetadataFD .Close ()
289
- defer pagesFileFD .Close ()
287
+ defer pagesMetadata .Close ()
290
288
cu := cleanup .Make (func () {
291
289
mfl .metadataWg .Done ()
292
290
mfl .loadWg .Done ()
293
291
})
294
292
defer cu .Clean ()
295
293
296
- // //pkg/state/wire reads one byte at a time; buffer these reads to
297
- // avoid making one syscall per read. For the "main" state file, this
298
- // buffering is handled by statefile.NewReader() => compressio.Reader
299
- // or compressio.NewSimpleReader().
300
- pagesMetadata := bufio .NewReader (pagesMetadataFD )
301
-
302
294
mfl .loadWg .Add (1 )
303
- apfl := pgalloc .StartAsyncPagesFileLoad (int32 ( pagesFileFD . FD ()) , func (err error ) {
295
+ apfl , err := pgalloc .StartAsyncPagesFileLoad (pagesFile , func (err error ) {
304
296
defer mfl .loadWg .Done ()
305
297
mfl .loadErr = err
306
- }, timeline )
298
+ }, timeline ) // transfers ownership of pagesFile
299
+ if err != nil {
300
+ mfl .loadWg .Done ()
301
+ log .Warningf ("Failed to start async page loading: %v" , err )
302
+ return
303
+ }
307
304
cu .Add (apfl .MemoryFilesDone )
308
305
309
306
opts := pgalloc.LoadOpts {
@@ -314,7 +311,7 @@ func (mfl *AsyncMFLoader) backgroundGoroutine(pagesMetadataFD, pagesFileFD *fd.F
314
311
timeline .Reached ("loading mainMF" )
315
312
log .Infof ("Loading metadata for main MemoryFile: %p" , mainMF )
316
313
ctx := context .Background ()
317
- err : = mainMF .LoadFrom (ctx , pagesMetadata , & opts )
314
+ err = mainMF .LoadFrom (ctx , pagesMetadata , & opts )
318
315
mfl .metadataErr = err
319
316
mfl .mainMetadataErr = err
320
317
mfl .mainMFStartWg .Done ()
0 commit comments