github.com/cilium/ebpf@v0.10.0/internal/testutils/cgroup.go (about) 1 package testutils 2 3 import ( 4 "errors" 5 "os" 6 "strings" 7 "sync" 8 "testing" 9 10 "golang.org/x/sys/unix" 11 ) 12 13 var cgroup2 = struct { 14 once sync.Once 15 path string 16 err error 17 }{} 18 19 func cgroup2Path() (string, error) { 20 cgroup2.once.Do(func() { 21 mounts, err := os.ReadFile("/proc/mounts") 22 if err != nil { 23 cgroup2.err = err 24 return 25 } 26 27 for _, line := range strings.Split(string(mounts), "\n") { 28 mount := strings.SplitN(line, " ", 3) 29 if mount[0] == "cgroup2" { 30 cgroup2.path = mount[1] 31 return 32 } 33 34 continue 35 } 36 37 cgroup2.err = errors.New("cgroup2 not mounted") 38 }) 39 40 if cgroup2.err != nil { 41 return "", cgroup2.err 42 } 43 44 return cgroup2.path, nil 45 } 46 47 func CreateCgroup(tb testing.TB) *os.File { 48 tb.Helper() 49 50 cg2, err := cgroup2Path() 51 if err != nil { 52 tb.Fatal("Can't locate cgroup2 mount:", err) 53 } 54 55 cgdir, err := os.MkdirTemp(cg2, "ebpf-link") 56 if err != nil { 57 tb.Fatal("Can't create cgroupv2:", err) 58 } 59 60 cgroup, err := os.Open(cgdir) 61 if err != nil { 62 os.Remove(cgdir) 63 tb.Fatal(err) 64 } 65 tb.Cleanup(func() { 66 cgroup.Close() 67 os.Remove(cgdir) 68 }) 69 70 return cgroup 71 } 72 73 func GetCgroupIno(t *testing.T, cgroup *os.File) uint64 { 74 cgroupStat := unix.Stat_t{} 75 err := unix.Fstat(int(cgroup.Fd()), &cgroupStat) 76 if err != nil { 77 t.Fatal(err) 78 } 79 80 return cgroupStat.Ino 81 }