120 lines
2.6 KiB
Go
120 lines
2.6 KiB
Go
|
// +build solaris,cgo
|
||
|
|
||
|
package sysinfo
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"os/exec"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
/*
|
||
|
#cgo LDFLAGS: -llgrp
|
||
|
#include <unistd.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <sys/lgrp_user.h>
|
||
|
int getLgrpCount() {
|
||
|
lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE;
|
||
|
uint_t nlgrps;
|
||
|
|
||
|
if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) {
|
||
|
return -1;
|
||
|
}
|
||
|
nlgrps = lgrp_nlgrps(lgrpcookie);
|
||
|
return nlgrps;
|
||
|
}
|
||
|
*/
|
||
|
import "C"
|
||
|
|
||
|
// IsCPUSharesAvailable returns whether CPUShares setting is supported.
|
||
|
// We need FSS to be set as default scheduling class to support CPU Shares
|
||
|
func IsCPUSharesAvailable() bool {
|
||
|
cmd := exec.Command("/usr/sbin/dispadmin", "-d")
|
||
|
outBuf := new(bytes.Buffer)
|
||
|
errBuf := new(bytes.Buffer)
|
||
|
cmd.Stderr = errBuf
|
||
|
cmd.Stdout = outBuf
|
||
|
|
||
|
if err := cmd.Run(); err != nil {
|
||
|
return false
|
||
|
}
|
||
|
return (strings.Contains(outBuf.String(), "FSS"))
|
||
|
}
|
||
|
|
||
|
// New returns a new SysInfo, using the filesystem to detect which features
|
||
|
// the kernel supports.
|
||
|
//NOTE Solaris: If we change the below capabilities be sure
|
||
|
// to update verifyPlatformContainerSettings() in daemon_solaris.go
|
||
|
func New(quiet bool) *SysInfo {
|
||
|
sysInfo := &SysInfo{}
|
||
|
sysInfo.cgroupMemInfo = setCgroupMem(quiet)
|
||
|
sysInfo.cgroupCPUInfo = setCgroupCPU(quiet)
|
||
|
sysInfo.cgroupBlkioInfo = setCgroupBlkioInfo(quiet)
|
||
|
sysInfo.cgroupCpusetInfo = setCgroupCPUsetInfo(quiet)
|
||
|
|
||
|
sysInfo.IPv4ForwardingDisabled = false
|
||
|
|
||
|
sysInfo.AppArmor = false
|
||
|
|
||
|
return sysInfo
|
||
|
}
|
||
|
|
||
|
// setCgroupMem reads the memory information for Solaris.
|
||
|
func setCgroupMem(quiet bool) cgroupMemInfo {
|
||
|
|
||
|
return cgroupMemInfo{
|
||
|
MemoryLimit: true,
|
||
|
SwapLimit: true,
|
||
|
MemoryReservation: false,
|
||
|
OomKillDisable: false,
|
||
|
MemorySwappiness: false,
|
||
|
KernelMemory: false,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// setCgroupCPU reads the cpu information for Solaris.
|
||
|
func setCgroupCPU(quiet bool) cgroupCPUInfo {
|
||
|
|
||
|
return cgroupCPUInfo{
|
||
|
CPUShares: true,
|
||
|
CPUCfsPeriod: false,
|
||
|
CPUCfsQuota: true,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// blkio switches are not supported in Solaris.
|
||
|
func setCgroupBlkioInfo(quiet bool) cgroupBlkioInfo {
|
||
|
|
||
|
return cgroupBlkioInfo{
|
||
|
BlkioWeight: false,
|
||
|
BlkioWeightDevice: false,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// setCgroupCPUsetInfo reads the cpuset information for Solaris.
|
||
|
func setCgroupCPUsetInfo(quiet bool) cgroupCpusetInfo {
|
||
|
|
||
|
return cgroupCpusetInfo{
|
||
|
Cpuset: true,
|
||
|
Cpus: getCPUCount(),
|
||
|
Mems: getLgrpCount(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func getCPUCount() string {
|
||
|
ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN)
|
||
|
if ncpus <= 0 {
|
||
|
return ""
|
||
|
}
|
||
|
return strconv.FormatInt(int64(ncpus), 16)
|
||
|
}
|
||
|
|
||
|
func getLgrpCount() string {
|
||
|
nlgrps := C.getLgrpCount()
|
||
|
if nlgrps <= 0 {
|
||
|
return ""
|
||
|
}
|
||
|
return strconv.FormatInt(int64(nlgrps), 16)
|
||
|
}
|