summaryrefslogtreecommitdiff
path: root/src/core/hle/service/nvdrv
diff options
context:
space:
mode:
authorGravatar Liam2024-01-19 13:52:19 -0500
committerGravatar Liam2024-01-22 21:18:52 -0500
commita120f8ff4de31ef4fe34306016e23a94aa2e665d (patch)
tree85b1849554ee6c18064919ffb71195511bff063d /src/core/hle/service/nvdrv
parentkernel: target invalidate to given process (diff)
downloadyuzu-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.cpp1
-rw-r--r--src/core/hle/service/nvdrv/core/nvmap.cpp13
-rw-r--r--src/core/hle/service/nvdrv/core/nvmap.h2
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
113void Container::CloseSession(SessionId session_id) { 113void 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
329void 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
155private: 157private:
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`