From e2baa3ad109c399939e5b60bfa1ac830688bb0bf Mon Sep 17 00:00:00 2001 From: Ismo Puustinen Date: Tue, 18 Apr 2023 13:22:13 +0300 Subject: [PATCH] Intel RDT: update according to spec changes. There is one proposed clarification to the OCI spec: the subdirectory needs to be deleted. Runc already does that, but the clarification adds for directory removal only if the directory was created by us. Signed-off-by: Ismo Puustinen Signed-off-by: Aleksa Sarai --- docs/spec-conformance.md | 1 - libcontainer/intelrdt/intelrdt.go | 29 ++++++++++++++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/spec-conformance.md b/docs/spec-conformance.md index 220b7500c..dfbed0705 100644 --- a/docs/spec-conformance.md +++ b/docs/spec-conformance.md @@ -8,7 +8,6 @@ The following features are not implemented yet: Spec version | Feature | PR -------------|------------------------------------------------|---------------------------------------------------------- v1.1.0 | `SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV` | [#3862](https://github.com/opencontainers/runc/pull/3862) -v1.3.0 | Clarified interpretation of `linux.intelRdt` | [#3832](https://github.com/opencontainers/runc/pull/3832) v1.3.0 | Fail on a failure of a poststart hook. | [#4348](https://github.com/opencontainers/runc/pull/4348) ## Architectures diff --git a/libcontainer/intelrdt/intelrdt.go b/libcontainer/intelrdt/intelrdt.go index 3dcd71b7e..6c9156084 100644 --- a/libcontainer/intelrdt/intelrdt.go +++ b/libcontainer/intelrdt/intelrdt.go @@ -147,10 +147,11 @@ import ( */ type Manager struct { - mu sync.Mutex - config *configs.Config - id string - path string + mu sync.Mutex + config *configs.Config + id string + path string + directoryCreated bool } // NewManager returns a new instance of Manager, or nil if the Intel RDT @@ -186,9 +187,10 @@ func NewManager(config *configs.Config, id, path string) *Manager { // is actually available. Used by unit tests that mock intelrdt paths. func newManager(config *configs.Config, id, path string) *Manager { return &Manager{ - config: config, - id: id, - path: path, + config: config, + id: id, + path: path, + directoryCreated: false, } } @@ -460,6 +462,14 @@ func (m *Manager) Apply(pid int) (err error) { } } + // If the directory doesn't exist we need to create it -> it means we also need + // to clean it up afterwards. Make a note to the manager. + if _, err := os.Stat(path); err != nil { + if errors.Is(err, os.ErrNotExist) { + m.directoryCreated = true + } + } + if err := os.Mkdir(path, 0o755); err != nil && !errors.Is(err, os.ErrExist) { return newLastCmdError(err) } @@ -489,8 +499,9 @@ func (m *Manager) Destroy() error { } // Don't remove resctrl group if closid has been explicitly specified. The // group is likely externally managed, i.e. by some other entity than us. - // There are probably other containers/tasks sharing the same group. - if m.config.IntelRdt.ClosID == "" { + // There are probably other containers/tasks sharing the same group. Also + // only remove the directory if it was created by us. + if m.config.IntelRdt.ClosID == "" && m.directoryCreated { m.mu.Lock() defer m.mu.Unlock() if err := os.Remove(m.GetPath()); err != nil && !errors.Is(err, os.ErrNotExist) {