diff options
author | Chenggang Qin <chenggang.qcg@gmail.com> | 2018-08-16 16:27:14 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-08-16 16:28:14 -0700 |
commit | aeec7a4c007ac53401e05bf72894a3b998eead95 (patch) | |
tree | 60277fb6794708073c26f14624d0c351b9e83479 /pkg/sentry/fs/sys | |
parent | fbd5df9c6fec9119c8036bf5664a27afb35a08ec (diff) |
fs: Support possible and online knobs for cpu
Some linux commands depend on /sys/devices/system/cpu/possible, such
as 'lscpu'.
Add 2 knobs for cpu:
/sys/devices/system/cpu/possible
/sys/devices/system/cpu/online
Both the values are '0 - Kernel.ApplicationCores()-1'.
Change-Id: Iabd8a4e559cbb630ed249686b92c22b4e7120663
PiperOrigin-RevId: 209070163
Diffstat (limited to 'pkg/sentry/fs/sys')
-rw-r--r-- | pkg/sentry/fs/sys/BUILD | 3 | ||||
-rw-r--r-- | pkg/sentry/fs/sys/devices.go | 76 | ||||
-rw-r--r-- | pkg/sentry/fs/sys/sys.go | 18 |
3 files changed, 94 insertions, 3 deletions
diff --git a/pkg/sentry/fs/sys/BUILD b/pkg/sentry/fs/sys/BUILD index bc24e980e..5ba23d5da 100644 --- a/pkg/sentry/fs/sys/BUILD +++ b/pkg/sentry/fs/sys/BUILD @@ -6,6 +6,7 @@ go_library( name = "sys", srcs = [ "device.go", + "devices.go", "fs.go", "sys.go", ], @@ -16,6 +17,8 @@ go_library( "//pkg/sentry/device", "//pkg/sentry/fs", "//pkg/sentry/fs/ramfs", + "//pkg/sentry/kernel", "//pkg/sentry/usermem", + "//pkg/syserror", ], ) diff --git a/pkg/sentry/fs/sys/devices.go b/pkg/sentry/fs/sys/devices.go new file mode 100644 index 000000000..03eddeb93 --- /dev/null +++ b/pkg/sentry/fs/sys/devices.go @@ -0,0 +1,76 @@ +// 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 sys + +import ( + "fmt" + "io" + + "gvisor.googlesource.com/gvisor/pkg/sentry/context" + "gvisor.googlesource.com/gvisor/pkg/sentry/fs" + "gvisor.googlesource.com/gvisor/pkg/sentry/fs/ramfs" + "gvisor.googlesource.com/gvisor/pkg/sentry/kernel" + "gvisor.googlesource.com/gvisor/pkg/sentry/usermem" + "gvisor.googlesource.com/gvisor/pkg/syserror" +) + +// +stateify savable +type cpunum struct { + ramfs.Entry +} + +func (c *cpunum) DeprecatedPreadv(ctx context.Context, dst usermem.IOSequence, offset int64) (int64, error) { + if offset < 0 { + return 0, syserror.EINVAL + } + + k := kernel.KernelFromContext(ctx) + if k == nil { + return 0, io.EOF + } + + str := []byte(fmt.Sprintf("0-%d\n", k.ApplicationCores()-1)) + if offset >= int64(len(str)) { + return 0, io.EOF + } + + n, err := dst.CopyOut(ctx, str[offset:]) + return int64(n), err +} + +func newPossible(ctx context.Context, msrc *fs.MountSource) *fs.Inode { + c := &cpunum{} + c.InitEntry(ctx, fs.RootOwner, fs.FilePermsFromMode(0444)) + return newFile(c, msrc) +} + +func newCPU(ctx context.Context, msrc *fs.MountSource) *fs.Inode { + return newDir(ctx, msrc, map[string]*fs.Inode{ + "possible": newPossible(ctx, msrc), + "online": newPossible(ctx, msrc), + }) +} + +func newSystemDir(ctx context.Context, msrc *fs.MountSource) *fs.Inode { + return newDir(ctx, msrc, map[string]*fs.Inode{ + "cpu": newCPU(ctx, msrc), + }) +} + +func newDevicesDir(ctx context.Context, msrc *fs.MountSource) *fs.Inode { + return newDir(ctx, msrc, map[string]*fs.Inode{ + "system": newSystemDir(ctx, msrc), + }) +} diff --git a/pkg/sentry/fs/sys/sys.go b/pkg/sentry/fs/sys/sys.go index b9b2fb4a1..b1c3d48eb 100644 --- a/pkg/sentry/fs/sys/sys.go +++ b/pkg/sentry/fs/sys/sys.go @@ -22,13 +22,25 @@ import ( "gvisor.googlesource.com/gvisor/pkg/sentry/usermem" ) +// sys is a root sys node. +// // +stateify savable -type dir struct { +type sys struct { ramfs.Dir } +func newFile(node fs.InodeOperations, msrc *fs.MountSource) *fs.Inode { + sattr := fs.StableAttr{ + DeviceID: sysfsDevice.DeviceID(), + InodeID: sysfsDevice.NextIno(), + BlockSize: usermem.PageSize, + Type: fs.SpecialFile, + } + return fs.NewInode(node, msrc, sattr) +} + func newDir(ctx context.Context, msrc *fs.MountSource, contents map[string]*fs.Inode) *fs.Inode { - d := &dir{} + d := &sys{} d.InitDir(ctx, contents, fs.RootOwner, fs.FilePermsFromMode(0555)) return fs.NewInode(d, msrc, fs.StableAttr{ DeviceID: sysfsDevice.DeviceID(), @@ -48,7 +60,7 @@ func New(ctx context.Context, msrc *fs.MountSource) *fs.Inode { "bus": newDir(ctx, msrc, nil), "class": newDir(ctx, msrc, nil), "dev": newDir(ctx, msrc, nil), - "devices": newDir(ctx, msrc, nil), + "devices": newDevicesDir(ctx, msrc), "firmware": newDir(ctx, msrc, nil), "fs": newDir(ctx, msrc, nil), "kernel": newDir(ctx, msrc, nil), |