diff options
| author | Dentomologist <dentomologist@gmail.com> | 2026-03-12 12:31:53 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-12 12:31:53 -0700 |
| commit | e26b61dcee1e76c7fe2c3ff04b3ccb8db788d65c (patch) | |
| tree | 2db45955f79d63dc04fa12065929de91974424ed /Source/Core | |
| parent | 161f9e82c11ad20b10d0b79ccf567ba3a0df8d80 (diff) | |
| parent | a3b37c041aef75e14621a244b88c88f03d1eba66 (diff) | |
Merge pull request #14440 from JosJuice/optimize-remove-page
Core: Optimize RemoveHostPageTableMappings
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/HW/Memmap.cpp | 32 | ||||
| -rw-r--r-- | Source/Core/Core/HW/Memmap.h | 2 |
2 files changed, 13 insertions, 21 deletions
diff --git a/Source/Core/Core/HW/Memmap.cpp b/Source/Core/Core/HW/Memmap.cpp index c7ec1debb0..122f524555 100644 --- a/Source/Core/Core/HW/Memmap.cpp +++ b/Source/Core/Core/HW/Memmap.cpp @@ -438,7 +438,9 @@ void MemoryManager::RemovePageTableMappings(const std::set<u32>& mappings) switch (m_host_page_type) { case HostPageType::SmallPages: - return RemoveHostPageTableMappings(mappings); + for (u32 logical_address : mappings) + RemoveHostPageTableMapping(logical_address); + return; case HostPageType::LargePages: for (u32 logical_address : mappings) RemoveLargePageTableMapping(logical_address); @@ -453,15 +455,7 @@ void MemoryManager::RemoveLargePageTableMapping(u32 logical_address) RemoveLargePageTableMapping(logical_address, m_large_readable_pages); RemoveLargePageTableMapping(logical_address, m_large_writeable_pages); - const u32 aligned_logical_address = logical_address & ~(m_page_size - 1); - const auto it = m_page_table_mapped_entries.find(aligned_logical_address); - if (it != m_page_table_mapped_entries.end()) - { - const LogicalMemoryView& entry = it->second; - m_arena.UnmapFromMemoryRegion(entry.mapped_pointer, entry.mapped_size); - - m_page_table_mapped_entries.erase(it); - } + RemoveHostPageTableMapping(logical_address & ~(m_page_size - 1)); } void MemoryManager::RemoveLargePageTableMapping(u32 logical_address, @@ -472,18 +466,16 @@ void MemoryManager::RemoveLargePageTableMapping(u32 logical_address, it->second[(logical_address & (m_page_size - 1)) / PowerPC::HW_PAGE_SIZE] = INVALID_MAPPING; } -void MemoryManager::RemoveHostPageTableMappings(const std::set<u32>& mappings) +void MemoryManager::RemoveHostPageTableMapping(u32 logical_address) { - if (mappings.empty()) - return; + const auto it = m_page_table_mapped_entries.find(logical_address); + if (it != m_page_table_mapped_entries.end()) + { + const LogicalMemoryView& entry = it->second; + m_arena.UnmapFromMemoryRegion(entry.mapped_pointer, entry.mapped_size); - std::erase_if(m_page_table_mapped_entries, [this, &mappings](const auto& pair) { - const auto& [logical_address, entry] = pair; - const bool remove = mappings.contains(logical_address); - if (remove) - m_arena.UnmapFromMemoryRegion(entry.mapped_pointer, entry.mapped_size); - return remove; - }); + m_page_table_mapped_entries.erase(it); + } } void MemoryManager::RemoveAllPageTableMappings() diff --git a/Source/Core/Core/HW/Memmap.h b/Source/Core/Core/HW/Memmap.h index 4b33776a62..421fc32e0b 100644 --- a/Source/Core/Core/HW/Memmap.h +++ b/Source/Core/Core/HW/Memmap.h @@ -294,6 +294,6 @@ private: u32 logical_size); void RemoveLargePageTableMapping(u32 logical_address); void RemoveLargePageTableMapping(u32 logical_address, std::map<u32, std::vector<u32>>& map); - void RemoveHostPageTableMappings(const std::set<u32>& mappings); + void RemoveHostPageTableMapping(u32 logical_address); }; } // namespace Memory |
