1515package kernel
1616
1717import (
18- "bufio"
1918 "fmt"
2019 "io"
2120
2221 "gvisor.dev/gvisor/pkg/cleanup"
2322 "gvisor.dev/gvisor/pkg/context"
24- "gvisor.dev/gvisor/pkg/fd"
2523 "gvisor.dev/gvisor/pkg/log"
2624 "gvisor.dev/gvisor/pkg/sentry/pgalloc"
25+ "gvisor.dev/gvisor/pkg/sentry/state/stateio"
2726 "gvisor.dev/gvisor/pkg/state"
2827 "gvisor.dev/gvisor/pkg/sync"
2928 "gvisor.dev/gvisor/pkg/timing"
@@ -272,7 +271,7 @@ type AsyncMFLoader struct {
272271// If timeline is provided, it will be used to track async page loading.
273272// It takes ownership of the timeline, and will end it when done loading all
274273// 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 {
276275 mfl := & AsyncMFLoader {
277276 privateMFsChan : make (chan map [string ]* pgalloc.MemoryFile , 1 ),
278277 }
@@ -283,27 +282,25 @@ func NewAsyncMFLoader(pagesMetadata, pagesFile *fd.FD, mainMF *pgalloc.MemoryFil
283282 return mfl
284283}
285284
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 ) {
287286 defer timeline .End ()
288- defer pagesMetadataFD .Close ()
289- defer pagesFileFD .Close ()
287+ defer pagesMetadata .Close ()
290288 cu := cleanup .Make (func () {
291289 mfl .metadataWg .Done ()
292290 mfl .loadWg .Done ()
293291 })
294292 defer cu .Clean ()
295293
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-
302294 mfl .loadWg .Add (1 )
303- apfl := pgalloc .StartAsyncPagesFileLoad (int32 ( pagesFileFD . FD ()) , func (err error ) {
295+ apfl , err := pgalloc .StartAsyncPagesFileLoad (pagesFile , func (err error ) {
304296 defer mfl .loadWg .Done ()
305297 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+ }
307304 cu .Add (apfl .MemoryFilesDone )
308305
309306 opts := pgalloc.LoadOpts {
@@ -314,7 +311,7 @@ func (mfl *AsyncMFLoader) backgroundGoroutine(pagesMetadataFD, pagesFileFD *fd.F
314311 timeline .Reached ("loading mainMF" )
315312 log .Infof ("Loading metadata for main MemoryFile: %p" , mainMF )
316313 ctx := context .Background ()
317- err : = mainMF .LoadFrom (ctx , pagesMetadata , & opts )
314+ err = mainMF .LoadFrom (ctx , pagesMetadata , & opts )
318315 mfl .metadataErr = err
319316 mfl .mainMetadataErr = err
320317 mfl .mainMFStartWg .Done ()
0 commit comments