Create STL-friendly SpinLock implementation

Change-Id: Ic04d34d2962ad6953fe3282a10f6cba16c0e07b3
Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
This commit is contained in:
Maciej Dziuban
2018-10-16 15:53:39 +02:00
committed by sys_ocldev
parent 5b2e16651f
commit 9c696f1d29
6 changed files with 79 additions and 99 deletions

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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;