fix: Crash on over memory allocation

- Add defer backing flag to gem create ioctl
- Make memory resident before lock

Related-To: NEO-13403

Signed-off-by: Bellekallu Rajkiran <bellekallu.rajkiran@intel.com>
This commit is contained in:
Bellekallu Rajkiran
2025-02-03 10:27:00 +00:00
committed by Compute-Runtime-Automation
parent aab1113632
commit 3bef9f886a
9 changed files with 78 additions and 4 deletions

View File

@@ -1518,8 +1518,17 @@ void *DrmMemoryManager::lockResourceImpl(GraphicsAllocation &graphicsAllocation)
return cpuPtr;
}
auto bo = static_cast<DrmAllocation &>(graphicsAllocation).getBO();
auto rootDeviceIndex = graphicsAllocation.getRootDeviceIndex();
auto ioctlHelper = this->getDrm(rootDeviceIndex).getIoctlHelper();
if (ioctlHelper->makeResidentBeforeLockNeeded()) {
auto memoryOperationsInterface = static_cast<DrmMemoryOperationsHandler *>(executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface.get());
auto graphicsAllocationPtr = &graphicsAllocation;
[[maybe_unused]] auto ret = memoryOperationsInterface->makeResidentWithinOsContext(getDefaultOsContext(rootDeviceIndex), ArrayRef<NEO::GraphicsAllocation *>(&graphicsAllocationPtr, 1), false) == MemoryOperationsStatus::success;
DEBUG_BREAK_IF(!ret);
}
auto bo = static_cast<DrmAllocation &>(graphicsAllocation).getBO();
if (graphicsAllocation.getAllocationType() == AllocationType::writeCombined) {
auto addr = lockBufferObject(bo);
auto alignedAddr = alignUp(addr, MemoryConstants::pageSize64k);

View File

@@ -236,6 +236,8 @@ class IoctlHelper {
virtual bool isTimestampsRefreshEnabled() { return false; }
virtual bool makeResidentBeforeLockNeeded() const { return false; }
protected:
Drm &drm;
ExternalCtx *externalCtx = nullptr;

View File

@@ -678,6 +678,10 @@ int IoctlHelperXe::createGemExt(const MemRegionsVec &memClassInstances, size_t a
create.placement = static_cast<uint32_t>(memoryInstances.to_ulong());
create.cpu_caching = this->getCpuCachingMode(isCoherent, isSysMemOnly);
if (debugManager.flags.EnableDeferBacking.get()) {
create.flags |= DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING;
}
printDebugString(debugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "Performing DRM_IOCTL_XE_GEM_CREATE with {vmid=0x%x size=0x%lx flags=0x%x placement=0x%x caching=%hu }",
create.vm_id, create.size, create.flags, create.placement, create.cpu_caching);
@@ -720,6 +724,10 @@ uint32_t IoctlHelperXe::createGem(uint64_t size, uint32_t memoryBanks, std::opti
create.placement = static_cast<uint32_t>(memoryInstances.to_ulong());
create.cpu_caching = this->getCpuCachingMode(isCoherent, isSysMemOnly);
if (debugManager.flags.EnableDeferBacking.get()) {
create.flags |= DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING;
}
printDebugString(debugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "Performing DRM_IOCTL_XE_GEM_CREATE with {vmid=0x%x size=0x%lx flags=0x%x placement=0x%x caching=%hu }",
create.vm_id, create.size, create.flags, create.placement, create.cpu_caching);
@@ -1566,6 +1574,14 @@ bool IoctlHelperXe::isImmediateVmBindRequired() const {
return true;
}
bool IoctlHelperXe::makeResidentBeforeLockNeeded() const {
auto makeResidentBeforeLockNeeded = false;
if (debugManager.flags.EnableDeferBacking.get()) {
makeResidentBeforeLockNeeded = true;
}
return makeResidentBeforeLockNeeded;
}
void IoctlHelperXe::insertEngineToContextParams(ContextParamEngines<> &contextParamEngines, uint32_t engineId, const EngineClassInstance *engineClassInstance, uint32_t tileId, bool hasVirtualEngines) {
auto engines = reinterpret_cast<drm_xe_engine_class_instance *>(contextParamEngines.enginesData);
if (engineClassInstance) {

View File

@@ -133,6 +133,7 @@ class IoctlHelperXe : public IoctlHelper {
int getTileIdFromGtId(int gtId) const override {
return gtIdToTileId[gtId];
}
bool makeResidentBeforeLockNeeded() const override;
protected:
static constexpr uint32_t maxContextSetProperties = 4;