2019-04-29 21:25:05 +00:00
|
|
|
// Copyright 2018 The gVisor Authors.
|
2018-08-16 23:27:14 +00:00
|
|
|
//
|
|
|
|
// 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"
|
|
|
|
|
2019-06-13 23:49:09 +00:00
|
|
|
"gvisor.dev/gvisor/pkg/abi/linux"
|
|
|
|
"gvisor.dev/gvisor/pkg/sentry/context"
|
|
|
|
"gvisor.dev/gvisor/pkg/sentry/fs"
|
|
|
|
"gvisor.dev/gvisor/pkg/sentry/fs/fsutil"
|
|
|
|
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
2018-08-16 23:27:14 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// +stateify savable
|
|
|
|
type cpunum struct {
|
2019-01-15 04:33:29 +00:00
|
|
|
fsutil.InodeGenericChecker `state:"nosave"`
|
|
|
|
fsutil.InodeNoExtendedAttributes `state:"nosave"`
|
|
|
|
fsutil.InodeNoopRelease `state:"nosave"`
|
|
|
|
fsutil.InodeNoopWriteOut `state:"nosave"`
|
2019-05-09 22:34:44 +00:00
|
|
|
fsutil.InodeNotAllocatable `state:"nosave"`
|
2019-01-15 04:33:29 +00:00
|
|
|
fsutil.InodeNotDirectory `state:"nosave"`
|
|
|
|
fsutil.InodeNotMappable `state:"nosave"`
|
|
|
|
fsutil.InodeNotSocket `state:"nosave"`
|
|
|
|
fsutil.InodeNotSymlink `state:"nosave"`
|
|
|
|
fsutil.InodeNotTruncatable `state:"nosave"`
|
2019-05-09 22:34:44 +00:00
|
|
|
fsutil.InodeNotVirtual `state:"nosave"`
|
2019-01-15 04:33:29 +00:00
|
|
|
|
|
|
|
fsutil.InodeSimpleAttributes
|
|
|
|
fsutil.InodeStaticFileGetter
|
2018-08-16 23:27:14 +00:00
|
|
|
}
|
|
|
|
|
2019-01-15 04:33:29 +00:00
|
|
|
var _ fs.InodeOperations = (*cpunum)(nil)
|
2018-08-16 23:27:14 +00:00
|
|
|
|
2019-01-15 04:33:29 +00:00
|
|
|
func newPossible(ctx context.Context, msrc *fs.MountSource) *fs.Inode {
|
|
|
|
var maxCore uint
|
2018-08-16 23:27:14 +00:00
|
|
|
k := kernel.KernelFromContext(ctx)
|
2019-01-15 04:33:29 +00:00
|
|
|
if k != nil {
|
|
|
|
maxCore = k.ApplicationCores() - 1
|
2018-08-16 23:27:14 +00:00
|
|
|
}
|
2019-01-15 04:33:29 +00:00
|
|
|
contents := []byte(fmt.Sprintf("0-%d\n", maxCore))
|
2018-08-16 23:27:14 +00:00
|
|
|
|
2019-01-15 04:33:29 +00:00
|
|
|
c := &cpunum{
|
|
|
|
InodeSimpleAttributes: fsutil.NewInodeSimpleAttributes(ctx, fs.RootOwner, fs.FilePermsFromMode(0444), linux.SYSFS_MAGIC),
|
|
|
|
InodeStaticFileGetter: fsutil.InodeStaticFileGetter{
|
|
|
|
Contents: contents,
|
|
|
|
},
|
2018-08-16 23:27:14 +00:00
|
|
|
}
|
2019-06-14 01:39:43 +00:00
|
|
|
return newFile(ctx, c, msrc)
|
2018-08-16 23:27:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func newCPU(ctx context.Context, msrc *fs.MountSource) *fs.Inode {
|
2018-08-20 18:18:06 +00:00
|
|
|
m := map[string]*fs.Inode{
|
2018-08-16 23:27:14 +00:00
|
|
|
"online": newPossible(ctx, msrc),
|
2018-08-20 18:18:06 +00:00
|
|
|
"possible": newPossible(ctx, msrc),
|
|
|
|
"present": newPossible(ctx, msrc),
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add directories for each of the cpus.
|
|
|
|
if k := kernel.KernelFromContext(ctx); k != nil {
|
|
|
|
for i := 0; uint(i) < k.ApplicationCores(); i++ {
|
|
|
|
m[fmt.Sprintf("cpu%d", i)] = newDir(ctx, msrc, nil)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return newDir(ctx, msrc, m)
|
2018-08-16 23:27:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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),
|
|
|
|
})
|
|
|
|
}
|