github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/pkg/sysinfo/sysinfo_solaris.go (about)

     1  // +build solaris,cgo
     2  
     3  package sysinfo
     4  
     5  import (
     6  	"bytes"
     7  	"os/exec"
     8  	"strconv"
     9  	"strings"
    10  )
    11  
    12  /*
    13  #cgo LDFLAGS: -llgrp
    14  #cgo CFLAGS: -Wall -Werror
    15  #include <unistd.h>
    16  #include <stdlib.h>
    17  #include <sys/lgrp_user.h>
    18  int getLgrpCount() {
    19  	lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE;
    20  	uint_t nlgrps;
    21  
    22  	if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) {
    23  		return -1;
    24  	}
    25  	nlgrps = lgrp_nlgrps(lgrpcookie);
    26  	return nlgrps;
    27  }
    28  */
    29  import "C"
    30  
    31  // IsCPUSharesAvailable returns whether CPUShares setting is supported.
    32  // We need FSS to be set as default scheduling class to support CPU Shares
    33  func IsCPUSharesAvailable() bool {
    34  	cmd := exec.Command("/usr/sbin/dispadmin", "-d")
    35  	outBuf := new(bytes.Buffer)
    36  	errBuf := new(bytes.Buffer)
    37  	cmd.Stderr = errBuf
    38  	cmd.Stdout = outBuf
    39  
    40  	if err := cmd.Run(); err != nil {
    41  		return false
    42  	}
    43  	return (strings.Contains(outBuf.String(), "FSS"))
    44  }
    45  
    46  // New returns a new SysInfo, using the filesystem to detect which features
    47  // the kernel supports.
    48  //NOTE Solaris: If we change the below capabilities be sure
    49  // to update verifyPlatformContainerSettings() in daemon_solaris.go
    50  func New(quiet bool) *SysInfo {
    51  	sysInfo := &SysInfo{}
    52  	sysInfo.cgroupMemInfo = setCgroupMem(quiet)
    53  	sysInfo.cgroupCPUInfo = setCgroupCPU(quiet)
    54  	sysInfo.cgroupBlkioInfo = setCgroupBlkioInfo(quiet)
    55  	sysInfo.cgroupCpusetInfo = setCgroupCPUsetInfo(quiet)
    56  
    57  	sysInfo.IPv4ForwardingDisabled = false
    58  
    59  	sysInfo.AppArmor = false
    60  
    61  	return sysInfo
    62  }
    63  
    64  // setCgroupMem reads the memory information for Solaris.
    65  func setCgroupMem(quiet bool) cgroupMemInfo {
    66  
    67  	return cgroupMemInfo{
    68  		MemoryLimit:       true,
    69  		SwapLimit:         true,
    70  		MemoryReservation: false,
    71  		OomKillDisable:    false,
    72  		MemorySwappiness:  false,
    73  		KernelMemory:      false,
    74  	}
    75  }
    76  
    77  // setCgroupCPU reads the cpu information for Solaris.
    78  func setCgroupCPU(quiet bool) cgroupCPUInfo {
    79  
    80  	return cgroupCPUInfo{
    81  		CPUShares:          true,
    82  		CPUCfsPeriod:       false,
    83  		CPUCfsQuota:        true,
    84  		CPURealtimePeriod:  false,
    85  		CPURealtimeRuntime: false,
    86  	}
    87  }
    88  
    89  // blkio switches are not supported in Solaris.
    90  func setCgroupBlkioInfo(quiet bool) cgroupBlkioInfo {
    91  
    92  	return cgroupBlkioInfo{
    93  		BlkioWeight:       false,
    94  		BlkioWeightDevice: false,
    95  	}
    96  }
    97  
    98  // setCgroupCPUsetInfo reads the cpuset information for Solaris.
    99  func setCgroupCPUsetInfo(quiet bool) cgroupCpusetInfo {
   100  
   101  	return cgroupCpusetInfo{
   102  		Cpuset: true,
   103  		Cpus:   getCPUCount(),
   104  		Mems:   getLgrpCount(),
   105  	}
   106  }
   107  
   108  func getCPUCount() string {
   109  	ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN)
   110  	if ncpus <= 0 {
   111  		return ""
   112  	}
   113  	return strconv.FormatInt(int64(ncpus), 16)
   114  }
   115  
   116  func getLgrpCount() string {
   117  	nlgrps := C.getLgrpCount()
   118  	if nlgrps <= 0 {
   119  		return ""
   120  	}
   121  	return strconv.FormatInt(int64(nlgrps), 16)
   122  }