From 44ed777c0f26b2280d8587830a3da35db1df89b6 Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Tue, 26 May 2020 00:28:28 -0700 Subject: [PATCH] pkg/cgroups: add methods to add and remove device from the cgroup add `AddDevice` and `RemoveDevice` to cgroup manager to allow adding and removing devices from the device cgroup Signed-off-by: Julio Montes Signed-off-by: Peng Tao --- .../virtcontainers/pkg/cgroups/manager.go | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/runtime/virtcontainers/pkg/cgroups/manager.go b/src/runtime/virtcontainers/pkg/cgroups/manager.go index 35a029f8cb..b3edc5b4df 100644 --- a/src/runtime/virtcontainers/pkg/cgroups/manager.go +++ b/src/runtime/virtcontainers/pkg/cgroups/manager.go @@ -319,3 +319,41 @@ func (m *Manager) Destroy() error { defer m.Unlock() return m.mgr.Destroy() } + +// AddDevice adds a device to the device cgroup +func (m *Manager) AddDevice(device string) error { + cgroups, err := m.GetCgroups() + if err != nil { + return err + } + + ld, err := DeviceToCgroupDevice(device) + if err != nil { + return err + } + + m.Lock() + cgroups.Devices = append(cgroups.Devices, ld) + m.Unlock() + + return m.Apply() +} + +// RemoceDevice removed a device from the device cgroup +func (m *Manager) RemoveDevice(device string) error { + cgroups, err := m.GetCgroups() + if err != nil { + return err + } + + m.Lock() + for i, d := range cgroups.Devices { + if d.Path == device { + cgroups.Devices = append(cgroups.Devices[:i], cgroups.Devices[i+1:]...) + m.Unlock() + return m.Apply() + } + } + m.Unlock() + return fmt.Errorf("device %v not found in the cgroup", device) +}