[bridge] implement lazy cache lock

This commit is contained in:
DH 2023-08-06 17:18:40 +03:00
parent 0e71ef38d0
commit 72c7940259
2 changed files with 14 additions and 0 deletions

View File

@ -45,6 +45,7 @@ enum {
kPageWriteWatch = 1 << 0,
kPageReadWriteLock = 1 << 1,
kPageInvalidated = 1 << 2,
kPageLazyLock = 1 << 3
};
static constexpr auto kHostPageSize = 0x1000;
@ -71,6 +72,7 @@ struct BridgeHeader {
// orbis::shared_mutex cacheCommandMtx;
// orbis::shared_cv cacheCommandCv;
std::atomic<std::uint64_t> cacheCommands[4];
std::atomic<std::uint32_t> gpuCacheCommand;
std::atomic<std::uint8_t> cachePages[0x100'0000'0000 / kHostPageSize];
volatile std::uint64_t pull;

View File

@ -66,6 +66,18 @@ handle_signal(int sig, siginfo_t *info, void *ucontext) {
auto flags = bridge->cachePages[page].load(std::memory_order::relaxed);
if ((flags & amdgpu::bridge::kPageReadWriteLock) != 0) {
if ((flags & amdgpu::bridge::kPageLazyLock) != 0) {
if (std::uint32_t gpuCommand = 0;
!bridge->gpuCacheCommand.compare_exchange_weak(gpuCommand,
page)) {
continue;
}
while (!bridge->cachePages[page].compare_exchange_weak(
flags, flags & ~amdgpu::bridge::kPageLazyLock,
std::memory_order::relaxed)) {
}
}
continue;
}