Add /proc/sys/kernel/shm[all,max,mni].

PiperOrigin-RevId: 210459956
Change-Id: I51859b90fa967631e0a54a390abc3b5541fbee66
This commit is contained in:
Brian Geffon
2018-08-27 17:21:37 -07:00
committed by Shentubot
parent 0923bcf06b
commit f0492d45aa
3 changed files with 25 additions and 26 deletions
+11
View File
@@ -14,6 +14,8 @@
package linux
import "math"
// shmat(2) flags. Source: include/uapi/linux/shm.h
const (
SHM_RDONLY = 010000 // Read-only access.
@@ -38,6 +40,15 @@ const (
SHM_INFO = 14
)
// SHM defaults as specified by linux. Source: include/uapi/linux/shm.h
const (
SHMMIN = 1
SHMMNI = 4096
SHMMAX = math.MaxUint64 - 1<<24
SHMALL = math.MaxUint64 - 1<<24
SHMSEG = 4096
)
// ShmidDS is equivalent to struct shmid64_ds. Source:
// include/uapi/asm-generic/shmbuf.h
type ShmidDS struct {
+6
View File
@@ -17,7 +17,9 @@ package proc
import (
"fmt"
"io"
"strconv"
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
"gvisor.googlesource.com/gvisor/pkg/sentry/context"
"gvisor.googlesource.com/gvisor/pkg/sentry/fs"
"gvisor.googlesource.com/gvisor/pkg/sentry/fs/proc/seqfile"
@@ -102,6 +104,10 @@ func (p *proc) newKernelDir(ctx context.Context, msrc *fs.MountSource) *fs.Inode
d := &ramfs.Dir{}
d.InitDir(ctx, nil, fs.RootOwner, fs.FilePermsFromMode(0555))
d.AddChild(ctx, "hostname", p.newHostname(ctx, msrc))
d.AddChild(ctx, "shmmax", p.newStubProcFSFile(ctx, msrc, []byte(strconv.FormatUint(linux.SHMMAX, 10))))
d.AddChild(ctx, "shmall", p.newStubProcFSFile(ctx, msrc, []byte(strconv.FormatUint(linux.SHMALL, 10))))
d.AddChild(ctx, "shmmni", p.newStubProcFSFile(ctx, msrc, []byte(strconv.FormatUint(linux.SHMMNI, 10))))
return newFile(d, msrc, fs.SpecialDirectory, nil)
}
+8 -26
View File
@@ -35,7 +35,6 @@ package shm
import (
"fmt"
"math"
"sync"
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
@@ -52,23 +51,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/syserror"
)
// Various limits for shared memory segments.
const (
// shmsTotalMaxPages is the system-wide limit on all shared memory segments, measured
// in number of pages.
shmsTotalMaxPages = math.MaxInt64 // SHMALL
// shmMaxSize is the maximum size of a single segment, in bytes.
shmMaxSize = math.MaxInt64 // SHMMAX
// shmMinSize is the minimum specifiable size of a segment, effectively
// yielding a size rounded up to the next page size. Measured in bytes.
shmMinSize = 1 // SHMMIN
// shmsTotalMax is the maximum number of segments on the system.
shmsTotalMax = 4096 // SHMMNI
)
// Registry tracks all shared memory segments in an IPC namespace. The registry
// provides the mechanisms for creating and finding segments, and reporting
// global shm parameters.
@@ -119,7 +101,7 @@ func (r *Registry) findByKey(key int32) *Shm {
// FindOrCreate looks up or creates a segment in the registry. It's functionally
// analogous to open(2).
func (r *Registry) FindOrCreate(ctx context.Context, pid, key int32, size uint64, mode linux.FileMode, private, create, exclusive bool) (*Shm, error) {
if create && (size < shmMinSize || size > shmMaxSize) {
if create && (size < linux.SHMMIN || size > linux.SHMMAX) {
// "A new segment was to be created and size is less than SHMMIN or
// greater than SHMMAX." - man shmget(2)
return nil, syserror.EINVAL
@@ -128,7 +110,7 @@ func (r *Registry) FindOrCreate(ctx context.Context, pid, key int32, size uint64
r.mu.Lock()
defer r.mu.Unlock()
if len(r.shms) >= shmsTotalMax {
if len(r.shms) >= linux.SHMMNI {
// "All possible shared memory IDs have been taken (SHMMNI) ..."
// - man shmget(2)
return nil, syserror.ENOSPC
@@ -179,7 +161,7 @@ func (r *Registry) FindOrCreate(ctx context.Context, pid, key int32, size uint64
return nil, syserror.EINVAL
}
if numPages := sizeAligned / usermem.PageSize; r.totalPages+numPages > shmsTotalMaxPages {
if numPages := sizeAligned / usermem.PageSize; r.totalPages+numPages > linux.SHMALL {
// "... allocating a segment of the requested size would cause the
// system to exceed the system-wide limit on shared memory (SHMALL)."
// - man shmget(2)
@@ -245,11 +227,11 @@ func (r *Registry) newShm(ctx context.Context, pid, key int32, creator fs.FileOw
// system. See shmctl(IPC_INFO).
func (r *Registry) IPCInfo() *linux.ShmParams {
return &linux.ShmParams{
ShmMax: shmMaxSize,
ShmMin: shmMinSize,
ShmMni: shmsTotalMax,
ShmSeg: shmsTotalMax, // Linux also sets this to SHMMNI.
ShmAll: shmsTotalMaxPages,
ShmMax: linux.SHMMAX,
ShmMin: linux.SHMMIN,
ShmMni: linux.SHMMNI,
ShmSeg: linux.SHMSEG,
ShmAll: linux.SHMALL,
}
}