Implement memmap.Mappable and memmap.File for vfioFd.

PiperOrigin-RevId: 615472230
This commit is contained in:
Jing Chen
2024-03-13 10:51:52 -07:00
committed by gVisor bot
parent aff56ec25d
commit 26e0e5df83
6 changed files with 96 additions and 9 deletions
+1
View File
@@ -12,6 +12,7 @@ go_library(
"tpu.go",
"tpu_mmap.go",
"vfio.go",
"vfio_mmap.go",
],
visibility = [
"//pkg/sentry:internal",
+1
View File
@@ -117,6 +117,7 @@ func (dev *vfioDevice) Open(ctx context.Context, mnt *vfs.Mount, d *vfs.Dentry,
unix.Close(hostFd)
return nil, err
}
fd.memmapFile.fd = fd
return &fd.vfsfd, nil
}
+1 -1
View File
@@ -40,7 +40,7 @@ type tpuFD struct {
hostFD int32
device *tpuDevice
queue waiter.Queue
memmapFile tpuFdMemmapFile
memmapFile tpuFDMemmapFile
}
// Release implements vfs.FileDescriptionImpl.Release.
+5 -5
View File
@@ -60,25 +60,25 @@ func (fd *tpuFD) InvalidateUnsavable(ctx context.Context) error {
return nil
}
type tpuFdMemmapFile struct {
type tpuFDMemmapFile struct {
fd *tpuFD
}
// IncRef implements memmap.File.IncRef.
func (mf *tpuFdMemmapFile) IncRef(memmap.FileRange, uint32) {
func (mf *tpuFDMemmapFile) IncRef(memmap.FileRange, uint32) {
}
// DecRef implements memmap.File.DecRef.
func (mf *tpuFdMemmapFile) DecRef(fr memmap.FileRange) {
func (mf *tpuFDMemmapFile) DecRef(fr memmap.FileRange) {
}
// MapInternal implements memmap.File.MapInternal.
func (mf *tpuFdMemmapFile) MapInternal(fr memmap.FileRange, at hostarch.AccessType) (safemem.BlockSeq, error) {
func (mf *tpuFDMemmapFile) MapInternal(fr memmap.FileRange, at hostarch.AccessType) (safemem.BlockSeq, error) {
log.Traceback("tpuproxy: rejecting tpuFdMemmapFile.MapInternal")
return safemem.BlockSeq{}, linuxerr.EINVAL
}
// FD implements memmap.File.FD.
func (mf *tpuFdMemmapFile) FD() int {
func (mf *tpuFDMemmapFile) FD() int {
return int(mf.fd.hostFD)
}
+4 -3
View File
@@ -34,9 +34,10 @@ type vfioFd struct {
vfs.DentryMetadataFileDescriptionImpl
vfs.NoLockFD
hostFd int32
device *vfioDevice
queue waiter.Queue
hostFd int32
device *vfioDevice
queue waiter.Queue
memmapFile vfioFDMemmapFile
}
// Release implements vfs.FileDescriptionImpl.Release.
+84
View File
@@ -0,0 +1,84 @@
// Copyright 2024 The gVisor Authors.
//
// 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 tpuproxy
import (
"gvisor.dev/gvisor/pkg/context"
"gvisor.dev/gvisor/pkg/errors/linuxerr"
"gvisor.dev/gvisor/pkg/hostarch"
"gvisor.dev/gvisor/pkg/log"
"gvisor.dev/gvisor/pkg/safemem"
"gvisor.dev/gvisor/pkg/sentry/memmap"
"gvisor.dev/gvisor/pkg/sentry/vfs"
)
// ConfigureMMap implements vfs.FileDescriptionImpl.ConfigureMMap.
func (fd *vfioFd) ConfigureMMap(ctx context.Context, opts *memmap.MMapOpts) error {
return vfs.GenericConfigureMMap(&fd.vfsfd, fd, opts)
}
// AddMapping implements memmap.Mappable.AddMapping.
func (fd *vfioFd) AddMapping(ctx context.Context, ms memmap.MappingSpace, ar hostarch.AddrRange, offset uint64, writable bool) error {
return nil
}
// RemoveMapping implements memmap.Mappable.RemoveMapping.
func (fd *vfioFd) RemoveMapping(ctx context.Context, ms memmap.MappingSpace, ar hostarch.AddrRange, offset uint64, writable bool) {
}
// CopyMapping implements memmap.Mappable.CopyMapping.
func (fd *vfioFd) CopyMapping(ctx context.Context, ms memmap.MappingSpace, srcAR, dstAR hostarch.AddrRange, offset uint64, writable bool) error {
return nil
}
// Translate implements memmap.Mappable.Translate.
func (fd *vfioFd) Translate(ctx context.Context, required, optional memmap.MappableRange, at hostarch.AccessType) ([]memmap.Translation, error) {
return []memmap.Translation{
{
Source: optional,
File: &fd.memmapFile,
Offset: optional.Start,
Perms: at,
},
}, nil
}
// InvalidateUnsavable implements memmap.Mappable.InvalidateUnsavable.
func (fd *vfioFd) InvalidateUnsavable(ctx context.Context) error {
return nil
}
type vfioFDMemmapFile struct {
fd *vfioFd
}
// IncRef implements memmap.File.IncRef.
func (mf *vfioFDMemmapFile) IncRef(memmap.FileRange, uint32) {
}
// DecRef implements memmap.File.DecRef.
func (mf *vfioFDMemmapFile) DecRef(fr memmap.FileRange) {
}
// MapInternal implements memmap.File.MapInternal.
func (mf *vfioFDMemmapFile) MapInternal(fr memmap.FileRange, at hostarch.AccessType) (safemem.BlockSeq, error) {
log.Traceback("tpuproxy: rejecting vfioFdMemmapFile.MapInternal")
return safemem.BlockSeq{}, linuxerr.EINVAL
}
// FD implements memmap.File.FD.
func (mf *vfioFDMemmapFile) FD() int {
return int(mf.fd.hostFd)
}