From 620f4c5c8838b30fae84e51cbf086dc053203ee2 Mon Sep 17 00:00:00 2001 From: Xiaochen Shen Date: Sun, 25 Oct 2020 20:40:02 +0800 Subject: [PATCH] libcontainer/intelrdt: fix CMT feature check Intel RDT sub-features can be selectively disabled or enabled by kernel command line. See "rdt=" option details in kernel document: https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt But Cache Monitoring Technology (CMT) feature is not correctly checked in init() and getCMTNumaNodeStats() now. If CMT is disabled by kernel command line (e.g., rdt=!cmt,mbmtotal,mbmlocal,l3cat,mba) while hardware supports CMT, we may get following error when getting Intel RDT stats: runc run c1 runc events c1 ERRO[0005] container_linux.go:200: getting container's Intel RDT stats caused: open /sys/fs/resctrl/c1/mon_data/mon_L3_00/llc_occupancy: no such file or directory Fix CMT feature check in init() and GetStats() call paths. Signed-off-by: Xiaochen Shen --- libcontainer/intelrdt/cmt.go | 10 ++++++---- libcontainer/intelrdt/intelrdt.go | 26 ++++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/libcontainer/intelrdt/cmt.go b/libcontainer/intelrdt/cmt.go index 5c406e10207..aba8b98e4f9 100644 --- a/libcontainer/intelrdt/cmt.go +++ b/libcontainer/intelrdt/cmt.go @@ -12,11 +12,13 @@ func IsCMTEnabled() bool { func getCMTNumaNodeStats(numaPath string) (*CMTNumaNodeStats, error) { stats := &CMTNumaNodeStats{} - llcOccupancy, err := getIntelRdtParamUint(numaPath, "llc_occupancy") - if err != nil { - return nil, err + if enabledMonFeatures.llcOccupancy { + llcOccupancy, err := getIntelRdtParamUint(numaPath, "llc_occupancy") + if err != nil { + return nil, err + } + stats.LLCOccupancy = llcOccupancy } - stats.LLCOccupancy = llcOccupancy return stats, nil } diff --git a/libcontainer/intelrdt/intelrdt.go b/libcontainer/intelrdt/intelrdt.go index 31a234f02d6..5f42b02e1af 100644 --- a/libcontainer/intelrdt/intelrdt.go +++ b/libcontainer/intelrdt/intelrdt.go @@ -237,16 +237,20 @@ func init() { } } - if flagsSet.MBMTotal || flagsSet.MBMLocal { - if _, err := os.Stat(filepath.Join(intelRdtRoot, "info", "L3_MON")); err == nil { - mbmEnabled = true - 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 + } } } @@ -313,6 +317,8 @@ type cpuInfoFlags struct { // Memory Bandwidth Monitoring related. MBMTotal bool MBMLocal bool + + CMT bool // Cache Monitoring Technology } func parseCpuInfoFile(path string) (cpuInfoFlags, error) { @@ -342,6 +348,8 @@ func parseCpuInfoFile(path string) (cpuInfoFlags, error) { infoFlags.MBMTotal = true case "cqm_mbm_local": infoFlags.MBMLocal = true + case "cqm_occup_llc": + infoFlags.CMT = true } } return infoFlags, nil @@ -659,9 +667,11 @@ func (m *intelRdtManager) GetStats() (*Stats, error) { } } - err = getMonitoringStats(containerPath, stats) - if err != nil { - return nil, err + if IsMBMEnabled() || IsCMTEnabled() { + err = getMonitoringStats(containerPath, stats) + if err != nil { + return nil, err + } } return stats, nil