github.com/sams1990/dockerrepo@v17.12.1-ce-rc2+incompatible/pkg/sysinfo/sysinfo.go (about) 1 package sysinfo 2 3 import "github.com/docker/docker/pkg/parsers" 4 5 // SysInfo stores information about which features a kernel supports. 6 // TODO Windows: Factor out platform specific capabilities. 7 type SysInfo struct { 8 // Whether the kernel supports AppArmor or not 9 AppArmor bool 10 // Whether the kernel supports Seccomp or not 11 Seccomp bool 12 13 cgroupMemInfo 14 cgroupCPUInfo 15 cgroupBlkioInfo 16 cgroupCpusetInfo 17 cgroupPids 18 19 // Whether IPv4 forwarding is supported or not, if this was disabled, networking will not work 20 IPv4ForwardingDisabled bool 21 22 // Whether bridge-nf-call-iptables is supported or not 23 BridgeNFCallIPTablesDisabled bool 24 25 // Whether bridge-nf-call-ip6tables is supported or not 26 BridgeNFCallIP6TablesDisabled bool 27 28 // Whether the cgroup has the mountpoint of "devices" or not 29 CgroupDevicesEnabled bool 30 } 31 32 type cgroupMemInfo struct { 33 // Whether memory limit is supported or not 34 MemoryLimit bool 35 36 // Whether swap limit is supported or not 37 SwapLimit bool 38 39 // Whether soft limit is supported or not 40 MemoryReservation bool 41 42 // Whether OOM killer disable is supported or not 43 OomKillDisable bool 44 45 // Whether memory swappiness is supported or not 46 MemorySwappiness bool 47 48 // Whether kernel memory limit is supported or not 49 KernelMemory bool 50 } 51 52 type cgroupCPUInfo struct { 53 // Whether CPU shares is supported or not 54 CPUShares bool 55 56 // Whether CPU CFS(Completely Fair Scheduler) period is supported or not 57 CPUCfsPeriod bool 58 59 // Whether CPU CFS(Completely Fair Scheduler) quota is supported or not 60 CPUCfsQuota bool 61 62 // Whether CPU real-time period is supported or not 63 CPURealtimePeriod bool 64 65 // Whether CPU real-time runtime is supported or not 66 CPURealtimeRuntime bool 67 } 68 69 type cgroupBlkioInfo struct { 70 // Whether Block IO weight is supported or not 71 BlkioWeight bool 72 73 // Whether Block IO weight_device is supported or not 74 BlkioWeightDevice bool 75 76 // Whether Block IO read limit in bytes per second is supported or not 77 BlkioReadBpsDevice bool 78 79 // Whether Block IO write limit in bytes per second is supported or not 80 BlkioWriteBpsDevice bool 81 82 // Whether Block IO read limit in IO per second is supported or not 83 BlkioReadIOpsDevice bool 84 85 // Whether Block IO write limit in IO per second is supported or not 86 BlkioWriteIOpsDevice bool 87 } 88 89 type cgroupCpusetInfo struct { 90 // Whether Cpuset is supported or not 91 Cpuset bool 92 93 // Available Cpuset's cpus 94 Cpus string 95 96 // Available Cpuset's memory nodes 97 Mems string 98 } 99 100 type cgroupPids struct { 101 // Whether Pids Limit is supported or not 102 PidsLimit bool 103 } 104 105 // IsCpusetCpusAvailable returns `true` if the provided string set is contained 106 // in cgroup's cpuset.cpus set, `false` otherwise. 107 // If error is not nil a parsing error occurred. 108 func (c cgroupCpusetInfo) IsCpusetCpusAvailable(provided string) (bool, error) { 109 return isCpusetListAvailable(provided, c.Cpus) 110 } 111 112 // IsCpusetMemsAvailable returns `true` if the provided string set is contained 113 // in cgroup's cpuset.mems set, `false` otherwise. 114 // If error is not nil a parsing error occurred. 115 func (c cgroupCpusetInfo) IsCpusetMemsAvailable(provided string) (bool, error) { 116 return isCpusetListAvailable(provided, c.Mems) 117 } 118 119 func isCpusetListAvailable(provided, available string) (bool, error) { 120 parsedProvided, err := parsers.ParseUintList(provided) 121 if err != nil { 122 return false, err 123 } 124 parsedAvailable, err := parsers.ParseUintList(available) 125 if err != nil { 126 return false, err 127 } 128 for k := range parsedProvided { 129 if !parsedAvailable[k] { 130 return false, nil 131 } 132 } 133 return true, nil 134 } 135 136 // Returns bit count of 1, used by NumCPU 137 func popcnt(x uint64) (n byte) { 138 x -= (x >> 1) & 0x5555555555555555 139 x = (x>>2)&0x3333333333333333 + x&0x3333333333333333 140 x += x >> 4 141 x &= 0x0f0f0f0f0f0f0f0f 142 x *= 0x0101010101010101 143 return byte(x >> 56) 144 }