From 26e0e5df83a0d79bb5dc665cf3d405bdb529e537 Mon Sep 17 00:00:00 2001 From: Jing Chen Date: Wed, 13 Mar 2024 10:46:57 -0700 Subject: [PATCH] Implement memmap.Mappable and memmap.File for vfioFd. PiperOrigin-RevId: 615472230 --- pkg/sentry/devices/tpuproxy/BUILD | 1 + pkg/sentry/devices/tpuproxy/device.go | 1 + pkg/sentry/devices/tpuproxy/tpu.go | 2 +- pkg/sentry/devices/tpuproxy/tpu_mmap.go | 10 +-- pkg/sentry/devices/tpuproxy/vfio.go | 7 +- pkg/sentry/devices/tpuproxy/vfio_mmap.go | 84 ++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 pkg/sentry/devices/tpuproxy/vfio_mmap.go diff --git a/pkg/sentry/devices/tpuproxy/BUILD b/pkg/sentry/devices/tpuproxy/BUILD index 31ab05871..10fd936b9 100644 --- a/pkg/sentry/devices/tpuproxy/BUILD +++ b/pkg/sentry/devices/tpuproxy/BUILD @@ -12,6 +12,7 @@ go_library( "tpu.go", "tpu_mmap.go", "vfio.go", + "vfio_mmap.go", ], visibility = [ "//pkg/sentry:internal", diff --git a/pkg/sentry/devices/tpuproxy/device.go b/pkg/sentry/devices/tpuproxy/device.go index 46e5544a0..667a8b9a6 100644 --- a/pkg/sentry/devices/tpuproxy/device.go +++ b/pkg/sentry/devices/tpuproxy/device.go @@ -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 } diff --git a/pkg/sentry/devices/tpuproxy/tpu.go b/pkg/sentry/devices/tpuproxy/tpu.go index 624d2c01f..6409e7290 100644 --- a/pkg/sentry/devices/tpuproxy/tpu.go +++ b/pkg/sentry/devices/tpuproxy/tpu.go @@ -40,7 +40,7 @@ type tpuFD struct { hostFD int32 device *tpuDevice queue waiter.Queue - memmapFile tpuFdMemmapFile + memmapFile tpuFDMemmapFile } // Release implements vfs.FileDescriptionImpl.Release. diff --git a/pkg/sentry/devices/tpuproxy/tpu_mmap.go b/pkg/sentry/devices/tpuproxy/tpu_mmap.go index f2a47869a..cc557cf26 100644 --- a/pkg/sentry/devices/tpuproxy/tpu_mmap.go +++ b/pkg/sentry/devices/tpuproxy/tpu_mmap.go @@ -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) } diff --git a/pkg/sentry/devices/tpuproxy/vfio.go b/pkg/sentry/devices/tpuproxy/vfio.go index 3efc76935..7dbf5ae1c 100644 --- a/pkg/sentry/devices/tpuproxy/vfio.go +++ b/pkg/sentry/devices/tpuproxy/vfio.go @@ -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. diff --git a/pkg/sentry/devices/tpuproxy/vfio_mmap.go b/pkg/sentry/devices/tpuproxy/vfio_mmap.go new file mode 100644 index 000000000..535bc9171 --- /dev/null +++ b/pkg/sentry/devices/tpuproxy/vfio_mmap.go @@ -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) +}