1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
/*
* Copyright (C) 2026 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/drm_memory_operations_handler.h"
#include "shared/source/command_stream/command_stream_receiver.h"
#include "shared/source/execution_environment/execution_environment.h"
#include "shared/source/execution_environment/root_device_environment.h"
#include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/os_interface/linux/drm_allocation.h"
#include "shared/source/os_interface/linux/drm_memory_manager.h"
#include "shared/source/os_interface/os_context.h"
namespace NEO {
MemoryOperationsStatus DrmMemoryOperationsHandler::evictUnusedAllocationsImpl(std::vector<GraphicsAllocation *> &allocationsForEviction, bool waitForCompletion) {
if (!this->rootDeviceEnvironment.executionEnvironment.memoryManager.get()) {
return MemoryOperationsStatus::success;
}
const auto &engines = this->rootDeviceEnvironment.executionEnvironment.memoryManager->getRegisteredEngines(this->rootDeviceIndex);
std::vector<GraphicsAllocation *> evictCandidates;
for (auto subdeviceIndex = 0u; subdeviceIndex < GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()); subdeviceIndex++) {
for (auto &allocation : allocationsForEviction) {
bool evict = true;
if (allocation->getRootDeviceIndex() != this->rootDeviceIndex) {
continue;
}
for (const auto &engine : engines) {
if (engine.osContext->getDeviceBitfield().test(subdeviceIndex)) {
if (allocation->isAlwaysResident(engine.osContext->getContextId())) {
evict = false;
break;
}
if (allocation->isLockedMemory()) {
evict = false;
break;
}
if (waitForCompletion && engine.commandStreamReceiver->isInitialized()) {
const auto waitStatus = engine.commandStreamReceiver->waitForCompletionWithTimeout(WaitParams{false, false, false, 0}, engine.commandStreamReceiver->peekLatestFlushedTaskCount());
if (waitStatus == WaitStatus::gpuHang) {
return MemoryOperationsStatus::gpuHangDetectedDuringOperation;
}
}
if (allocation->isUsedByOsContext(engine.osContext->getContextId()) &&
allocation->getTaskCount(engine.osContext->getContextId()) > *engine.commandStreamReceiver->getTagAddress()) {
evict = false;
break;
}
}
}
if (evict) {
evictCandidates.push_back(allocation);
}
}
for (auto &allocationToEvict : evictCandidates) {
for (const auto &engine : engines) {
if (engine.osContext->getDeviceBitfield().test(subdeviceIndex)) {
DeviceBitfield deviceBitfield;
deviceBitfield.set(subdeviceIndex);
this->evictImpl(engine.osContext, *allocationToEvict, deviceBitfield);
}
}
}
evictCandidates.clear();
}
return MemoryOperationsStatus::success;
}
} // namespace NEO
|