From 8eeba7d5479136186ad9c5f4b849a306d53fa643 Mon Sep 17 00:00:00 2001 From: Xiaochen Shen Date: Sun, 25 Oct 2020 20:40:36 +0800 Subject: [PATCH] libcontainer/intelrdt: rm init() from intelrdt.go Use sync.Once to init Intel RDT when needed for a small speedup to operations which do not require Intel RDT. Simplify IntelRdtManager initialization in LinuxFactory. Signed-off-by: Xiaochen Shen --- libcontainer/factory_linux.go | 17 +++--- libcontainer/intelrdt/intelrdt.go | 88 ++++++++++++++++--------------- utils_linux.go | 4 -- 3 files changed, 57 insertions(+), 52 deletions(-) diff --git a/libcontainer/factory_linux.go b/libcontainer/factory_linux.go index 7a65dcf6a3e..e1c26329ba9 100644 --- a/libcontainer/factory_linux.go +++ b/libcontainer/factory_linux.go @@ -148,8 +148,13 @@ func RootlessCgroupfs(l *LinuxFactory) error { // containers that use the Intel RDT "resource control" filesystem to // create and manage Intel RDT resources (e.g., L3 cache, memory bandwidth). func IntelRdtFs(l *LinuxFactory) error { - l.NewIntelRdtManager = func(config *configs.Config, id string, path string) intelrdt.Manager { - return intelrdt.NewManager(config, id, path) + intelrdt.Init() + if !intelrdt.IsCATEnabled() && !intelrdt.IsMBAEnabled() { + l.NewIntelRdtManager = nil + } else { + l.NewIntelRdtManager = func(config *configs.Config, id string, path string) intelrdt.Manager { + return intelrdt.NewManager(config, id, path) + } } return nil } @@ -272,7 +277,7 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err newgidmapPath: l.NewgidmapPath, cgroupManager: l.NewCgroupsManager(config.Cgroups, nil), } - if intelrdt.IsCATEnabled() || intelrdt.IsMBAEnabled() { + if l.NewIntelRdtManager != nil { c.intelRdtManager = l.NewIntelRdtManager(config, id, "") } c.state = &stoppedState{c: c} @@ -314,13 +319,13 @@ func (l *LinuxFactory) Load(id string) (Container, error) { root: containerRoot, created: state.Created, } + if l.NewIntelRdtManager != nil { + c.intelRdtManager = l.NewIntelRdtManager(&state.Config, id, state.IntelRdtPath) + } c.state = &loadedState{c: c} if err := c.refreshState(); err != nil { return nil, err } - if intelrdt.IsCATEnabled() || intelrdt.IsMBAEnabled() { - c.intelRdtManager = l.NewIntelRdtManager(&state.Config, id, state.IntelRdtPath) - } return c, nil } diff --git a/libcontainer/intelrdt/intelrdt.go b/libcontainer/intelrdt/intelrdt.go index 1afcbe80c5c..c082e4b08ed 100644 --- a/libcontainer/intelrdt/intelrdt.go +++ b/libcontainer/intelrdt/intelrdt.go @@ -195,6 +195,9 @@ var ( mbaEnabled bool // The flag to indicate if Intel RDT/MBA Software Controller is enabled mbaScEnabled bool + + // For Intel RDT initialization + initOnce sync.Once ) type intelRdtData struct { @@ -203,55 +206,56 @@ type intelRdtData struct { pid int } -// Check if Intel RDT sub-features are enabled in init() -func init() { - // 1. Check if hardware and kernel support Intel RDT sub-features - flagsSet, err := parseCpuInfoFile("/proc/cpuinfo") - if err != nil { - return - } - - // 2. Check if Intel RDT "resource control" filesystem is mounted - // The user guarantees to mount the filesystem - if !isIntelRdtMounted() { - return - } - - // 3. Double check if Intel RDT sub-features are available in - // "resource control" filesystem. Intel RDT sub-features can be - // selectively disabled or enabled by kernel command line - // (e.g., rdt=!l3cat,mba) in 4.14 and newer kernel - if flagsSet.CAT { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3")); err == nil { - catEnabled = true - } - } - if mbaScEnabled { - // We confirm MBA Software Controller is enabled in step 2, - // MBA should be enabled because MBA Software Controller - // depends on MBA - mbaEnabled = true - } else if flagsSet.MBA { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "MB")); err == nil { - mbaEnabled = true +// Check if Intel RDT sub-features are enabled in Init() +func Init() { + initOnce.Do(func() { + // 1. Check if hardware and kernel support Intel RDT sub-features + flagsSet, err := parseCpuInfoFile("/proc/cpuinfo") + if err != nil { + return } - } - if flagsSet.MBMTotal || flagsSet.MBMLocal || flagsSet.CMT { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3_MON")); err != nil { + // 2. Check if Intel RDT "resource control" filesystem is mounted + // The user guarantees to mount the filesystem + if !isIntelRdtMounted() { return } - enabledMonFeatures, err = getMonFeatures(intelRdtRoot) - if err != nil { - return + + // 3. Double check if Intel RDT sub-features are available in + // "resource control" filesystem. Intel RDT sub-features can be + // selectively disabled or enabled by kernel command line + // (e.g., rdt=!l3cat,mba) in 4.14 and newer kernel + if flagsSet.CAT { + if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3")); err == nil { + catEnabled = true + } } - if enabledMonFeatures.mbmTotalBytes || enabledMonFeatures.mbmLocalBytes { - mbmEnabled = true + if mbaScEnabled { + // We confirm MBA Software Controller is enabled in step 2, + // MBA should be enabled because MBA Software Controller + // depends on MBA + mbaEnabled = true + } else if flagsSet.MBA { + if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "MB")); err == nil { + mbaEnabled = true + } } - if enabledMonFeatures.llcOccupancy { - cmtEnabled = true + if flagsSet.MBMTotal || flagsSet.MBMLocal || flagsSet.CMT { + if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3_MON")); err != nil { + return + } + enabledMonFeatures, err = getMonFeatures(intelRdtRoot) + if err != nil { + return + } + if enabledMonFeatures.mbmTotalBytes || enabledMonFeatures.mbmLocalBytes { + mbmEnabled = true + } + if enabledMonFeatures.llcOccupancy { + cmtEnabled = true + } } - } + }) } // Return the mount point path of Intel RDT "resource control" filesysem diff --git a/utils_linux.go b/utils_linux.go index f3f81ffa2e6..f15537fa7f8 100644 --- a/utils_linux.go +++ b/utils_linux.go @@ -13,7 +13,6 @@ import ( "github.com/opencontainers/runc/libcontainer" "github.com/opencontainers/runc/libcontainer/cgroups/systemd" "github.com/opencontainers/runc/libcontainer/configs" - "github.com/opencontainers/runc/libcontainer/intelrdt" "github.com/opencontainers/runc/libcontainer/specconv" "github.com/opencontainers/runc/libcontainer/utils" "github.com/opencontainers/runtime-spec/specs-go" @@ -57,9 +56,6 @@ func loadFactory(context *cli.Context) (libcontainer.Factory, error) { } intelRdtManager := libcontainer.IntelRdtFs - if !intelrdt.IsCATEnabled() && !intelrdt.IsMBAEnabled() { - intelRdtManager = nil - } // We resolve the paths for {newuidmap,newgidmap} from the context of runc, // to avoid doing a path lookup in the nsexec context. TODO: The binary