| package sysinfo |
| |
| import "github.com/docker/docker/pkg/parsers" |
| |
| // SysInfo stores information about which features a kernel supports. |
| // TODO Windows: Factor out platform specific capabilities. |
| type SysInfo struct { |
| // Whether the kernel supports AppArmor or not |
| AppArmor bool |
| // Whether the kernel supports Seccomp or not |
| Seccomp bool |
| |
| cgroupMemInfo |
| cgroupCPUInfo |
| cgroupBlkioInfo |
| cgroupCpusetInfo |
| cgroupPids |
| |
| // Whether IPv4 forwarding is supported or not, if this was disabled, networking will not work |
| IPv4ForwardingDisabled bool |
| |
| // Whether bridge-nf-call-iptables is supported or not |
| BridgeNFCallIPTablesDisabled bool |
| |
| // Whether bridge-nf-call-ip6tables is supported or not |
| BridgeNFCallIP6TablesDisabled bool |
| |
| // Whether the cgroup has the mountpoint of "devices" or not |
| CgroupDevicesEnabled bool |
| } |
| |
| type cgroupMemInfo struct { |
| // Whether memory limit is supported or not |
| MemoryLimit bool |
| |
| // Whether swap limit is supported or not |
| SwapLimit bool |
| |
| // Whether soft limit is supported or not |
| MemoryReservation bool |
| |
| // Whether OOM killer disable is supported or not |
| OomKillDisable bool |
| |
| // Whether memory swappiness is supported or not |
| MemorySwappiness bool |
| |
| // Whether kernel memory limit is supported or not |
| KernelMemory bool |
| } |
| |
| type cgroupCPUInfo struct { |
| // Whether CPU shares is supported or not |
| CPUShares bool |
| |
| // Whether CPU CFS(Completely Fair Scheduler) period is supported or not |
| CPUCfsPeriod bool |
| |
| // Whether CPU CFS(Completely Fair Scheduler) quota is supported or not |
| CPUCfsQuota bool |
| |
| // Whether CPU real-time period is supported or not |
| CPURealtimePeriod bool |
| |
| // Whether CPU real-time runtime is supported or not |
| CPURealtimeRuntime bool |
| } |
| |
| type cgroupBlkioInfo struct { |
| // Whether Block IO weight is supported or not |
| BlkioWeight bool |
| |
| // Whether Block IO weight_device is supported or not |
| BlkioWeightDevice bool |
| |
| // Whether Block IO read limit in bytes per second is supported or not |
| BlkioReadBpsDevice bool |
| |
| // Whether Block IO write limit in bytes per second is supported or not |
| BlkioWriteBpsDevice bool |
| |
| // Whether Block IO read limit in IO per second is supported or not |
| BlkioReadIOpsDevice bool |
| |
| // Whether Block IO write limit in IO per second is supported or not |
| BlkioWriteIOpsDevice bool |
| } |
| |
| type cgroupCpusetInfo struct { |
| // Whether Cpuset is supported or not |
| Cpuset bool |
| |
| // Available Cpuset's cpus |
| Cpus string |
| |
| // Available Cpuset's memory nodes |
| Mems string |
| } |
| |
| type cgroupPids struct { |
| // Whether Pids Limit is supported or not |
| PidsLimit bool |
| } |
| |
| // IsCpusetCpusAvailable returns `true` if the provided string set is contained |
| // in cgroup's cpuset.cpus set, `false` otherwise. |
| // If error is not nil a parsing error occurred. |
| func (c cgroupCpusetInfo) IsCpusetCpusAvailable(provided string) (bool, error) { |
| return isCpusetListAvailable(provided, c.Cpus) |
| } |
| |
| // IsCpusetMemsAvailable returns `true` if the provided string set is contained |
| // in cgroup's cpuset.mems set, `false` otherwise. |
| // If error is not nil a parsing error occurred. |
| func (c cgroupCpusetInfo) IsCpusetMemsAvailable(provided string) (bool, error) { |
| return isCpusetListAvailable(provided, c.Mems) |
| } |
| |
| func isCpusetListAvailable(provided, available string) (bool, error) { |
| parsedProvided, err := parsers.ParseUintList(provided) |
| if err != nil { |
| return false, err |
| } |
| parsedAvailable, err := parsers.ParseUintList(available) |
| if err != nil { |
| return false, err |
| } |
| for k := range parsedProvided { |
| if !parsedAvailable[k] { |
| return false, nil |
| } |
| } |
| return true, nil |
| } |
| |
| // Returns bit count of 1, used by NumCPU |
| func popcnt(x uint64) (n byte) { |
| x -= (x >> 1) & 0x5555555555555555 |
| x = (x>>2)&0x3333333333333333 + x&0x3333333333333333 |
| x += x >> 4 |
| x &= 0x0f0f0f0f0f0f0f0f |
| x *= 0x0101010101010101 |
| return byte(x >> 56) |
| } |