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 }