From 2549545df5ae003e3fdc1d3b662d7730f66f70aa Mon Sep 17 00:00:00 2001 From: Xiaochen Shen Date: Wed, 20 Sep 2017 00:13:29 +0800 Subject: [PATCH] intelrdt: always init IntelRdtManager if Intel RDT is enabled In current implementation: Either Intel RDT is not enabled by hardware and kernel, or intelRdt is not specified in original config, we don't init IntelRdtManager in the container to handle intelrdt constraint. It is a tradeoff that Intel RDT has hardware limitation to support only limited number of groups. This patch makes a minor change to support update command: Whether or not intelRdt is specified in config, we always init IntelRdtManager in the container if Intel RDT is enabled. If intelRdt is not specified in original config, we just don't Apply() to create intelrdt group or attach tasks for this container. In update command, we could re-enable through IntelRdtManager.Apply() and then update intelrdt constraint. Signed-off-by: Xiaochen Shen --- libcontainer/factory_linux.go | 6 ++---- libcontainer/intelrdt/intelrdt.go | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libcontainer/factory_linux.go b/libcontainer/factory_linux.go index 89deb96ef..83aeb8f1c 100644 --- a/libcontainer/factory_linux.go +++ b/libcontainer/factory_linux.go @@ -213,8 +213,7 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err newgidmapPath: l.NewgidmapPath, cgroupManager: l.NewCgroupsManager(config.Cgroups, nil), } - c.intelRdtManager = nil - if intelrdt.IsEnabled() && c.config.IntelRdt != nil { + if intelrdt.IsEnabled() { c.intelRdtManager = l.NewIntelRdtManager(config, id, "") } c.state = &stoppedState{c: c} @@ -256,8 +255,7 @@ func (l *LinuxFactory) Load(id string) (Container, error) { if err := c.refreshState(); err != nil { return nil, err } - c.intelRdtManager = nil - if intelrdt.IsEnabled() && c.config.IntelRdt != nil { + if intelrdt.IsEnabled() { 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 667625a10..ebb68f948 100644 --- a/libcontainer/intelrdt/intelrdt.go +++ b/libcontainer/intelrdt/intelrdt.go @@ -401,6 +401,10 @@ func GetIntelRdtPath(id string) (string, error) { // Applies Intel RDT configuration to the process with the specified pid func (m *IntelRdtManager) Apply(pid int) (err error) { + // If intelRdt is not specified in config, we do nothing + if m.Config.IntelRdt == nil { + return nil + } d, err := getIntelRdtData(m.Config, pid) if err != nil && !IsNotFound(err) { return err