mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
[syserror] Split usermem package
Split usermem package to help remove syserror dependency in go_marshal. New hostarch package contains code not dependent on syserror. PiperOrigin-RevId: 365651233
This commit is contained in:
committed by
gVisor bot
parent
b125afba41
commit
8a2f7e716d
@@ -59,6 +59,7 @@ go_library(
|
||||
"//pkg/amutex",
|
||||
"//pkg/context",
|
||||
"//pkg/fspath",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/log",
|
||||
"//pkg/refs",
|
||||
"//pkg/refsvfs2",
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/safemem"
|
||||
"gvisor.dev/gvisor/pkg/sentry/fs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/fs/fsutil"
|
||||
@@ -224,7 +225,7 @@ func (rf *regularFile) truncateLocked(newSize uint64) (bool, error) {
|
||||
}
|
||||
|
||||
// AddMapping implements memmap.Mappable.AddMapping.
|
||||
func (rf *regularFile) AddMapping(ctx context.Context, ms memmap.MappingSpace, ar usermem.AddrRange, offset uint64, writable bool) error {
|
||||
func (rf *regularFile) AddMapping(ctx context.Context, ms memmap.MappingSpace, ar hostarch.AddrRange, offset uint64, writable bool) error {
|
||||
rf.mapsMu.Lock()
|
||||
defer rf.mapsMu.Unlock()
|
||||
rf.dataMu.RLock()
|
||||
@@ -240,7 +241,7 @@ func (rf *regularFile) AddMapping(ctx context.Context, ms memmap.MappingSpace, a
|
||||
pagesBefore := rf.writableMappingPages
|
||||
|
||||
// ar is guaranteed to be page aligned per memmap.Mappable.
|
||||
rf.writableMappingPages += uint64(ar.Length() / usermem.PageSize)
|
||||
rf.writableMappingPages += uint64(ar.Length() / hostarch.PageSize)
|
||||
|
||||
if rf.writableMappingPages < pagesBefore {
|
||||
panic(fmt.Sprintf("Overflow while mapping potentially writable pages pointing to a tmpfs file. Before %v, after %v", pagesBefore, rf.writableMappingPages))
|
||||
@@ -251,7 +252,7 @@ func (rf *regularFile) AddMapping(ctx context.Context, ms memmap.MappingSpace, a
|
||||
}
|
||||
|
||||
// RemoveMapping implements memmap.Mappable.RemoveMapping.
|
||||
func (rf *regularFile) RemoveMapping(ctx context.Context, ms memmap.MappingSpace, ar usermem.AddrRange, offset uint64, writable bool) {
|
||||
func (rf *regularFile) RemoveMapping(ctx context.Context, ms memmap.MappingSpace, ar hostarch.AddrRange, offset uint64, writable bool) {
|
||||
rf.mapsMu.Lock()
|
||||
defer rf.mapsMu.Unlock()
|
||||
|
||||
@@ -261,7 +262,7 @@ func (rf *regularFile) RemoveMapping(ctx context.Context, ms memmap.MappingSpace
|
||||
pagesBefore := rf.writableMappingPages
|
||||
|
||||
// ar is guaranteed to be page aligned per memmap.Mappable.
|
||||
rf.writableMappingPages -= uint64(ar.Length() / usermem.PageSize)
|
||||
rf.writableMappingPages -= uint64(ar.Length() / hostarch.PageSize)
|
||||
|
||||
if rf.writableMappingPages > pagesBefore {
|
||||
panic(fmt.Sprintf("Underflow while unmapping potentially writable pages pointing to a tmpfs file. Before %v, after %v", pagesBefore, rf.writableMappingPages))
|
||||
@@ -270,12 +271,12 @@ func (rf *regularFile) RemoveMapping(ctx context.Context, ms memmap.MappingSpace
|
||||
}
|
||||
|
||||
// CopyMapping implements memmap.Mappable.CopyMapping.
|
||||
func (rf *regularFile) CopyMapping(ctx context.Context, ms memmap.MappingSpace, srcAR, dstAR usermem.AddrRange, offset uint64, writable bool) error {
|
||||
func (rf *regularFile) CopyMapping(ctx context.Context, ms memmap.MappingSpace, srcAR, dstAR hostarch.AddrRange, offset uint64, writable bool) error {
|
||||
return rf.AddMapping(ctx, ms, dstAR, offset, writable)
|
||||
}
|
||||
|
||||
// Translate implements memmap.Mappable.Translate.
|
||||
func (rf *regularFile) Translate(ctx context.Context, required, optional memmap.MappableRange, at usermem.AccessType) ([]memmap.Translation, error) {
|
||||
func (rf *regularFile) Translate(ctx context.Context, required, optional memmap.MappableRange, at hostarch.AccessType) ([]memmap.Translation, error) {
|
||||
rf.dataMu.Lock()
|
||||
defer rf.dataMu.Unlock()
|
||||
|
||||
@@ -307,7 +308,7 @@ func (rf *regularFile) Translate(ctx context.Context, required, optional memmap.
|
||||
Source: segMR,
|
||||
File: rf.memFile,
|
||||
Offset: seg.FileRangeOf(segMR).Start,
|
||||
Perms: usermem.AnyAccess,
|
||||
Perms: hostarch.AnyAccess,
|
||||
})
|
||||
translatedEnd = segMR.End
|
||||
}
|
||||
@@ -539,7 +540,7 @@ func (rw *regularFileReadWriter) ReadToBlocks(dsts safemem.BlockSeq) (uint64, er
|
||||
switch {
|
||||
case seg.Ok():
|
||||
// Get internal mappings.
|
||||
ims, err := rw.file.memFile.MapInternal(seg.FileRangeOf(seg.Range().Intersect(mr)), usermem.Read)
|
||||
ims, err := rw.file.memFile.MapInternal(seg.FileRangeOf(seg.Range().Intersect(mr)), hostarch.Read)
|
||||
if err != nil {
|
||||
return done, err
|
||||
}
|
||||
@@ -608,7 +609,7 @@ func (rw *regularFileReadWriter) WriteFromBlocks(srcs safemem.BlockSeq) (uint64,
|
||||
//
|
||||
// See Linux, mm/filemap.c:generic_perform_write() and
|
||||
// mm/shmem.c:shmem_write_begin().
|
||||
if pgstart := uint64(usermem.Addr(rw.file.size).RoundDown()); end > pgstart {
|
||||
if pgstart := uint64(hostarch.Addr(rw.file.size).RoundDown()); end > pgstart {
|
||||
end = pgstart
|
||||
}
|
||||
if end <= rw.off {
|
||||
@@ -619,8 +620,8 @@ func (rw *regularFileReadWriter) WriteFromBlocks(srcs safemem.BlockSeq) (uint64,
|
||||
|
||||
// Page-aligned mr for when we need to allocate memory. RoundUp can't
|
||||
// overflow since end is an int64.
|
||||
pgstartaddr := usermem.Addr(rw.off).RoundDown()
|
||||
pgendaddr, _ := usermem.Addr(end).RoundUp()
|
||||
pgstartaddr := hostarch.Addr(rw.off).RoundDown()
|
||||
pgendaddr, _ := hostarch.Addr(end).RoundUp()
|
||||
pgMR := memmap.MappableRange{uint64(pgstartaddr), uint64(pgendaddr)}
|
||||
|
||||
var (
|
||||
@@ -633,7 +634,7 @@ func (rw *regularFileReadWriter) WriteFromBlocks(srcs safemem.BlockSeq) (uint64,
|
||||
switch {
|
||||
case seg.Ok():
|
||||
// Get internal mappings.
|
||||
ims, err := rw.file.memFile.MapInternal(seg.FileRangeOf(seg.Range().Intersect(mr)), usermem.Write)
|
||||
ims, err := rw.file.memFile.MapInternal(seg.FileRangeOf(seg.Range().Intersect(mr)), hostarch.Write)
|
||||
if err != nil {
|
||||
retErr = err
|
||||
goto exitLoop
|
||||
|
||||
@@ -36,6 +36,7 @@ import (
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/pgalloc"
|
||||
@@ -43,7 +44,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/vfs/memxattr"
|
||||
"gvisor.dev/gvisor/pkg/sync"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
// Name is the default filesystem name.
|
||||
@@ -252,8 +252,8 @@ func (d *dentry) releaseChildrenLocked(ctx context.Context) {
|
||||
// immutable
|
||||
var globalStatfs = linux.Statfs{
|
||||
Type: linux.TMPFS_MAGIC,
|
||||
BlockSize: usermem.PageSize,
|
||||
FragmentSize: usermem.PageSize,
|
||||
BlockSize: hostarch.PageSize,
|
||||
FragmentSize: hostarch.PageSize,
|
||||
NameLength: linux.NAME_MAX,
|
||||
|
||||
// tmpfs currently does not support configurable size limits. In Linux,
|
||||
@@ -263,9 +263,9 @@ var globalStatfs = linux.Statfs{
|
||||
// chosen to ensure that BlockSize * Blocks does not overflow int64 (which
|
||||
// applications may also handle incorrectly).
|
||||
// TODO(b/29637826): allow configuring a tmpfs size and enforce it.
|
||||
Blocks: math.MaxInt64 / usermem.PageSize,
|
||||
BlocksFree: math.MaxInt64 / usermem.PageSize,
|
||||
BlocksAvailable: math.MaxInt64 / usermem.PageSize,
|
||||
Blocks: math.MaxInt64 / hostarch.PageSize,
|
||||
BlocksFree: math.MaxInt64 / hostarch.PageSize,
|
||||
BlocksAvailable: math.MaxInt64 / hostarch.PageSize,
|
||||
}
|
||||
|
||||
// dentry implements vfs.DentryImpl.
|
||||
@@ -485,7 +485,7 @@ func (i *inode) statTo(stat *linux.Statx) {
|
||||
linux.STATX_UID | linux.STATX_GID | linux.STATX_INO | linux.STATX_SIZE |
|
||||
linux.STATX_BLOCKS | linux.STATX_ATIME | linux.STATX_CTIME |
|
||||
linux.STATX_MTIME
|
||||
stat.Blksize = usermem.PageSize
|
||||
stat.Blksize = hostarch.PageSize
|
||||
stat.Nlink = atomic.LoadUint32(&i.nlink)
|
||||
stat.UID = atomic.LoadUint32(&i.uid)
|
||||
stat.GID = atomic.LoadUint32(&i.gid)
|
||||
|
||||
Reference in New Issue
Block a user