containerd / containerd/cgroups

net_cls cgroup mounting

Open
#301 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
1.2k
Forks
252
PR merge metrics
No merged PRs in 30d

Description

Hello,

this code is not working
```
package main

import (
"github.com/containerd/cgroups/v3/cgroup1"
"github.com/opencontainers/runtime-spec/specs-go"
)

func uint32Ptr(v uint32) *uint32 {
return &v
}

func main() {
netClsController := cgroup1.NewNetCls("/sys/fs/cgroup")
err := netClsController.Create("foobar", &specs.LinuxResources{
Network: &specs.LinuxNetwork{
ClassID: uint32Ptr(0x00100010), //10:10
},
})

if err != nil {
panic(err)
}
}
```
but I think is equivalent of this:
```
mkdir /sys/fs/cgroup/net_cls
#mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
mkdir /sys/fs/cgroup/net_cls/foobar
echo 0x100010 > /sys/fs/cgroup/net_cls/foobar/net_cls.classid
```
except mounting part. We need mounting to get net_cls cgroup and to put classid into net_cls.classid.

I could not figure out if the package supports mounting, but if so, then how to force it to do that? If not, then I think it's an issue because `Create` creates and writes to `net_cls.classid` file so there is no place to put own mounting code between `NewNetCls` and `Create`.

To make Create work, the code should look something like this:
```
func (n *netclsController) Create(path string, resources *specs.LinuxResources) error {
if err := os.MkdirAll(path, defaultDirPerm); err != nil {
return err
}

if err := syscall.Mount("cgroup", n.root, "cgroup", 0, NetCls); err != nil {
if !errors.Is(err, syscall.EBUSY) { //could be already mounted and it's ok
// some other error
return err
}
}

if resources.Network != nil && resources.Network.ClassID != nil && *resources.Network.ClassID > 0 {
return os.WriteFile(
filepath.Join(n.Path(path), "net_cls.classid"),
[]byte(strconv.FormatUint(uint64(*resources.Network.ClassID), 10)),
defaultFilePerm,
)
}

return nil
}
```

version: github.com/containerd/cgroups/v3 v3.0.2

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.