@@ -579,30 +579,6 @@ func savePrivateMFs(ctx context.Context, w io.Writer, pw io.Writer, mfsToSave ma
579
579
return nil
580
580
}
581
581
582
- func loadPrivateMFs (ctx context.Context , r io.Reader , opts * pgalloc.LoadOpts ) error {
583
- // Load the metadata.
584
- var meta privateMemoryFileMetadata
585
- if _ , err := state .Load (ctx , r , & meta ); err != nil {
586
- return err
587
- }
588
- mfmap := pgalloc .MemoryFileMapFromContext (ctx )
589
- // Ensure that it is consistent with CtxFilesystemMemoryFileMap.
590
- if len (mfmap ) != len (meta .owners ) {
591
- return fmt .Errorf ("inconsistent private memory files on restore: savedMFOwners = %v, CtxFilesystemMemoryFileMap = %v" , meta .owners , mfmap )
592
- }
593
- // Load all private memory files.
594
- for _ , fsID := range meta .owners {
595
- mf , ok := mfmap [fsID ]
596
- if ! ok {
597
- return fmt .Errorf ("saved memory file for %q was not configured on restore" , fsID )
598
- }
599
- if err := mf .LoadFrom (ctx , r , opts ); err != nil {
600
- return err
601
- }
602
- }
603
- return nil
604
- }
605
-
606
582
// SaveTo saves the state of k to w.
607
583
//
608
584
// Preconditions: The kernel must be paused throughout the call to SaveTo.
@@ -756,30 +732,11 @@ func (k *Kernel) invalidateUnsavableMappings(ctx context.Context) error {
756
732
// LoadFrom returns a new Kernel loaded from args.
757
733
//
758
734
// LoadFrom takes ownership of pagesFile.
759
- func (k * Kernel ) LoadFrom (ctx context.Context , r , pagesMetadata io.Reader , pagesFile * fd. FD , background bool , timeReady chan struct {}, net inet.Stack , clocks sentrytime.Clocks , vfsOpts * vfs.CompleteRestoreOptions , saveRestoreNet bool ) error {
735
+ func (k * Kernel ) LoadFrom (ctx context.Context , r io.Reader , pfl PagesFileLoader , background bool , timeReady chan struct {}, net inet.Stack , clocks sentrytime.Clocks , vfsOpts * vfs.CompleteRestoreOptions , saveRestoreNet bool ) error {
760
736
loadStart := time .Now ()
761
737
762
- defer func () {
763
- if pagesFile != nil {
764
- pagesFile .Close ()
765
- }
766
- }()
767
- var (
768
- mfLoadWg sync.WaitGroup
769
- mfLoadErr error
770
- )
771
- parallelMfLoad := pagesMetadata != nil && pagesFile != nil
772
- if parallelMfLoad {
773
- // Parallelize MemoryFile load and kernel load. Both are independent.
774
- mfLoadWg .Add (1 )
775
- go func () {
776
- defer mfLoadWg .Done ()
777
- mfLoadErr = k .loadMemoryFiles (ctx , r , pagesMetadata , pagesFile , background )
778
- pagesFile = nil // transferred to k.loadMemoryFiles()
779
- }()
780
- // Defer a Wait() so we wait for k.loadMemoryFiles() to complete even if we
781
- // error out without reaching the other Wait() below.
782
- defer mfLoadWg .Wait ()
738
+ if err := pfl .KickoffAll (ctx , k .mf ); err != nil {
739
+ return fmt .Errorf ("failed to load memory files: %w" , err )
783
740
}
784
741
785
742
k .runningTasksCond .L = & k .runningTasksMu
@@ -815,14 +772,8 @@ func (k *Kernel) LoadFrom(ctx context.Context, r, pagesMetadata io.Reader, pages
815
772
log .Infof ("Kernel load stats: %s" , stats .String ())
816
773
log .Infof ("Kernel load took [%s]." , time .Since (kernelStart ))
817
774
818
- if parallelMfLoad {
819
- mfLoadWg .Wait ()
820
- } else {
821
- mfLoadErr = k .loadMemoryFiles (ctx , r , pagesMetadata , pagesFile , background )
822
- pagesFile = nil // transferred to k.loadMemoryFiles()
823
- }
824
- if mfLoadErr != nil {
825
- return fmt .Errorf ("failed to load memory files: %w" , mfLoadErr )
775
+ if err := pfl .Load (ctx , k .mf , background ); err != nil {
776
+ return fmt .Errorf ("failed to load memory files: %w" , err )
826
777
}
827
778
828
779
if ! saveRestoreNet {
@@ -874,45 +825,6 @@ func (k *Kernel) LoadFrom(ctx context.Context, r, pagesMetadata io.Reader, pages
874
825
return nil
875
826
}
876
827
877
- // loadMemoryFiles takes ownership of pagesFile.
878
- func (k * Kernel ) loadMemoryFiles (ctx context.Context , r , pagesMetadata io.Reader , pagesFile * fd.FD , background bool ) error {
879
- memoryStart := time .Now ()
880
- pmr := r
881
- if pagesMetadata != nil {
882
- pmr = pagesMetadata
883
- }
884
- var (
885
- pagesFileUsers atomicbitops.Int64
886
- asyncPageLoadWG sync.WaitGroup
887
- )
888
- opts := pgalloc.LoadOpts {
889
- PagesFile : pagesFile ,
890
- OnAsyncPageLoadStart : func () {
891
- pagesFileUsers .Add (1 )
892
- asyncPageLoadWG .Add (1 )
893
- },
894
- OnAsyncPageLoadDone : func (error ) {
895
- if n := pagesFileUsers .Add (- 1 ); n == 0 {
896
- pagesFile .Close ()
897
- } else if n < 0 {
898
- panic ("pagesFileUsers < 0" )
899
- }
900
- asyncPageLoadWG .Done ()
901
- },
902
- }
903
- if err := k .mf .LoadFrom (ctx , pmr , & opts ); err != nil {
904
- return err
905
- }
906
- if err := loadPrivateMFs (ctx , pmr , & opts ); err != nil {
907
- return err
908
- }
909
- if ! background {
910
- asyncPageLoadWG .Wait ()
911
- }
912
- log .Infof ("Memory files load took [%s]." , time .Since (memoryStart ))
913
- return nil
914
- }
915
-
916
828
// UniqueID returns a unique identifier.
917
829
func (k * Kernel ) UniqueID () uint64 {
918
830
id := k .uniqueID .Add (1 )
0 commit comments