From 081bbcf36326895824b690b0741e5e6b82e4085f Mon Sep 17 00:00:00 2001 From: Anthony Cui Date: Thu, 15 Aug 2024 19:09:32 -0700 Subject: [PATCH] Add support for unsupported UVM ioctls used by cuda-tests/run_smoke.sh. Specifically, these are UVM_UNSET_PREFERRED_LOCATION, UVM_UNSET_ACCESSED_BY, and UVM_MIGRATE ioctls. PiperOrigin-RevId: 663543536 --- pkg/abi/nvgpu/uvm.go | 55 +++++++++++++++++++ pkg/sentry/devices/nvproxy/seccomp_filters.go | 12 ++++ pkg/sentry/devices/nvproxy/version.go | 8 +++ 3 files changed, 75 insertions(+) diff --git a/pkg/abi/nvgpu/uvm.go b/pkg/abi/nvgpu/uvm.go index 6c2ce44cf..a2fe7d78a 100644 --- a/pkg/abi/nvgpu/uvm.go +++ b/pkg/abi/nvgpu/uvm.go @@ -36,7 +36,10 @@ const ( UVM_UNREGISTER_GPU = 38 UVM_PAGEABLE_MEM_ACCESS = 39 UVM_SET_PREFERRED_LOCATION = 42 + UVM_UNSET_PREFERRED_LOCATION = 43 UVM_DISABLE_READ_DUPLICATION = 45 + UVM_UNSET_ACCESSED_BY = 47 + UVM_MIGRATE = 51 UVM_MIGRATE_RANGE_GROUP = 53 UVM_TOOLS_READ_PROCESS_MEMORY = 62 UVM_TOOLS_WRITE_PROCESS_MEMORY = 63 @@ -260,6 +263,14 @@ type UVM_SET_PREFERRED_LOCATION_PARAMS_V550 struct { RMStatus uint32 } +// +marshal +type UVM_UNSET_PREFERRED_LOCATION_PARAMS struct { + RequestedBase uint64 `nvproxy:"same"` + Length uint64 + RMStatus uint32 + Pad0 [4]byte +} + // +marshal type UVM_DISABLE_READ_DUPLICATION_PARAMS struct { RequestedBase uint64 `nvproxy:"same"` @@ -268,6 +279,50 @@ type UVM_DISABLE_READ_DUPLICATION_PARAMS struct { Pad0 [4]byte } +// +marshal +type UVM_UNSET_ACCESSED_BY_PARAMS struct { + RequestedBase uint64 `nvproxy:"same"` + Length uint64 + AccessedByUUID NvUUID + RMStatus uint32 + Pad0 [4]byte +} + +// +marshal +type UVM_MIGRATE_PARAMS struct { + Base uint64 `nvproxy:"same"` + Length uint64 + DestinationUUID NvUUID + Flags uint32 + _ [4]byte + SemaphoreAddress uint64 + SemaphorePayload uint32 + CPUNumaNode uint32 + UserSpaceStart uint64 + UserSpaceLength uint64 + RMStatus uint32 + _ [4]byte +} + +// UVM_MIGRATE_PARAMS_V550 is the updated version of +// UVM_MIGRATE_PARAMS since 550.40.07. +// +// +marshal +type UVM_MIGRATE_PARAMS_V550 struct { + Base uint64 `nvproxy:"UVM_MIGRATE_PARAMS"` + Length uint64 + DestinationUUID NvUUID + Flags uint32 + _ [4]byte + SemaphoreAddress uint64 + SemaphorePayload uint32 + CPUNumaNode int32 + UserSpaceStart uint64 + UserSpaceLength uint64 + RMStatus uint32 + _ [4]byte +} + // +marshal type UVM_MIGRATE_RANGE_GROUP_PARAMS struct { RangeGroupID uint64 `nvproxy:"same"` diff --git a/pkg/sentry/devices/nvproxy/seccomp_filters.go b/pkg/sentry/devices/nvproxy/seccomp_filters.go index e75cd8430..f580918b3 100644 --- a/pkg/sentry/devices/nvproxy/seccomp_filters.go +++ b/pkg/sentry/devices/nvproxy/seccomp_filters.go @@ -170,10 +170,22 @@ func Filters() seccomp.SyscallRules { seccomp.NonNegativeFD{}, seccomp.EqualTo(nvgpu.UVM_SET_PREFERRED_LOCATION), }, + seccomp.PerArg{ + seccomp.NonNegativeFD{}, + seccomp.EqualTo(nvgpu.UVM_UNSET_PREFERRED_LOCATION), + }, seccomp.PerArg{ seccomp.NonNegativeFD{}, seccomp.EqualTo(nvgpu.UVM_DISABLE_READ_DUPLICATION), }, + seccomp.PerArg{ + seccomp.NonNegativeFD{}, + seccomp.EqualTo(nvgpu.UVM_UNSET_ACCESSED_BY), + }, + seccomp.PerArg{ + seccomp.NonNegativeFD{}, + seccomp.EqualTo(nvgpu.UVM_MIGRATE), + }, seccomp.PerArg{ seccomp.NonNegativeFD{}, seccomp.EqualTo(nvgpu.UVM_MIGRATE_RANGE_GROUP), diff --git a/pkg/sentry/devices/nvproxy/version.go b/pkg/sentry/devices/nvproxy/version.go index afcf0805e..ce68c3faf 100644 --- a/pkg/sentry/devices/nvproxy/version.go +++ b/pkg/sentry/devices/nvproxy/version.go @@ -218,7 +218,10 @@ func Init() { nvgpu.UVM_UNREGISTER_GPU: uvmIoctlSimple[nvgpu.UVM_UNREGISTER_GPU_PARAMS], nvgpu.UVM_PAGEABLE_MEM_ACCESS: uvmIoctlSimple[nvgpu.UVM_PAGEABLE_MEM_ACCESS_PARAMS], nvgpu.UVM_SET_PREFERRED_LOCATION: uvmIoctlSimple[nvgpu.UVM_SET_PREFERRED_LOCATION_PARAMS], + nvgpu.UVM_UNSET_PREFERRED_LOCATION: uvmIoctlSimple[nvgpu.UVM_UNSET_PREFERRED_LOCATION_PARAMS], nvgpu.UVM_DISABLE_READ_DUPLICATION: uvmIoctlSimple[nvgpu.UVM_DISABLE_READ_DUPLICATION_PARAMS], + nvgpu.UVM_UNSET_ACCESSED_BY: uvmIoctlSimple[nvgpu.UVM_UNSET_ACCESSED_BY_PARAMS], + nvgpu.UVM_MIGRATE: uvmIoctlSimple[nvgpu.UVM_MIGRATE_PARAMS], nvgpu.UVM_MIGRATE_RANGE_GROUP: uvmIoctlSimple[nvgpu.UVM_MIGRATE_RANGE_GROUP_PARAMS], nvgpu.UVM_MAP_DYNAMIC_PARALLELISM_REGION: uvmIoctlSimple[nvgpu.UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS], nvgpu.UVM_UNMAP_EXTERNAL: uvmIoctlSimple[nvgpu.UVM_UNMAP_EXTERNAL_PARAMS], @@ -413,7 +416,10 @@ func Init() { nvgpu.UVM_UNREGISTER_GPU: getStructName(nvgpu.UVM_UNREGISTER_GPU_PARAMS{}), nvgpu.UVM_PAGEABLE_MEM_ACCESS: getStructName(nvgpu.UVM_PAGEABLE_MEM_ACCESS_PARAMS{}), nvgpu.UVM_SET_PREFERRED_LOCATION: getStructName(nvgpu.UVM_SET_PREFERRED_LOCATION_PARAMS{}), + nvgpu.UVM_UNSET_PREFERRED_LOCATION: getStructName(nvgpu.UVM_UNSET_PREFERRED_LOCATION_PARAMS{}), nvgpu.UVM_DISABLE_READ_DUPLICATION: getStructName(nvgpu.UVM_DISABLE_READ_DUPLICATION_PARAMS{}), + nvgpu.UVM_UNSET_ACCESSED_BY: getStructName(nvgpu.UVM_UNSET_ACCESSED_BY_PARAMS{}), + nvgpu.UVM_MIGRATE: getStructName(nvgpu.UVM_MIGRATE_PARAMS{}), nvgpu.UVM_MIGRATE_RANGE_GROUP: getStructName(nvgpu.UVM_MIGRATE_RANGE_GROUP_PARAMS{}), nvgpu.UVM_MAP_DYNAMIC_PARALLELISM_REGION: getStructName(nvgpu.UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS{}), nvgpu.UVM_UNMAP_EXTERNAL: getStructName(nvgpu.UVM_UNMAP_EXTERNAL_PARAMS{}), @@ -624,6 +630,7 @@ func Init() { abi.controlCmd[(nvgpu.NV2081_BINAPI<<16)|0x0108] = rmControlSimple abi.controlCmd[nvgpu.NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS] = ctrlClientSystemGetP2PCapsV550 abi.uvmIoctl[nvgpu.UVM_SET_PREFERRED_LOCATION] = uvmIoctlSimple[nvgpu.UVM_SET_PREFERRED_LOCATION_PARAMS_V550] + abi.uvmIoctl[nvgpu.UVM_MIGRATE] = uvmIoctlSimple[nvgpu.UVM_MIGRATE_PARAMS_V550] prevNames := abi.getStructNames abi.getStructNames = func() *driverStructNames { @@ -639,6 +646,7 @@ func Init() { names.controlNames[(nvgpu.NV2081_BINAPI<<16)|0x0108] = nil names.controlNames[nvgpu.NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS] = getStructName(nvgpu.NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_V550{}) names.uvmNames[nvgpu.UVM_SET_PREFERRED_LOCATION] = getStructName(nvgpu.UVM_SET_PREFERRED_LOCATION_PARAMS_V550{}) + names.uvmNames[nvgpu.UVM_MIGRATE] = getStructName(nvgpu.UVM_MIGRATE_PARAMS_V550{}) return names }