From 87b10f8d8624a88993427d8c3605324618669a1d Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Tue, 20 Aug 2024 19:56:37 +0200 Subject: [PATCH] Fix mmap(2) and munmap(2) performance being extremely bad. Now it's only very bad. --- kernel/memorymanagement.cpp | 11 +++-------- kernel/segment.cpp | 13 ++++++++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/kernel/memorymanagement.cpp b/kernel/memorymanagement.cpp index 827c52da..2aee2d8a 100644 --- a/kernel/memorymanagement.cpp +++ b/kernel/memorymanagement.cpp @@ -127,14 +127,9 @@ void UnmapMemory(Process* process, uintptr_t addr, size_t size) size_t conflict_index = conflict_offset / sizeof(struct segment); Memory::UnmapRange(conflict->addr, conflict->size, PAGE_USAGE_USER_SPACE); Memory::Flush(); - if ( conflict_index + 1 == process->segments_used ) - { - process->segments_used--; - continue; - } - process->segments[conflict_index] = process->segments[--process->segments_used]; - qsort(process->segments, process->segments_used, - sizeof(struct segment), segmentcmp); + process->segments_used--; + for ( size_t i = conflict_index; i < process->segments_used; i++ ) + process->segments[i] = process->segments[i + 1]; continue; } diff --git a/kernel/segment.cpp b/kernel/segment.cpp index c0582dc3..2fbc9ed3 100644 --- a/kernel/segment.cpp +++ b/kernel/segment.cpp @@ -96,11 +96,14 @@ bool AddSegment(Process* process, const struct segment* new_segment) } // Add the new segment to the segment list. - process->segments[process->segments_used++] = *new_segment; - - // Sort the segment list after address. - qsort(process->segments, process->segments_used, sizeof(struct segment), - segmentcmp); + size_t i = 0; + while ( i < process->segments_used && + segmentcmp(&process->segments[i], new_segment) < 0 ) + i++; + for ( size_t n = process->segments_used; i < n; n-- ) + process->segments[n] = process->segments[n - 1]; + process->segments[i] = *new_segment; + process->segments_used++; return true; }