TECH ALERT: NVIDIA Open Kernel Modules Symbol License Change

In order to improve interoperability with GPL-licensed Linux kernel drivers, symbol exports from the NVIDIA Open Kernel Modules driver will be switching to EXPORT_SYMBOL_GPL from EXPORT_SYMBOL beginning in release R550. This change will primarily affect developers working on kernel modules that interoperate with NVIDIA drivers. Developers or end consumers using CUDA in applications and not writing Linux kernel drivers will be unaffected by this change.

Recent changes in the Linux kernel limit the interoperability of GPL-licensed drivers with non-GPL-licensed drivers, in particular with regard to the availability of exported symbols. Refer to Table 1 to understand what symbols are visible where.

image

** This combination will result in the GPL driver inheriting kernel taint from the non-GPL driver

In table 1, the current behavior of the NVIDIA Open Kernel Modules (pre-R550) is represented by the first row, NVIDIA_GPL → EXPORT_SYMBOL. The new behavior (post-R550) is represented by the second row, NVIDIA_GPL → EXPORT_SYMBOL_GPL.

Note that this change results in better interoperability with GPL-licensed third-party drivers, and removes the ability to interoperate with non-GPL-licensed drivers.

Prior to R550, the NVIDIA Open Kernel Modules driver used EXPORT_SYMBOL for the following symbols. If your driver is using these exported symbols, be aware of the pending change and ensure your module will be able to continue to consume these symbols after upgrading to R550+.

General

  • nvidia_register_module
  • nvidia_unregister_module

Error callbacks

  • nv_register_error_cb
  • nv_unregister_error_cb

P2P

  • nvidia_p2p_init_mapping
  • nvidia_p2p_destroy_mapping
  • nvidia_p2p_get_pages
  • nvidia_p2p_get_pages_persistent
  • nvidia_p2p_free_page_table
  • nvidia_p2p_put_pages
  • nvidia_p2p_put_pages_persistent
  • nvidia_p2p_dma_map_pages
  • nvidia_p2p_dma_unmap_pages
  • nvidia_p2p_free_dma_mapping
  • nvidia_p2p_register_rsync_driver
  • nvidia_p2p_unregister_rsync_driver
  • nvidia_p2p_get_rsync_registers
  • nvidia_p2p_put_rsync_registers

Kernel Modesetting

  • nvidia_get_rm_ops
  • nvKmsKapiGetFunctionsTable

UVM

  • nvUvmInterfaceRegisterGpu
  • nvUvmInterfaceUnregisterGpu
  • nvUvmInterfaceSessionCreate
  • nvUvmInterfaceSessionDestroy
  • nvUvmInterfaceDeviceCreate
  • nvUvmInterfaceDeviceDestroy
  • nvUvmInterfaceDupAddressSpace
  • nvUvmInterfaceAddressSpaceCreate
  • nvUvmInterfaceAddressSpaceDestroy
  • nvUvmInterfaceMemoryAllocFB
  • nvUvmInterfaceMemoryAllocSys
  • nvUvmInterfaceGetP2PCaps
  • nvUvmInterfaceGetPmaObject
  • nvUvmInterfacePmaRegisterEvictionCallbacks
  • nvUvmInterfacePmaUnregisterEvictionCallbacks
  • nvUvmInterfacePmaAllocPages
  • nvUvmInterfacePmaPinPages
  • nvUvmInterfacePmaUnpinPages
  • nvUvmInterfaceMemoryFree
  • nvUvmInterfacePmaFreePages
  • nvUvmInterfaceMemoryCpuMap
  • nvUvmInterfaceMemoryCpuUnMap
  • nvUvmInterfaceTsgAllocate
  • nvUvmInterfaceTsgDestroy
  • nvUvmInterfaceChannelAllocate
  • nvUvmInterfaceChannelDestroy
  • nvUvmInterfaceQueryCaps
  • nvUvmInterfaceQueryCopyEnginesCaps
  • nvUvmInterfaceGetGpuInfo
  • nvUvmInterfaceServiceDeviceInterruptsRM
  • nvUvmInterfaceSetPageDirectory
  • nvUvmInterfaceUnsetPageDirectory
  • nvUvmInterfaceDupAllocation
  • nvUvmInterfaceDupMemory
  • nvUvmInterfaceFreeDupedHandle
  • nvUvmInterfaceGetFbInfo
  • nvUvmInterfaceGetEccInfo
  • nvUvmInterfaceOwnPageFaultIntr
  • nvUvmInterfaceInitFaultInfo
  • nvUvmInterfaceInitAccessCntrInfo
  • nvUvmInterfaceEnableAccessCntr
  • nvUvmInterfaceDestroyFaultInfo
  • nvUvmInterfaceHasPendingNonReplayableFaults
  • nvUvmInterfaceGetNonReplayableFaults
  • nvUvmInterfaceFlushReplayableFaultBuffer
  • nvUvmInterfaceDestroyAccessCntrInfo
  • nvUvmInterfaceDisableAccessCntr
  • nvUvmInterfaceRegisterUvmCallbacks
  • nvUvmInterfaceDeRegisterUvmOps
  • nvUvmInterfaceP2pObjectCreate
  • nvUvmInterfaceP2pObjectDestroy
  • nvUvmInterfaceGetExternalAllocPtes
  • nvUvmInterfaceRetainChannel
  • nvUvmInterfaceBindChannelResources
  • nvUvmInterfaceReleaseChannel
  • nvUvmInterfaceStopChannel
  • nvUvmInterfaceGetChannelResourcePtes
  • nvUvmInterfaceReportNonReplayableFault
  • nvUvmInterfacePagingChannelAllocate
  • nvUvmInterfacePagingChannelDestroy
  • nvUvmInterfacePagingChannelsMap
  • nvUvmInterfacePagingChannelsUnmap
  • nvUvmInterfacePagingChannelPushStream
  • nvUvmInterfaceCslInitContext
  • nvUvmInterfaceDeinitCslContext
  • nvUvmInterfaceCslRotateIv
  • nvUvmInterfaceCslEncrypt
  • nvUvmInterfaceCslDecrypt
  • nvUvmInterfaceCslSign
  • nvUvmInterfaceCslQueryMessagePool
  • nvUvmInterfaceCslIncrementIv