nvservices: close map handles on session close
This commit is contained in:
		@@ -112,6 +112,7 @@ SessionId Container::OpenSession(Kernel::KProcess* process) {
 | 
			
		||||
 | 
			
		||||
void Container::CloseSession(SessionId session_id) {
 | 
			
		||||
    std::scoped_lock lk(impl->session_guard);
 | 
			
		||||
    impl->file.UnmapAllHandles(session_id);
 | 
			
		||||
    auto& session = impl->sessions[session_id.id];
 | 
			
		||||
    auto& smmu = impl->host1x.MemoryManager();
 | 
			
		||||
    if (session.has_preallocated_area) {
 | 
			
		||||
 
 | 
			
		||||
@@ -326,4 +326,17 @@ std::optional<NvMap::FreeInfo> NvMap::FreeHandle(Handle::Id handle, bool interna
 | 
			
		||||
    return freeInfo;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void NvMap::UnmapAllHandles(NvCore::SessionId session_id) {
 | 
			
		||||
    auto handles_copy = [&] {
 | 
			
		||||
        std::scoped_lock lk{handles_lock};
 | 
			
		||||
        return handles;
 | 
			
		||||
    }();
 | 
			
		||||
 | 
			
		||||
    for (auto& [id, handle] : handles_copy) {
 | 
			
		||||
        if (handle->session_id.id == session_id.id) {
 | 
			
		||||
            FreeHandle(id, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Service::Nvidia::NvCore
 | 
			
		||||
 
 | 
			
		||||
@@ -152,6 +152,8 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session);
 | 
			
		||||
 | 
			
		||||
    void UnmapAllHandles(NvCore::SessionId session_id);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::list<std::shared_ptr<Handle>> unmap_queue{};
 | 
			
		||||
    std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue`
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user