From 9a7c172f76007324d72d107acc01c64e41d53820 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Fri, 28 Apr 2023 23:53:02 +0200 Subject: MemoryManager: Fix race conditions. --- src/video_core/memory_manager.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/video_core/memory_manager.cpp') diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 01fb5b546..e06ce5d14 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -170,6 +170,7 @@ void MemoryManager::BindRasterizer(VideoCore::RasterizerInterface* rasterizer_) GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, PTEKind kind, bool is_big_pages) { + std::unique_lock lock(guard); if (is_big_pages) [[likely]] { return BigPageTableOp(gpu_addr, cpu_addr, size, kind); } @@ -177,6 +178,7 @@ GPUVAddr MemoryManager::Map(GPUVAddr gpu_addr, VAddr cpu_addr, std::size_t size, } GPUVAddr MemoryManager::MapSparse(GPUVAddr gpu_addr, std::size_t size, bool is_big_pages) { + std::unique_lock lock(guard); if (is_big_pages) [[likely]] { return BigPageTableOp(gpu_addr, 0, size, PTEKind::INVALID); } @@ -187,6 +189,7 @@ void MemoryManager::Unmap(GPUVAddr gpu_addr, std::size_t size) { if (size == 0) { return; } + std::unique_lock lock(guard); GetSubmappedRangeImpl(gpu_addr, size, page_stash); for (const auto& [map_addr, map_size] : page_stash) { @@ -553,6 +556,7 @@ size_t MemoryManager::MaxContinuousRange(GPUVAddr gpu_addr, size_t size) const { } size_t MemoryManager::GetMemoryLayoutSize(GPUVAddr gpu_addr, size_t max_size) const { + std::unique_lock lock(guard); return kind_map.GetContinuousSizeFrom(gpu_addr); } @@ -745,10 +749,10 @@ void MemoryManager::FlushCaching() { return; } accumulator->Callback([this](GPUVAddr addr, size_t size) { - GetSubmappedRangeImpl(addr, size, page_stash); + GetSubmappedRangeImpl(addr, size, page_stash2); }); - rasterizer->InnerInvalidation(page_stash); - page_stash.clear(); + rasterizer->InnerInvalidation(page_stash2); + page_stash2.clear(); accumulator->Clear(); } -- cgit v1.2.3