summaryrefslogtreecommitdiffhomepage
path: root/runsc/boot/limits.go
blob: ea72de8e924789b733003884573b80be50737d9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package boot

import (
	"fmt"

	specs "github.com/opencontainers/runtime-spec/specs-go"
	"gvisor.googlesource.com/gvisor/pkg/sentry/limits"
)

// Mapping from linux resource names to limits.LimitType.
var fromLinuxResource = map[string]limits.LimitType{
	"RLIMIT_CPU":        limits.CPU,
	"RLIMIT_FSIZE":      limits.FileSize,
	"RLIMIT_DATA":       limits.Data,
	"RLIMIT_STACK":      limits.Stack,
	"RLIMIT_CORE":       limits.Core,
	"RLIMIT_RSS":        limits.Rss,
	"RLIMIT_NPROC":      limits.ProcessCount,
	"RLIMIT_NOFILE":     limits.NumberOfFiles,
	"RLIMIT_MEMLOCK":    limits.MemoryPagesLocked,
	"RLIMIT_AS":         limits.AS,
	"RLIMIT_LOCKS":      limits.Locks,
	"RLIMIT_SIGPENDING": limits.SignalsPending,
	"RLIMIT_MSGQUEUE":   limits.MessageQueueBytes,
	"RLIMIT_NICE":       limits.Nice,
	"RLIMIT_RTPRIO":     limits.RealTimePriority,
	"RLIMIT_RTTIME":     limits.Rttime,
}

func createLimitSet(spec *specs.Spec) (*limits.LimitSet, error) {
	ls, err := limits.NewLinuxDistroLimitSet()
	if err != nil {
		return nil, err
	}
	for _, rl := range spec.Process.Rlimits {
		lt, ok := fromLinuxResource[rl.Type]
		if !ok {
			return nil, fmt.Errorf("unknown resource %q", rl.Type)
		}
		ls.SetUnchecked(lt, limits.Limit{
			Cur: rl.Soft,
			Max: rl.Hard,
		})
	}
	return ls, nil
}