mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
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
This commit is contained in:
@@ -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",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -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),
|
||||
})
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user