Add support for missing ioctls used by Triton Interface Server.

PiperOrigin-RevId: 654886437
This commit is contained in:
Ayush Ranjan
2024-07-22 14:04:43 -07:00
committed by gVisor bot
parent 84f1146368
commit e2f328e234
6 changed files with 150 additions and 73 deletions
+17
View File
@@ -41,6 +41,7 @@ const (
NV01_MEMORY_SYSTEM_OS_DESCRIPTOR = 0x00000071
NV01_EVENT_OS_EVENT = 0x00000079
NV01_DEVICE_0 = 0x00000080
RM_USER_SHARED_DATA = 0x000000de
NV_MEMORY_FABRIC = 0x000000f8
NV_MEMORY_MULTICAST_FABRIC = 0x000000fd
NV20_SUBDEVICE_0 = 0x00002080
@@ -314,6 +315,22 @@ type NV_HOPPER_USERMODE_A_PARAMS struct {
Priv uint8
}
// NV00DE_ALLOC_PARAMETERS is the alloc param type for RM_USER_SHARED_DATA,
// from src/common/sdk/nvidia/inc/class/cl00de.h.
//
// +marshal
type NV00DE_ALLOC_PARAMETERS struct {
Reserved uint32
}
// NV00DE_ALLOC_PARAMETERS_V545 is the updated version of
// NV00DE_ALLOC_PARAMETERS since 545.23.06.
//
// +marshal
type NV00DE_ALLOC_PARAMETERS_V545 struct {
PolledDataMask uint64
}
// +marshal
type nv00f8Map struct {
offset uint64
+81 -1
View File
@@ -29,12 +29,28 @@ const (
// From src/common/sdk/nvidia/inc/ctrl/ctrlxxxx.h:
// +marshal
// NVXXXX_CTRL_XXX_INFO is typedef-ed as the following in the driver:
// - NV2080_CTRL_GR_INFO
// - NV2080_CTRL_BIOS_INFO
// - NV0041_CTRL_SURFACE_INFO
//
// +marshal slice:CtrlXxxInfoSlice
type NVXXXX_CTRL_XXX_INFO struct {
Index uint32
Data uint32
}
// CtrlXxxInfoSize is sizeof(NVXXXX_CTRL_XXX_INFO).
var CtrlXxxInfoSize = uint32((*NVXXXX_CTRL_XXX_INFO)(nil).SizeBytes())
// HasCtrlInfoList is a type constraint for parameter structs containing a list
// of NVXXXX_CTRL_XXX_INFO and are simple otherwise.
type HasCtrlInfoList interface {
ListSize() uint32
SetCtrlInfoList(ptr P64)
CtrlInfoList() P64
}
// From src/common/sdk/nvidia/inc/ctrl/ctrl0000/ctrl0000client.h:
const (
NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE = 0xd01
@@ -183,6 +199,21 @@ type NV0041_CTRL_GET_SURFACE_INFO_PARAMS struct {
SurfaceInfoList P64
}
// ListSize implements HasCtrlInfoList.ListSize.
func (p *NV0041_CTRL_GET_SURFACE_INFO_PARAMS) ListSize() uint32 {
return p.SurfaceInfoListSize
}
// SetCtrlInfoList implements HasCtrlInfoList.SetCtrlInfoList.
func (p *NV0041_CTRL_GET_SURFACE_INFO_PARAMS) SetCtrlInfoList(ptr P64) {
p.SurfaceInfoList = ptr
}
// CtrlInfoList implements HasCtrlInfoList.CtrlInfoList.
func (p *NV0041_CTRL_GET_SURFACE_INFO_PARAMS) CtrlInfoList() P64 {
return p.SurfaceInfoList
}
// From src/common/sdk/nvidia/inc/ctrl/ctrl0080/ctrl0080fb.h:
const (
NV0080_CTRL_CMD_FB_GET_CAPS_V2 = 0x801307
@@ -251,6 +282,33 @@ type NV00FD_CTRL_ATTACH_GPU_PARAMS struct {
DevDescriptor uint64
}
// From src/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080bios.h:
const (
NV2080_CTRL_CMD_BIOS_GET_INFO = 0x20800802
)
// +marshal
type NV2080_CTRL_BIOS_GET_INFO_PARAMS struct {
BiosInfoListSize uint32
Pad [4]byte
BiosInfoList P64
}
// ListSize implements HasCtrlInfoList.ListSize.
func (p *NV2080_CTRL_BIOS_GET_INFO_PARAMS) ListSize() uint32 {
return p.BiosInfoListSize
}
// SetCtrlInfoList implements HasCtrlInfoList.SetCtrlInfoList.
func (p *NV2080_CTRL_BIOS_GET_INFO_PARAMS) SetCtrlInfoList(ptr P64) {
p.BiosInfoList = ptr
}
// CtrlInfoList implements HasCtrlInfoList.CtrlInfoList.
func (p *NV2080_CTRL_BIOS_GET_INFO_PARAMS) CtrlInfoList() P64 {
return p.BiosInfoList
}
// From src/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080bus.h:
const (
NV2080_CTRL_CMD_BUS_GET_PCI_INFO = 0x20801801
@@ -265,6 +323,11 @@ const (
NV2080_CTRL_CMD_CE_GET_ALL_CAPS = 0x20802a0a
)
// From src/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080event.h:
const (
NV2080_CTRL_CMD_EVENT_SET_NOTIFICATION = 0x20800301
)
// From src/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080fb.h:
const (
NV2080_CTRL_CMD_FB_GET_INFO_V2 = 0x20801303
@@ -303,9 +366,11 @@ const (
NV2080_CTRL_CMD_GPU_GET_SIMULATION_INFO = 0x20800119
NV2080_CTRL_CMD_GPU_QUERY_ECC_STATUS = 0x2080012f
NV2080_CTRL_CMD_GPU_QUERY_COMPUTE_MODE_RULES = 0x20800131
NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO = 0x2080013f
NV2080_CTRL_CMD_GPU_ACQUIRE_COMPUTE_MODE_RESERVATION = 0x20800145 // undocumented; paramSize == 0
NV2080_CTRL_CMD_GPU_RELEASE_COMPUTE_MODE_RESERVATION = 0x20800146 // undocumented; paramSize == 0
NV2080_CTRL_CMD_GPU_GET_GID_INFO = 0x2080014a
NV2080_CTRL_CMD_GPU_GET_INFOROM_IMAGE_VERSION = 0x20800156
NV2080_CTRL_CMD_GPU_GET_ENGINES_V2 = 0x20800170
NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS = 0x2080018b
NV2080_CTRL_CMD_GPU_GET_PIDS = 0x2080018d
@@ -344,6 +409,21 @@ type NV2080_CTRL_GR_GET_INFO_PARAMS struct {
GRRouteInfo NV0080_CTRL_GR_ROUTE_INFO
}
// ListSize implements HasCtrlInfoList.ListSize.
func (p *NV2080_CTRL_GR_GET_INFO_PARAMS) ListSize() uint32 {
return p.GRInfoListSize
}
// SetCtrlInfoList implements HasCtrlInfoList.SetCtrlInfoList.
func (p *NV2080_CTRL_GR_GET_INFO_PARAMS) SetCtrlInfoList(ptr P64) {
p.GRInfoList = ptr
}
// CtrlInfoList implements HasCtrlInfoList.CtrlInfoList.
func (p *NV2080_CTRL_GR_GET_INFO_PARAMS) CtrlInfoList() P64 {
return p.GRInfoList
}
// From src/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080mc.h:
const (
NV2080_CTRL_CMD_MC_GET_ARCH_INFO = 0x20801701
+17 -1
View File
@@ -573,7 +573,23 @@ func ctrlMemoryMulticastFabricAttachGPU(fi *frontendIoctlState, ioctlParams *nvg
return 0, err
}
return ctrlMemoryMulticastFabricAttachGPUInvoke(fi, ioctlParams, &ctrlParams)
origDevDescriptor := ctrlParams.DevDescriptor
devDescriptor, _ := fi.t.FDTable().Get(int32(origDevDescriptor))
if devDescriptor == nil {
return 0, linuxerr.EINVAL
}
defer devDescriptor.DecRef(fi.ctx)
devDesc, ok := devDescriptor.Impl().(*frontendFD)
if !ok {
return 0, linuxerr.EINVAL
}
ctrlParams.DevDescriptor = uint64(devDesc.hostFD)
n, err := rmControlInvoke(fi, ioctlParams, &ctrlParams)
ctrlParams.DevDescriptor = origDevDescriptor
// Note that ctrlParams.CopyOut() is not called here because
// NV00FD_CTRL_ATTACH_GPU_PARAMS is an input-only parameter.
return n, err
}
func ctrlClientSystemGetBuildVersion(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters) (uintptr, error) {
+22 -69
View File
@@ -47,23 +47,6 @@ func rmControlInvoke[Params any](fi *frontendIoctlState, ioctlParams *nvgpu.NVOS
return n, nil
}
func ctrlMemoryMulticastFabricAttachGPUInvoke(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters, ctrlParams *nvgpu.NV00FD_CTRL_ATTACH_GPU_PARAMS) (uintptr, error) {
origDevDescriptor := ctrlParams.DevDescriptor
devDescriptor, _ := fi.t.FDTable().Get(int32(origDevDescriptor))
if devDescriptor == nil {
return 0, linuxerr.EINVAL
}
defer devDescriptor.DecRef(fi.ctx)
devDesc, ok := devDescriptor.Impl().(*frontendFD)
if !ok {
return 0, linuxerr.EINVAL
}
ctrlParams.DevDescriptor = uint64(devDesc.hostFD)
n, err := rmControlInvoke(fi, ioctlParams, ctrlParams)
ctrlParams.DevDescriptor = origDevDescriptor
return n, err
}
func ctrlClientSystemGetBuildVersionInvoke(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters, ctrlParams *nvgpu.NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS, driverVersionBuf, versionBuf, titleBuf *byte) (uintptr, error) {
// *Buf arguments don't need runtime.KeepAlive() since our caller
// ctrlClientSystemGetBuildVersion() copies them out, keeping them alive
@@ -87,34 +70,40 @@ func ctrlClientSystemGetBuildVersionInvoke(fi *frontendIoctlState, ioctlParams *
return n, nil
}
func ctrlClientGetSurfaceInfo(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters) (uintptr, error) {
var ctrlParams nvgpu.NV0041_CTRL_GET_SURFACE_INFO_PARAMS
func ctrlIoctlHasInfoList[Params any, PtrParams hasCtrlInfoListPtr[Params]](fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters) (uintptr, error) {
var ctrlParamsValue Params
ctrlParams := PtrParams(&ctrlParamsValue)
if ctrlParams.SizeBytes() != int(ioctlParams.ParamsSize) {
return 0, linuxerr.EINVAL
}
if _, err := ctrlParams.CopyIn(fi.t, addrFromP64(ioctlParams.Params)); err != nil {
return 0, err
}
if ctrlParams.SurfaceInfoListSize == 0 {
// Compare
// src/nvidia/src/kernel/gpu/mem_mgr/mem_ctrl.c:memCtrlCmdGetSurfaceInfoLvm_IMPL().
return 0, nil
}
surfaceInfoList := make([]byte, int(ctrlParams.SurfaceInfoListSize)*(*nvgpu.NVXXXX_CTRL_XXX_INFO)(nil).SizeBytes())
if _, err := fi.t.CopyInBytes(addrFromP64(ctrlParams.SurfaceInfoList), surfaceInfoList); err != nil {
return 0, err
var infoList []byte
if listSize := ctrlParams.ListSize(); listSize > 0 {
infoList = make([]byte, listSize*nvgpu.CtrlXxxInfoSize)
if _, err := fi.t.CopyInBytes(addrFromP64(ctrlParams.CtrlInfoList()), infoList); err != nil {
return 0, err
}
}
origSurfaceInfoList := ctrlParams.SurfaceInfoList
ctrlParams.SurfaceInfoList = p64FromPtr(unsafe.Pointer(&surfaceInfoList[0]))
n, err := rmControlInvoke(fi, ioctlParams, &ctrlParams)
ctrlParams.SurfaceInfoList = origSurfaceInfoList
origInfoList := ctrlParams.CtrlInfoList()
if infoList == nil {
ctrlParams.SetCtrlInfoList(p64FromPtr(unsafe.Pointer(nil)))
} else {
ctrlParams.SetCtrlInfoList(p64FromPtr(unsafe.Pointer(&infoList[0])))
}
n, err := rmControlInvoke(fi, ioctlParams, ctrlParams)
ctrlParams.SetCtrlInfoList(origInfoList)
if err != nil {
return n, err
}
if _, err := fi.t.CopyOutBytes(addrFromP64(origSurfaceInfoList), surfaceInfoList); err != nil {
return 0, err
if infoList != nil {
if _, err := fi.t.CopyOutBytes(addrFromP64(origInfoList), infoList); err != nil {
return n, err
}
}
if _, err := ctrlParams.CopyOut(fi.t, addrFromP64(ioctlParams.Params)); err != nil {
return n, err
@@ -186,42 +175,6 @@ func ctrlDevFIFOGetChannelList(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54
return n, nil
}
func ctrlSubdevGRGetInfo(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS54Parameters) (uintptr, error) {
var ctrlParams nvgpu.NV2080_CTRL_GR_GET_INFO_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
}
if ctrlParams.GRInfoListSize == 0 {
// Compare
// src/nvidia/src/kernel/gpu/gr/kernel_graphics.c:_kgraphicsCtrlCmdGrGetInfoV2().
return 0, linuxerr.EINVAL
}
infoList := make([]byte, int(ctrlParams.GRInfoListSize)*(*nvgpu.NVXXXX_CTRL_XXX_INFO)(nil).SizeBytes())
if _, err := fi.t.CopyInBytes(addrFromP64(ctrlParams.GRInfoList), infoList); err != nil {
return 0, err
}
origGRInfoList := ctrlParams.GRInfoList
ctrlParams.GRInfoList = p64FromPtr(unsafe.Pointer(&infoList[0]))
n, err := rmControlInvoke(fi, ioctlParams, &ctrlParams)
ctrlParams.GRInfoList = origGRInfoList
if err != nil {
return n, err
}
if _, err := fi.t.CopyOutBytes(addrFromP64(origGRInfoList), infoList); err != nil {
return n, err
}
if _, err := ctrlParams.CopyOut(fi.t, addrFromP64(ioctlParams.Params)); err != nil {
return n, err
}
return n, nil
}
func rmAllocInvoke[Params any](fi *frontendIoctlState, ioctlParams *nvgpu.NVOS64Parameters, allocParams *Params, isNVOS64 bool, addObjLocked func(fi *frontendIoctlState, ioctlParams *nvgpu.NVOS64Parameters, rightsRequested nvgpu.RS_ACCESS_MASK, allocParams *Params)) (uintptr, error) {
defer runtime.KeepAlive(allocParams) // since we convert to non-pointer-typed P64
+5
View File
@@ -101,6 +101,11 @@ type hasFrontendFDPtr[T any] interface {
nvgpu.HasFrontendFD
}
type hasCtrlInfoListPtr[T any] interface {
marshalPtr[T]
nvgpu.HasCtrlInfoList
}
// NvidiaDeviceFD is an interface that should be implemented by all
// vfs.FileDescriptionImpl of Nvidia devices.
type NvidiaDeviceFD interface {
+8 -2
View File
@@ -234,6 +234,7 @@ func Init() {
nvgpu.NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_BUS_GET_C2C_INFO: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_CE_GET_ALL_CAPS: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_EVENT_SET_NOTIFICATION: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_FB_GET_INFO_V2: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_INFO_V2: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_SIZE: rmControlSimple,
@@ -242,9 +243,11 @@ func Init() {
nvgpu.NV2080_CTRL_CMD_GPU_GET_SIMULATION_INFO: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_QUERY_ECC_STATUS: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_QUERY_COMPUTE_MODE_RULES: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_ACQUIRE_COMPUTE_MODE_RESERVATION: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_RELEASE_COMPUTE_MODE_RESERVATION: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_GID_INFO: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_INFOROM_IMAGE_VERSION: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_ENGINES_V2: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS: rmControlSimple,
nvgpu.NV2080_CTRL_CMD_GPU_GET_PIDS: rmControlSimple,
@@ -291,12 +294,13 @@ func Init() {
nvgpu.NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD: ctrlHasFrontendFD[nvgpu.NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS],
nvgpu.NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_FROM_FD: ctrlHasFrontendFD[nvgpu.NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS],
nvgpu.NV0000_CTRL_CMD_OS_UNIX_GET_EXPORT_OBJECT_INFO: ctrlHasFrontendFD[nvgpu.NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS],
nvgpu.NV0041_CTRL_CMD_GET_SURFACE_INFO: ctrlClientGetSurfaceInfo,
nvgpu.NV0041_CTRL_CMD_GET_SURFACE_INFO: ctrlIoctlHasInfoList[nvgpu.NV0041_CTRL_GET_SURFACE_INFO_PARAMS],
nvgpu.NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST: ctrlDevFIFOGetChannelList,
nvgpu.NV00FD_CTRL_CMD_ATTACH_GPU: ctrlMemoryMulticastFabricAttachGPU,
nvgpu.NV0080_CTRL_CMD_GPU_GET_CLASSLIST: ctrlDevGpuGetClasslist,
nvgpu.NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS: ctrlSubdevFIFODisableChannels,
nvgpu.NV2080_CTRL_CMD_GR_GET_INFO: ctrlSubdevGRGetInfo,
nvgpu.NV2080_CTRL_CMD_BIOS_GET_INFO: ctrlIoctlHasInfoList[nvgpu.NV2080_CTRL_BIOS_GET_INFO_PARAMS],
nvgpu.NV2080_CTRL_CMD_GR_GET_INFO: ctrlIoctlHasInfoList[nvgpu.NV2080_CTRL_GR_GET_INFO_PARAMS],
nvgpu.NV503C_CTRL_CMD_REGISTER_VA_SPACE: ctrlRegisterVASpace,
},
allocationClass: map[nvgpu.ClassID]allocationClassHandler{
@@ -308,6 +312,7 @@ func Init() {
nvgpu.NV01_EVENT_OS_EVENT: rmAllocEventOSEvent,
nvgpu.NV2081_BINAPI: rmAllocSimple[nvgpu.NV2081_ALLOC_PARAMETERS],
nvgpu.NV01_DEVICE_0: rmAllocSimple[nvgpu.NV0080_ALLOC_PARAMETERS],
nvgpu.RM_USER_SHARED_DATA: rmAllocSimple[nvgpu.NV00DE_ALLOC_PARAMETERS],
nvgpu.NV_MEMORY_FABRIC: rmAllocSimple[nvgpu.NV00F8_ALLOCATION_PARAMETERS],
nvgpu.NV_MEMORY_MULTICAST_FABRIC: rmAllocSimple[nvgpu.NV00FD_ALLOCATION_PARAMETERS],
nvgpu.NV20_SUBDEVICE_0: rmAllocSimple[nvgpu.NV2080_ALLOC_PARAMETERS],
@@ -356,6 +361,7 @@ func Init() {
v545_23_06 := func() *driverABI {
abi := v535_113_01()
abi.controlCmd[nvgpu.NV0000_CTRL_CMD_OS_UNIX_GET_EXPORT_OBJECT_INFO] = ctrlHasFrontendFD[nvgpu.NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS_V545]
abi.allocationClass[nvgpu.RM_USER_SHARED_DATA] = rmAllocSimple[nvgpu.NV00DE_ALLOC_PARAMETERS_V545]
abi.allocationClass[nvgpu.NV_MEMORY_MULTICAST_FABRIC] = rmAllocSimple[nvgpu.NV00FD_ALLOCATION_PARAMETERS_V545]
abi.allocationClass[nvgpu.NV01_MEMORY_SYSTEM] = rmAllocSimple[nvgpu.NV_MEMORY_ALLOCATION_PARAMS_V545]
abi.allocationClass[nvgpu.NV01_MEMORY_LOCAL_USER] = rmAllocSimple[nvgpu.NV_MEMORY_ALLOCATION_PARAMS_V545]