diff options
| author | Fernando S <fsahmkow27@gmail.com> | 2023-05-04 03:56:53 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-04 03:56:53 +0200 | 
| commit | 2506594c505c9b2b3949bbd34345677bcafe2cef (patch) | |
| tree | 0714960a5cbe2e292df3f5bb6d9e8ac65fa5ce71 | |
| parent | 7d5683c63c7ed5cf67c22856fd3af61269ccb888 (diff) | |
| parent | 1c13c74295ebd63a1236c1522e2f9f842742ccd8 (diff) | |
Merge pull request #10153 from FernandoS27/a-quickie-fixie
Memory manager: Fix possible softlock
| -rw-r--r-- | src/video_core/memory_manager.cpp | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index e06ce5d14..7b2cde7a7 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -82,6 +82,7 @@ void MemoryManager::SetEntry(size_t position, MemoryManager::EntryType entry) {  }  PTEKind MemoryManager::GetPageKind(GPUVAddr gpu_addr) const { +    std::unique_lock<std::mutex> lock(guard);      return kind_map.GetValueAt(gpu_addr);  } @@ -160,7 +161,10 @@ GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr          }          remaining_size -= big_page_size;      } -    kind_map.Map(gpu_addr, gpu_addr + size, kind); +    { +        std::unique_lock<std::mutex> lock(guard); +        kind_map.Map(gpu_addr, gpu_addr + size, kind); +    }      return gpu_addr;  } @@ -170,7 +174,6 @@ 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<std::mutex> lock(guard);      if (is_big_pages) [[likely]] {          return BigPageTableOp<EntryType::Mapped>(gpu_addr, cpu_addr, size, kind);      } @@ -178,7 +181,6 @@ 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<std::mutex> lock(guard);      if (is_big_pages) [[likely]] {          return BigPageTableOp<EntryType::Reserved>(gpu_addr, 0, size, PTEKind::INVALID);      } @@ -189,7 +191,6 @@ void MemoryManager::Unmap(GPUVAddr gpu_addr, std::size_t size) {      if (size == 0) {          return;      } -    std::unique_lock<std::mutex> lock(guard);      GetSubmappedRangeImpl<false>(gpu_addr, size, page_stash);      for (const auto& [map_addr, map_size] : page_stash) { | 
