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 +++++++--- src/video_core/memory_manager.h | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) 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(); } diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index fbbe856c4..794535122 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -215,6 +216,9 @@ private: std::vector big_page_continuous; std::vector> page_stash{}; + std::vector> page_stash2{}; + + mutable std::mutex guard; static constexpr size_t continuous_bits = 64; -- cgit v1.2.3