Skip to content

Commit 55a623d

Browse files
EtiennePerotgvisor-bot
authored andcommitted
starttime: Get process start time from /proc/self/status if possible.
This more accurately determines when the process was started, since it is not affected by the overhead of running linked library `init` code and initializing `runsc`'s CLI code. Additionally, when `runsc` execs itself, preserve this time across the exec. Also move the code that determines the start time earlier in the file. PiperOrigin-RevId: 741311782
1 parent d06b27e commit 55a623d

File tree

12 files changed

+1254
-163
lines changed

12 files changed

+1254
-163
lines changed

pkg/sentry/kernel/kernel.go

+5-93
Original file line numberDiff line numberDiff line change
@@ -579,30 +579,6 @@ func savePrivateMFs(ctx context.Context, w io.Writer, pw io.Writer, mfsToSave ma
579579
return nil
580580
}
581581

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-
606582
// SaveTo saves the state of k to w.
607583
//
608584
// Preconditions: The kernel must be paused throughout the call to SaveTo.
@@ -756,30 +732,11 @@ func (k *Kernel) invalidateUnsavableMappings(ctx context.Context) error {
756732
// LoadFrom returns a new Kernel loaded from args.
757733
//
758734
// 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 {
760736
loadStart := time.Now()
761737

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)
783740
}
784741

785742
k.runningTasksCond.L = &k.runningTasksMu
@@ -815,14 +772,8 @@ func (k *Kernel) LoadFrom(ctx context.Context, r, pagesMetadata io.Reader, pages
815772
log.Infof("Kernel load stats: %s", stats.String())
816773
log.Infof("Kernel load took [%s].", time.Since(kernelStart))
817774

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)
826777
}
827778

828779
if !saveRestoreNet {
@@ -874,45 +825,6 @@ func (k *Kernel) LoadFrom(ctx context.Context, r, pagesMetadata io.Reader, pages
874825
return nil
875826
}
876827

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-
916828
// UniqueID returns a unique identifier.
917829
func (k *Kernel) UniqueID() uint64 {
918830
id := k.uniqueID.Add(1)

0 commit comments

Comments
 (0)