diff options
| author | 2024-01-19 13:52:19 -0500 | |
|---|---|---|
| committer | 2024-01-22 21:18:52 -0500 | |
| commit | a120f8ff4de31ef4fe34306016e23a94aa2e665d (patch) | |
| tree | 85b1849554ee6c18064919ffb71195511bff063d /src/core/hle/service/nvdrv | |
| parent | kernel: target invalidate to given process (diff) | |
| download | yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.gz yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.xz yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.zip | |
nvservices: close map handles on session close
Diffstat (limited to 'src/core/hle/service/nvdrv')
| -rw-r--r-- | src/core/hle/service/nvdrv/core/container.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/core/nvmap.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/core/nvmap.h | 2 |
3 files changed, 16 insertions, 0 deletions
diff --git a/src/core/hle/service/nvdrv/core/container.cpp b/src/core/hle/service/nvdrv/core/container.cpp index 21ef57d27..dc1b4d5be 100644 --- a/src/core/hle/service/nvdrv/core/container.cpp +++ b/src/core/hle/service/nvdrv/core/container.cpp | |||
| @@ -112,6 +112,7 @@ SessionId Container::OpenSession(Kernel::KProcess* process) { | |||
| 112 | 112 | ||
| 113 | void Container::CloseSession(SessionId session_id) { | 113 | void Container::CloseSession(SessionId session_id) { |
| 114 | std::scoped_lock lk(impl->session_guard); | 114 | std::scoped_lock lk(impl->session_guard); |
| 115 | impl->file.UnmapAllHandles(session_id); | ||
| 115 | auto& session = impl->sessions[session_id.id]; | 116 | auto& session = impl->sessions[session_id.id]; |
| 116 | auto& smmu = impl->host1x.MemoryManager(); | 117 | auto& smmu = impl->host1x.MemoryManager(); |
| 117 | if (session.has_preallocated_area) { | 118 | if (session.has_preallocated_area) { |
diff --git a/src/core/hle/service/nvdrv/core/nvmap.cpp b/src/core/hle/service/nvdrv/core/nvmap.cpp index 1b59c6b15..bc1c033c6 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.cpp +++ b/src/core/hle/service/nvdrv/core/nvmap.cpp | |||
| @@ -326,4 +326,17 @@ std::optional<NvMap::FreeInfo> NvMap::FreeHandle(Handle::Id handle, bool interna | |||
| 326 | return freeInfo; | 326 | return freeInfo; |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | void NvMap::UnmapAllHandles(NvCore::SessionId session_id) { | ||
| 330 | auto handles_copy = [&] { | ||
| 331 | std::scoped_lock lk{handles_lock}; | ||
| 332 | return handles; | ||
| 333 | }(); | ||
| 334 | |||
| 335 | for (auto& [id, handle] : handles_copy) { | ||
| 336 | if (handle->session_id.id == session_id.id) { | ||
| 337 | FreeHandle(id, false); | ||
| 338 | } | ||
| 339 | } | ||
| 340 | } | ||
| 341 | |||
| 329 | } // namespace Service::Nvidia::NvCore | 342 | } // namespace Service::Nvidia::NvCore |
diff --git a/src/core/hle/service/nvdrv/core/nvmap.h b/src/core/hle/service/nvdrv/core/nvmap.h index d7f695845..b8be599ae 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.h +++ b/src/core/hle/service/nvdrv/core/nvmap.h | |||
| @@ -152,6 +152,8 @@ public: | |||
| 152 | */ | 152 | */ |
| 153 | std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session); | 153 | std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session); |
| 154 | 154 | ||
| 155 | void UnmapAllHandles(NvCore::SessionId session_id); | ||
| 156 | |||
| 155 | private: | 157 | private: |
| 156 | std::list<std::shared_ptr<Handle>> unmap_queue{}; | 158 | std::list<std::shared_ptr<Handle>> unmap_queue{}; |
| 157 | std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue` | 159 | std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue` |