From e9b3218681cdfac0989e95b27642e4aec67d0ea6 Mon Sep 17 00:00:00 2001 From: Ayush Ranjan Date: Thu, 9 May 2024 14:51:25 -0700 Subject: [PATCH] Add NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD to nvproxy. Updates #10413 PiperOrigin-RevId: 632277477 --- pkg/abi/nvgpu/ctrl.go | 21 +++++++++++++++++ pkg/sentry/devices/nvproxy/frontend.go | 31 ++++++++++++++++++++++++++ pkg/sentry/devices/nvproxy/version.go | 1 + 3 files changed, 53 insertions(+) diff --git a/pkg/abi/nvgpu/ctrl.go b/pkg/abi/nvgpu/ctrl.go index 118e4d208..e29928f84 100644 --- a/pkg/abi/nvgpu/ctrl.go +++ b/pkg/abi/nvgpu/ctrl.go @@ -71,6 +71,27 @@ const ( NV0000_CTRL_CMD_SYSTEM_GET_FEATURES = 0x1f0 ) +// From src/common/sdk/nvidia/inc/ctrl/ctrl0000/ctrl0000unix.h: +const ( + NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD = 0x3d05 +) + +// +marshal +type NV0000_CTRL_OS_UNIX_EXPORT_OBJECT struct { + Type uint32 // enum NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE + // These fields are inside union `data`, in struct `rmObject`. + HDevice Handle + HParent Handle + HObject Handle +} + +// +marshal +type NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS struct { + Object NV0000_CTRL_OS_UNIX_EXPORT_OBJECT + FD int32 + Flags uint32 +} + // +marshal type NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS struct { SizeOfStrings uint32 diff --git a/pkg/sentry/devices/nvproxy/frontend.go b/pkg/sentry/devices/nvproxy/frontend.go index 4e412876f..d6bd0af52 100644 --- a/pkg/sentry/devices/nvproxy/frontend.go +++ b/pkg/sentry/devices/nvproxy/frontend.go @@ -561,6 +561,37 @@ func ctrlCmdFailWithStatus(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Para return err } +func ctrlExportObjectToFD(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters) (uintptr, error) { + var ctrlParams nvgpu.NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS + if ctrlParams.SizeBytes() != int(ioctlParams.ParamsSize) { + return 0, linuxerr.EINVAL + } + if _, err := ctrlParams.CopyIn(fi.t, addrFromP64(ioctlParams.Params)); err != nil { + return 0, err + } + ctlFileGeneric, _ := fi.t.FDTable().Get(ctrlParams.FD) + if ctlFileGeneric == nil { + return 0, linuxerr.EINVAL + } + defer ctlFileGeneric.DecRef(fi.ctx) + ctlFile, ok := ctlFileGeneric.Impl().(*frontendFD) + if !ok { + return 0, linuxerr.EINVAL + } + + origFD := ctrlParams.FD + ctrlParams.FD = ctlFile.hostFD + n, err := rmControlInvoke(fi, ioctlParams, &ctrlParams) + ctrlParams.FD = origFD + if err != nil { + return n, err + } + if _, err := ctrlParams.CopyOut(fi.t, addrFromP64(ioctlParams.Params)); err != nil { + return n, err + } + return n, nil +} + func ctrlClientSystemGetBuildVersion(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters) (uintptr, error) { var ctrlParams nvgpu.NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS if ctrlParams.SizeBytes() != int(ioctlParams.ParamsSize) { diff --git a/pkg/sentry/devices/nvproxy/version.go b/pkg/sentry/devices/nvproxy/version.go index d8295657b..38b105dcb 100644 --- a/pkg/sentry/devices/nvproxy/version.go +++ b/pkg/sentry/devices/nvproxy/version.go @@ -279,6 +279,7 @@ func Init() { nvgpu.NVA06F_CTRL_CMD_GPFIFO_SCHEDULE: rmControlSimple, nvgpu.NVC56F_CTRL_CMD_GET_KMB: rmControlSimple, nvgpu.NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION: ctrlClientSystemGetBuildVersion, + nvgpu.NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD: ctrlExportObjectToFD, nvgpu.NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST: ctrlDevFIFOGetChannelList, nvgpu.NV0080_CTRL_CMD_GPU_GET_CLASSLIST: ctrlDevGpuGetClasslist, nvgpu.NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS: ctrlSubdevFIFODisableChannels,