mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
Create STL-friendly SpinLock implementation
Change-Id: Ic04d34d2962ad6953fe3282a10f6cba16c0e07b3 Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
This commit is contained in:
committed by
sys_ocldev
parent
5b2e16651f
commit
9c696f1d29
@@ -32,13 +32,13 @@ WddmMemoryManager::~WddmMemoryManager() {
|
||||
for (auto osContext : this->registeredOsContexts) {
|
||||
if (osContext) {
|
||||
auto &residencyController = osContext->get()->getResidencyController();
|
||||
residencyController.acquireTrimCallbackLock();
|
||||
|
||||
auto lock = residencyController.acquireTrimCallbackLock();
|
||||
wddm->unregisterTrimCallback(trimCallback, this->trimCallbackHandle);
|
||||
residencyController.releaseTrimCallbackLock();
|
||||
lock.unlock();
|
||||
|
||||
// Wait for lock to ensure trimCallback ended
|
||||
residencyController.acquireTrimCallbackLock();
|
||||
residencyController.releaseTrimCallbackLock();
|
||||
lock.lock();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -62,9 +62,8 @@ void APIENTRY WddmMemoryManager::trimCallback(_Inout_ D3DKMT_TRIMNOTIFICATION *t
|
||||
return;
|
||||
}
|
||||
|
||||
wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().acquireTrimCallbackLock();
|
||||
auto lock = wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().acquireTrimCallbackLock();
|
||||
wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().trimResidency(trimNotification->Flags, trimNotification->NumBytesToTrim);
|
||||
wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().releaseTrimCallbackLock();
|
||||
}
|
||||
|
||||
GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryForImage(ImageInfo &imgInfo, Gmm *gmm) {
|
||||
@@ -315,9 +314,8 @@ void WddmMemoryManager::freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllocation
|
||||
for (auto &osContext : this->registeredOsContexts) {
|
||||
if (osContext) {
|
||||
auto &residencyController = osContext->get()->getResidencyController();
|
||||
residencyController.acquireLock();
|
||||
auto lock = residencyController.acquireLock();
|
||||
residencyController.removeFromTrimCandidateListIfUsed(input, true);
|
||||
residencyController.releaseLock();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -480,7 +478,7 @@ bool WddmMemoryManager::makeResidentResidencyAllocations(ResidencyContainer &all
|
||||
|
||||
uint32_t totalHandlesCount = 0;
|
||||
|
||||
osContext.get()->getResidencyController().acquireLock();
|
||||
auto lock = osContext.get()->getResidencyController().acquireLock();
|
||||
|
||||
DBG_LOG(ResidencyDebugEnable, "Residency:", __FUNCTION__, "currentFenceValue =", osContext.get()->getResidencyController().getMonitoredFence().currentFenceValue);
|
||||
|
||||
@@ -550,23 +548,17 @@ bool WddmMemoryManager::makeResidentResidencyAllocations(ResidencyContainer &all
|
||||
}
|
||||
}
|
||||
|
||||
osContext.get()->getResidencyController().releaseLock();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void WddmMemoryManager::makeNonResidentEvictionAllocations(ResidencyContainer &evictionAllocations, OsContext &osContext) {
|
||||
|
||||
osContext.get()->getResidencyController().acquireLock();
|
||||
|
||||
size_t residencyCount = evictionAllocations.size();
|
||||
auto lock = osContext.get()->getResidencyController().acquireLock();
|
||||
const size_t residencyCount = evictionAllocations.size();
|
||||
|
||||
for (uint32_t i = 0; i < residencyCount; i++) {
|
||||
WddmAllocation *allocation = reinterpret_cast<WddmAllocation *>(evictionAllocations[i]);
|
||||
osContext.get()->getResidencyController().addToTrimCandidateList(allocation);
|
||||
}
|
||||
|
||||
osContext.get()->getResidencyController().releaseLock();
|
||||
}
|
||||
|
||||
bool WddmMemoryManager::mapAuxGpuVA(GraphicsAllocation *graphicsAllocation) {
|
||||
|
||||
@@ -15,24 +15,12 @@ namespace OCLRT {
|
||||
|
||||
WddmResidencyController::WddmResidencyController(Wddm &wddm, uint32_t osContextId) : wddm(wddm), osContextId(osContextId) {}
|
||||
|
||||
void WddmResidencyController::acquireLock() {
|
||||
bool previousLockValue = false;
|
||||
while (!lock.compare_exchange_weak(previousLockValue, true))
|
||||
previousLockValue = false;
|
||||
std::unique_lock<SpinLock> WddmResidencyController::acquireLock() {
|
||||
return std::unique_lock<SpinLock>{this->lock};
|
||||
}
|
||||
|
||||
void WddmResidencyController::releaseLock() {
|
||||
lock = false;
|
||||
}
|
||||
|
||||
void WddmResidencyController::acquireTrimCallbackLock() {
|
||||
SpinLock spinLock;
|
||||
spinLock.enter(this->trimCallbackLock);
|
||||
}
|
||||
|
||||
void WddmResidencyController::releaseTrimCallbackLock() {
|
||||
SpinLock spinLock;
|
||||
spinLock.leave(this->trimCallbackLock);
|
||||
std::unique_lock<SpinLock> WddmResidencyController::acquireTrimCallbackLock() {
|
||||
return std::unique_lock<SpinLock>{this->trimCallbackLock};
|
||||
}
|
||||
|
||||
WddmAllocation *WddmResidencyController::getTrimCandidateHead() {
|
||||
@@ -177,6 +165,7 @@ void WddmResidencyController::trimResidency(D3DDDI_TRIMRESIDENCYSET_FLAGS flags,
|
||||
bool periodicTrimDone = false;
|
||||
D3DKMT_HANDLE fragmentEvictHandles[3] = {0};
|
||||
uint64_t sizeToTrim = 0;
|
||||
auto lock = this->acquireLock();
|
||||
|
||||
WddmAllocation *wddmAllocation = nullptr;
|
||||
while ((wddmAllocation = this->getTrimCandidateHead()) != nullptr) {
|
||||
@@ -221,17 +210,11 @@ void WddmResidencyController::trimResidency(D3DDDI_TRIMRESIDENCYSET_FLAGS flags,
|
||||
if (this->checkTrimCandidateListCompaction()) {
|
||||
this->compactTrimCandidateList();
|
||||
}
|
||||
|
||||
this->releaseLock();
|
||||
}
|
||||
|
||||
if (flags.TrimToBudget) {
|
||||
|
||||
this->acquireLock();
|
||||
|
||||
auto lock = this->acquireLock();
|
||||
trimResidencyToBudget(bytes);
|
||||
|
||||
this->releaseLock();
|
||||
}
|
||||
|
||||
if (flags.PeriodicTrim || flags.RestartPeriodicTrim) {
|
||||
|
||||
@@ -10,8 +10,10 @@
|
||||
#include "runtime/memory_manager/residency_container.h"
|
||||
#include "runtime/os_interface/windows/windows_wrapper.h"
|
||||
#include "runtime/os_interface/windows/windows_defs.h"
|
||||
#include "runtime/utilities/spinlock.h"
|
||||
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
|
||||
namespace OCLRT {
|
||||
|
||||
@@ -23,11 +25,8 @@ class WddmResidencyController {
|
||||
public:
|
||||
WddmResidencyController(Wddm &wddm, uint32_t osContextId);
|
||||
|
||||
void acquireLock();
|
||||
void releaseLock();
|
||||
|
||||
void acquireTrimCallbackLock();
|
||||
void releaseTrimCallbackLock();
|
||||
std::unique_lock<SpinLock> acquireLock();
|
||||
std::unique_lock<SpinLock> acquireTrimCallbackLock();
|
||||
|
||||
WddmAllocation *getTrimCandidateHead();
|
||||
void addToTrimCandidateList(GraphicsAllocation *allocation);
|
||||
@@ -54,8 +53,8 @@ class WddmResidencyController {
|
||||
uint32_t osContextId;
|
||||
MonitoredFence monitoredFence = {};
|
||||
|
||||
std::atomic<bool> lock = false;
|
||||
std::atomic_flag trimCallbackLock = ATOMIC_FLAG_INIT;
|
||||
SpinLock lock;
|
||||
SpinLock trimCallbackLock;
|
||||
|
||||
uint64_t lastTrimFenceValue = 0u;
|
||||
ResidencyContainer trimCandidateList;
|
||||
|
||||
Reference in New Issue
Block a user