Kernel: Remove unnecessary page table loads

loading a page table is slow as it invalidates the whole tlb
This commit is contained in:
Bananymous 2026-01-10 01:13:48 +02:00
parent ed82a18e2a
commit 2eea074473
1 changed files with 8 additions and 4 deletions

View File

@ -223,7 +223,8 @@ namespace Kernel
{ {
case Thread::State::Terminated: case Thread::State::Terminated:
remove_node_from_most_loaded(m_current); remove_node_from_most_loaded(m_current);
PageTable::kernel().load(); if (&PageTable::current() != &PageTable::kernel())
PageTable::kernel().load();
delete m_current->thread; delete m_current->thread;
delete m_current; delete m_current;
m_thread_count--; m_thread_count--;
@ -255,7 +256,8 @@ namespace Kernel
if (m_current->thread->state() != Thread::State::Terminated) if (m_current->thread->state() != Thread::State::Terminated)
break; break;
remove_node_from_most_loaded(m_current); remove_node_from_most_loaded(m_current);
PageTable::kernel().load(); if (&PageTable::current() != &PageTable::kernel())
PageTable::kernel().load();
delete m_current->thread; delete m_current->thread;
delete m_current; delete m_current;
m_thread_count--; m_thread_count--;
@ -263,7 +265,8 @@ namespace Kernel
if (m_current == nullptr) if (m_current == nullptr)
{ {
PageTable::kernel().load(); if (&PageTable::current() != &PageTable::kernel())
PageTable::kernel().load();
*interrupt_stack = m_idle_thread->interrupt_stack(); *interrupt_stack = m_idle_thread->interrupt_stack();
*interrupt_registers = m_idle_thread->interrupt_registers(); *interrupt_registers = m_idle_thread->interrupt_registers();
m_idle_thread->m_state = Thread::State::Executing; m_idle_thread->m_state = Thread::State::Executing;
@ -276,7 +279,8 @@ namespace Kernel
auto* thread = m_current->thread; auto* thread = m_current->thread;
auto& page_table = thread->has_process() ? thread->process().page_table() : PageTable::kernel(); auto& page_table = thread->has_process() ? thread->process().page_table() : PageTable::kernel();
page_table.load(); if (&PageTable::current() != &page_table)
page_table.load();
if (thread->state() == Thread::State::NotStarted) if (thread->state() == Thread::State::NotStarted)
{ {