Update cgroups to 1152b960fcee041f50df15cdc67c29db
``` 1152b960fcee041f50df15cdc67c29dbccf801ef (HEAD -> master, origin/master) Merge pull request #73 from gliptak/gofmt1 afd5981a16647b45b6dba3a50a88418b576cc17d Gofmt cgroup_test 65ce98b3dfeb0a9a8fecd7e4ebffb24ad0bfe28f Merge pull request #69 from cclerget/master-weight-pointer 0f372c6d4a65a49c72b0afbd1aee6214637958bf Merge pull request #71 from JoeWrightss/patch-1 f48bd85c9cbc306fada0cebc3a646a1f1fe99afe Fixs return error message 10cd53efd916e22b9bdea67223d287684f57f1f4 Merge pull request #70 from gliptak/patch-1 64bade4cea6c438ee51a7a12528225946b42c6ca Take value instead of pointer value b49c4713f3824e81bfa67faddcdde1414171b54e Correct ineffassign warning 3bc6dde829bc2dc8d4097ce8ad5acc275de3df06 Merge pull request #68 from cclerget/master-net_prio-typo 6b552a86e60e31903d3f8f3f494eda71f562cc54 Fix net_prio typo c0437c3dd5958f74d7f54e9f5def749850b9d6a1 Merge pull request #67 from gpanouts/get-all-cgroup-tasks a31a0ff985237eddf30d9fe30a3643c7da4ae912 Add functionality for retrieving all tasks of a cgroup 82cb49fc1779971dfef4ad696f1453f6f44987b1 Merge pull request #63 from ChrsMark/lenient-subsystems-checking 7d825b29aecc02bb1e9bede427f8ed62bbc3030d Add test for cgroups load when missing hierarchy in one subsystem f6cbfb45aec6a2590c7e7f4b84a080602b3e642d Change Load function in order to be more lenient on subsystems' checking 965bb1da4db7c8ce2690108c5a081562ce7493cb Merge pull request #66 from crosbymichael/systemdci ab9ec0e4abde2c2cb999719ff43af2d3b5830f75 (fork/systemdci, systemdci) Add go-systemd dep for CI testing 0e94a83b6eb6cf4bc05d7f91ec1eaad57a77d3b6 Merge pull request #59 from gliptak/patch-1 4479d118c89b5500a08cce7a78bbe822229c1e65 Merge pull request #62 from estesp/fix-gofmt 9beb998c23f510b1e6670ad7791807eb9aff6741 Merge pull request #61 from gliptak/patch-3 9a09e5899acc95fabcc620d6489fec674e6dddfa Fix gofmt of systemd.go 84e6e6ed2afdf661cd9dbf47c6f3412b546bc67f Merge pull request #60 from gliptak/patch-2 e13f6cc3b9637c36e6a8af393b561127498f4be5 Add GoReportCard badge to README d124595ee85c245e7c1443fe402adf7ce4f7f6a4 Add Go 1.11 to Travis d961ab930c38eb8bedcded479f1708b2ef4984c5 Correct typo d2400726cfa7904fb79e3b896ec0e6ae500a76bd Merge pull request #57 from estesp/project-update e4cf832b95deb7ce898ece716307abc35cbd0a09 Add project references and use common project travis 8baeff6b9d069acde48ef1bedec7e0f8ba684f05 Merge pull request #56 from grantseltzer/patch-1 9de57ffeb46f6179333d7939436d92dcb5631e5f Add godoc badge to README.md 5017d4e9a9cf2d4381db99eacd9baf84b95bfb14 Merge pull request #54 from WeiZhang555/bugfix 13aaafdc37e772059d3234ec762303537f440c5b Bugfix: can't write to cpuset cgroup 58556f5ad8448d99a6f7bea69ea4bdb7747cfeb0 Merge pull request #53 from baude/systemdslicedelegate 15ed73c1c075e6590ecf56170acedcba0da8167e systemd-239+ no longer allows delegate slice 3024bc7cc0c88af4b32d38a14444f38e65ab169f Merge pull request #52 from Sykomaniac/bugfix/slice-name 2596f332e449ea374f0f24a977437116714ce7ef Remove call to unitName 2e2922e146ed53ccf4481c245187b6afe244fded Merge pull request #51 from containerd/type 0f3de2f77d3b76b3871242fbab2a6116179229af (type) Fix empty device type ``` Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3 | ||||
| github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23 | ||||
| github.com/containerd/cgroups 5e610833b72089b37d0e615de9a92dfc043757c2 | ||||
| github.com/containerd/cgroups 1152b960fcee041f50df15cdc67c29dbccf801ef | ||||
| github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40 | ||||
| github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c | ||||
| github.com/containerd/btrfs 2e1aa0ddf94f91fa282b6ed87c23bf0d64911244 | ||||
|   | ||||
							
								
								
									
										14
									
								
								vendor/github.com/containerd/cgroups/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/containerd/cgroups/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,8 +1,9 @@ | ||||
| # cgroups | ||||
|  | ||||
| [](https://travis-ci.org/containerd/cgroups) | ||||
|  | ||||
| [](https://codecov.io/gh/containerd/cgroups) | ||||
| [](https://godoc.org/github.com/containerd/cgroups) | ||||
| [](https://goreportcard.com/report/github.com/containerd/cgroups) | ||||
|  | ||||
| Go package for creating, managing, inspecting, and destroying cgroups. | ||||
| The resources format for settings on the cgroup uses the OCI runtime-spec found | ||||
| @@ -110,3 +111,14 @@ err := control.MoveTo(destination) | ||||
| ```go | ||||
| subCgroup, err := control.New("child", resources) | ||||
| ``` | ||||
|  | ||||
| ## Project details | ||||
|  | ||||
| Cgroups is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE). | ||||
| As a containerd sub-project, you will find the: | ||||
|  | ||||
|  * [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md), | ||||
|  * [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS), | ||||
|  * and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md) | ||||
|  | ||||
| information in our [`containerd/project`](https://github.com/containerd/project) repository. | ||||
|   | ||||
							
								
								
									
										57
									
								
								vendor/github.com/containerd/cgroups/blkio.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/containerd/cgroups/blkio.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -191,31 +191,42 @@ func (b *blkioController) readEntry(devices map[deviceKey]string, path, name str | ||||
| } | ||||
|  | ||||
| func createBlkioSettings(blkio *specs.LinuxBlockIO) []blkioSettings { | ||||
| 	settings := []blkioSettings{ | ||||
| 		{ | ||||
| 			name:   "weight", | ||||
| 			value:  blkio.Weight, | ||||
| 			format: uintf, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name:   "leaf_weight", | ||||
| 			value:  blkio.LeafWeight, | ||||
| 			format: uintf, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, wd := range blkio.WeightDevice { | ||||
| 	settings := []blkioSettings{} | ||||
|  | ||||
| 	if blkio.Weight != nil { | ||||
| 		settings = append(settings, | ||||
| 			blkioSettings{ | ||||
| 				name:   "weight_device", | ||||
| 				value:  wd, | ||||
| 				format: weightdev, | ||||
| 			}, | ||||
| 			blkioSettings{ | ||||
| 				name:   "leaf_weight_device", | ||||
| 				value:  wd, | ||||
| 				format: weightleafdev, | ||||
| 				name:   "weight", | ||||
| 				value:  blkio.Weight, | ||||
| 				format: uintf, | ||||
| 			}) | ||||
| 	} | ||||
| 	if blkio.LeafWeight != nil { | ||||
| 		settings = append(settings, | ||||
| 			blkioSettings{ | ||||
| 				name:   "leaf_weight", | ||||
| 				value:  blkio.LeafWeight, | ||||
| 				format: uintf, | ||||
| 			}) | ||||
| 	} | ||||
| 	for _, wd := range blkio.WeightDevice { | ||||
| 		if wd.Weight != nil { | ||||
| 			settings = append(settings, | ||||
| 				blkioSettings{ | ||||
| 					name:   "weight_device", | ||||
| 					value:  wd, | ||||
| 					format: weightdev, | ||||
| 				}) | ||||
| 		} | ||||
| 		if wd.LeafWeight != nil { | ||||
| 			settings = append(settings, | ||||
| 				blkioSettings{ | ||||
| 					name:   "leaf_weight_device", | ||||
| 					value:  wd, | ||||
| 					format: weightleafdev, | ||||
| 				}) | ||||
| 		} | ||||
| 	} | ||||
| 	for _, t := range []struct { | ||||
| 		name string | ||||
| 		list []specs.LinuxThrottleDevice | ||||
| @@ -265,12 +276,12 @@ func uintf(v interface{}) []byte { | ||||
|  | ||||
| func weightdev(v interface{}) []byte { | ||||
| 	wd := v.(specs.LinuxWeightDevice) | ||||
| 	return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, wd.Weight)) | ||||
| 	return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, *wd.Weight)) | ||||
| } | ||||
|  | ||||
| func weightleafdev(v interface{}) []byte { | ||||
| 	wd := v.(specs.LinuxWeightDevice) | ||||
| 	return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, wd.LeafWeight)) | ||||
| 	return []byte(fmt.Sprintf("%d:%d %d", wd.Major, wd.Minor, *wd.LeafWeight)) | ||||
| } | ||||
|  | ||||
| func throttleddev(v interface{}) []byte { | ||||
|   | ||||
							
								
								
									
										51
									
								
								vendor/github.com/containerd/cgroups/cgroup.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/containerd/cgroups/cgroup.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -48,11 +48,12 @@ func New(hierarchy Hierarchy, path Path, resources *specs.LinuxResources) (Cgrou | ||||
|  | ||||
| // Load will load an existing cgroup and allow it to be controlled | ||||
| func Load(hierarchy Hierarchy, path Path) (Cgroup, error) { | ||||
| 	var activeSubsystems []Subsystem | ||||
| 	subsystems, err := hierarchy() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	// check the the subsystems still exist | ||||
| 	// check that the subsystems still exist, and keep only those that actually exist | ||||
| 	for _, s := range pathers(subsystems) { | ||||
| 		p, err := path(s.Name()) | ||||
| 		if err != nil { | ||||
| @@ -63,14 +64,15 @@ func Load(hierarchy Hierarchy, path Path) (Cgroup, error) { | ||||
| 		} | ||||
| 		if _, err := os.Lstat(s.Path(p)); err != nil { | ||||
| 			if os.IsNotExist(err) { | ||||
| 				return nil, ErrCgroupDeleted | ||||
| 				continue | ||||
| 			} | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		activeSubsystems = append(activeSubsystems, s) | ||||
| 	} | ||||
| 	return &cgroup{ | ||||
| 		path:       path, | ||||
| 		subsystems: subsystems, | ||||
| 		subsystems: activeSubsystems, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| @@ -319,6 +321,49 @@ func (c *cgroup) processes(subsystem Name, recursive bool) ([]Process, error) { | ||||
| 	return processes, err | ||||
| } | ||||
|  | ||||
| // Tasks returns the tasks running inside the cgroup along | ||||
| // with the subsystem used, pid, and path | ||||
| func (c *cgroup) Tasks(subsystem Name, recursive bool) ([]Task, error) { | ||||
| 	c.mu.Lock() | ||||
| 	defer c.mu.Unlock() | ||||
| 	if c.err != nil { | ||||
| 		return nil, c.err | ||||
| 	} | ||||
| 	return c.tasks(subsystem, recursive) | ||||
| } | ||||
|  | ||||
| func (c *cgroup) tasks(subsystem Name, recursive bool) ([]Task, error) { | ||||
| 	s := c.getSubsystem(subsystem) | ||||
| 	sp, err := c.path(subsystem) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	path := s.(pather).Path(sp) | ||||
| 	var tasks []Task | ||||
| 	err = filepath.Walk(path, func(p string, info os.FileInfo, err error) error { | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if !recursive && info.IsDir() { | ||||
| 			if p == path { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return filepath.SkipDir | ||||
| 		} | ||||
| 		dir, name := filepath.Split(p) | ||||
| 		if name != cgroupTasks { | ||||
| 			return nil | ||||
| 		} | ||||
| 		procs, err := readTasksPids(dir, subsystem) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		tasks = append(tasks, procs...) | ||||
| 		return nil | ||||
| 	}) | ||||
| 	return tasks, err | ||||
| } | ||||
|  | ||||
| // Freeze freezes the entire cgroup and all the processes inside it | ||||
| func (c *cgroup) Freeze() error { | ||||
| 	c.mu.Lock() | ||||
|   | ||||
							
								
								
									
										11
									
								
								vendor/github.com/containerd/cgroups/control.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/containerd/cgroups/control.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -44,6 +44,15 @@ type Process struct { | ||||
| 	Path string | ||||
| } | ||||
|  | ||||
| type Task struct { | ||||
| 	// Subsystem is the name of the subsystem that the task is in | ||||
| 	Subsystem Name | ||||
| 	// Pid is the process id of the task | ||||
| 	Pid int | ||||
| 	// Path is the full path of the subsystem and location that the task is in | ||||
| 	Path string | ||||
| } | ||||
|  | ||||
| // Cgroup handles interactions with the individual groups to perform | ||||
| // actions on them as them main interface to this cgroup package | ||||
| type Cgroup interface { | ||||
| @@ -64,6 +73,8 @@ type Cgroup interface { | ||||
| 	Update(resources *specs.LinuxResources) error | ||||
| 	// Processes returns all the processes in a select subsystem for the cgroup | ||||
| 	Processes(Name, bool) ([]Process, error) | ||||
| 	// Tasks returns all the tasks in a select subsystem for the cgroup | ||||
| 	Tasks(Name, bool) ([]Task, error) | ||||
| 	// Freeze freezes or pauses all processes inside the cgroup | ||||
| 	Freeze() error | ||||
| 	// Thaw thaw or resumes all processes inside the cgroup | ||||
|   | ||||
							
								
								
									
										10
									
								
								vendor/github.com/containerd/cgroups/cpuset.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/containerd/cgroups/cpuset.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -57,21 +57,21 @@ func (c *cpusetController) Create(path string, resources *specs.LinuxResources) | ||||
| 	if resources.CPU != nil { | ||||
| 		for _, t := range []struct { | ||||
| 			name  string | ||||
| 			value *string | ||||
| 			value string | ||||
| 		}{ | ||||
| 			{ | ||||
| 				name:  "cpus", | ||||
| 				value: &resources.CPU.Cpus, | ||||
| 				value: resources.CPU.Cpus, | ||||
| 			}, | ||||
| 			{ | ||||
| 				name:  "mems", | ||||
| 				value: &resources.CPU.Mems, | ||||
| 				value: resources.CPU.Mems, | ||||
| 			}, | ||||
| 		} { | ||||
| 			if t.value != nil { | ||||
| 			if t.value != "" { | ||||
| 				if err := ioutil.WriteFile( | ||||
| 					filepath.Join(c.Path(path), fmt.Sprintf("cpuset.%s", t.name)), | ||||
| 					[]byte(*t.value), | ||||
| 					[]byte(t.value), | ||||
| 					defaultFilePerm, | ||||
| 				); err != nil { | ||||
| 					return err | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/containerd/cgroups/devices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containerd/cgroups/devices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -58,6 +58,9 @@ func (d *devicesController) Create(path string, resources *specs.LinuxResources) | ||||
| 		if device.Allow { | ||||
| 			file = allowDeviceFile | ||||
| 		} | ||||
| 		if device.Type == "" { | ||||
| 			device.Type = "a" | ||||
| 		} | ||||
| 		if err := ioutil.WriteFile( | ||||
| 			filepath.Join(d.Path(path), file), | ||||
| 			[]byte(deviceString(device)), | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/cgroups/net_prio.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/cgroups/net_prio.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -50,7 +50,7 @@ func (n *netprioController) Create(path string, resources *specs.LinuxResources) | ||||
| 	if resources.Network != nil { | ||||
| 		for _, prio := range resources.Network.Priorities { | ||||
| 			if err := ioutil.WriteFile( | ||||
| 				filepath.Join(n.Path(path), "net_prio_ifpriomap"), | ||||
| 				filepath.Join(n.Path(path), "net_prio.ifpriomap"), | ||||
| 				formatPrio(prio.Name, prio.Priority), | ||||
| 				defaultFilePerm, | ||||
| 			); err != nil { | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/cgroups/subsystem.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/cgroups/subsystem.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -42,7 +42,7 @@ const ( | ||||
| ) | ||||
|  | ||||
| // Subsystems returns a complete list of the default cgroups | ||||
| // avaliable on most linux systems | ||||
| // available on most linux systems | ||||
| func Subsystems() []Name { | ||||
| 	n := []Name{ | ||||
| 		Hugetlb, | ||||
|   | ||||
							
								
								
									
										33
									
								
								vendor/github.com/containerd/cgroups/systemd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/containerd/cgroups/systemd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -32,6 +32,11 @@ const ( | ||||
| 	defaultSlice      = "system.slice" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	canDelegate bool | ||||
| 	once        sync.Once | ||||
| ) | ||||
|  | ||||
| func Systemd() ([]Subsystem, error) { | ||||
| 	root, err := v1MountPoint() | ||||
| 	if err != nil { | ||||
| @@ -54,7 +59,7 @@ func Slice(slice, name string) Path { | ||||
| 		slice = defaultSlice | ||||
| 	} | ||||
| 	return func(subsystem Name) (string, error) { | ||||
| 		return filepath.Join(slice, unitName(name)), nil | ||||
| 		return filepath.Join(slice, name), nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -80,15 +85,39 @@ func (s *SystemdController) Create(path string, resources *specs.LinuxResources) | ||||
| 	} | ||||
| 	defer conn.Close() | ||||
| 	slice, name := splitName(path) | ||||
| 	// We need to see if systemd can handle the delegate property | ||||
| 	// Systemd will return an error if it cannot handle delegate regardless | ||||
| 	// of its bool setting. | ||||
| 	checkDelegate := func() { | ||||
| 		canDelegate = true | ||||
| 		dlSlice := newProperty("Delegate", true) | ||||
| 		if _, err := conn.StartTransientUnit(slice, "testdelegate", []systemdDbus.Property{dlSlice}, nil); err != nil { | ||||
| 			if dbusError, ok := err.(dbus.Error); ok { | ||||
| 				// Starting with systemd v237, Delegate is not even a property of slices anymore, | ||||
| 				// so the D-Bus call fails with "InvalidArgs" error. | ||||
| 				if strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.PropertyReadOnly") || strings.Contains(dbusError.Name, "org.freedesktop.DBus.Error.InvalidArgs") { | ||||
| 					canDelegate = false | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		conn.StopUnit(slice, "testDelegate", nil) | ||||
| 	} | ||||
| 	once.Do(checkDelegate) | ||||
| 	properties := []systemdDbus.Property{ | ||||
| 		systemdDbus.PropDescription(fmt.Sprintf("cgroup %s", name)), | ||||
| 		systemdDbus.PropWants(slice), | ||||
| 		newProperty("DefaultDependencies", false), | ||||
| 		newProperty("Delegate", true), | ||||
| 		newProperty("MemoryAccounting", true), | ||||
| 		newProperty("CPUAccounting", true), | ||||
| 		newProperty("BlockIOAccounting", true), | ||||
| 	} | ||||
|  | ||||
| 	// If we can delegate, we add the property back in | ||||
| 	if canDelegate { | ||||
| 		properties = append(properties, newProperty("Delegate", true)) | ||||
| 	} | ||||
|  | ||||
| 	ch := make(chan string) | ||||
| 	_, err = conn.StartTransientUnit(name, "replace", properties, ch) | ||||
| 	if err != nil { | ||||
|   | ||||
							
								
								
									
										29
									
								
								vendor/github.com/containerd/cgroups/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/containerd/cgroups/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -111,7 +111,7 @@ func remove(path string) error { | ||||
| 	return fmt.Errorf("cgroups: unable to remove path %q", path) | ||||
| } | ||||
|  | ||||
| // readPids will read all the pids in a cgroup by the provided path | ||||
| // readPids will read all the pids of processes in a cgroup by the provided path | ||||
| func readPids(path string, subsystem Name) ([]Process, error) { | ||||
| 	f, err := os.Open(filepath.Join(path, cgroupProcs)) | ||||
| 	if err != nil { | ||||
| @@ -138,6 +138,33 @@ func readPids(path string, subsystem Name) ([]Process, error) { | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| // readTasksPids will read all the pids of tasks in a cgroup by the provided path | ||||
| func readTasksPids(path string, subsystem Name) ([]Task, error) { | ||||
| 	f, err := os.Open(filepath.Join(path, cgroupTasks)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer f.Close() | ||||
| 	var ( | ||||
| 		out []Task | ||||
| 		s   = bufio.NewScanner(f) | ||||
| 	) | ||||
| 	for s.Scan() { | ||||
| 		if t := s.Text(); t != "" { | ||||
| 			pid, err := strconv.Atoi(t) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			out = append(out, Task{ | ||||
| 				Pid:       pid, | ||||
| 				Subsystem: subsystem, | ||||
| 				Path:      path, | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func hugePageSizes() ([]string, error) { | ||||
| 	var ( | ||||
| 		pageSizes []string | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Crosby
					Michael Crosby