github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/pkg/cgroup/cgroup_linux.go (about)

     1  package cgroup
     2  
     3  import (
     4  	"github.com/vishvananda/netns"
     5  	"golang.org/x/sys/unix"
     6  	"runtime"
     7  )
     8  
     9  func Init() error {
    10  	selfNs, err := netns.GetFromPath("/proc/self/ns/cgroup")
    11  	if err != nil {
    12  		return err
    13  	}
    14  	defer selfNs.Close()
    15  	hostNs, err := netns.GetFromPath("/proc/1/ns/cgroup")
    16  	if err != nil {
    17  		return err
    18  	}
    19  	defer hostNs.Close()
    20  	if selfNs.Equal(hostNs) {
    21  		return nil
    22  	}
    23  
    24  	runtime.LockOSThread()
    25  	defer runtime.UnlockOSThread()
    26  	if err := unix.Setns(int(hostNs), unix.CLONE_NEWCGROUP); err != nil {
    27  		return err
    28  	}
    29  
    30  	cg, err := NewFromProcessCgroupFile("/proc/self/cgroup")
    31  	if err != nil {
    32  		return err
    33  	}
    34  	baseCgroupPath = cg.Path
    35  
    36  	if err := unix.Setns(int(selfNs), unix.CLONE_NEWCGROUP); err != nil {
    37  		return err
    38  	}
    39  
    40  	return nil
    41  }