...

Source file src/github.com/opencontainers/runc/libcontainer/cgroups/systemd/cpuset.go

Documentation: github.com/opencontainers/runc/libcontainer/cgroups/systemd

     1  package systemd
     2  
     3  import (
     4  	"errors"
     5  	"math/big"
     6  	"strconv"
     7  	"strings"
     8  )
     9  
    10  // RangeToBits converts a text representation of a CPU mask (as written to
    11  // or read from cgroups' cpuset.* files, e.g. "1,3-5") to a slice of bytes
    12  // with the corresponding bits set (as consumed by systemd over dbus as
    13  // AllowedCPUs/AllowedMemoryNodes unit property value).
    14  func RangeToBits(str string) ([]byte, error) {
    15  	bits := new(big.Int)
    16  
    17  	for _, r := range strings.Split(str, ",") {
    18  		// allow extra spaces around
    19  		r = strings.TrimSpace(r)
    20  		// allow empty elements (extra commas)
    21  		if r == "" {
    22  			continue
    23  		}
    24  		ranges := strings.SplitN(r, "-", 2)
    25  		if len(ranges) > 1 {
    26  			start, err := strconv.ParseUint(ranges[0], 10, 32)
    27  			if err != nil {
    28  				return nil, err
    29  			}
    30  			end, err := strconv.ParseUint(ranges[1], 10, 32)
    31  			if err != nil {
    32  				return nil, err
    33  			}
    34  			if start > end {
    35  				return nil, errors.New("invalid range: " + r)
    36  			}
    37  			for i := start; i <= end; i++ {
    38  				bits.SetBit(bits, int(i), 1)
    39  			}
    40  		} else {
    41  			val, err := strconv.ParseUint(ranges[0], 10, 32)
    42  			if err != nil {
    43  				return nil, err
    44  			}
    45  			bits.SetBit(bits, int(val), 1)
    46  		}
    47  	}
    48  
    49  	ret := bits.Bytes()
    50  	if len(ret) == 0 {
    51  		// do not allow empty values
    52  		return nil, errors.New("empty value")
    53  	}
    54  
    55  	// fit cpuset parsing order in systemd
    56  	for l, r := 0, len(ret)-1; l < r; l, r = l+1, r-1 {
    57  		ret[l], ret[r] = ret[r], ret[l]
    58  	}
    59  	return ret, nil
    60  }
    61  

View as plain text