Kernel: Use per cpu fast page for {Memory,File}BackedRegion

This commit is contained in:
2026-05-20 02:51:48 +03:00
parent 46a1903f8d
commit 32206069bc
2 changed files with 21 additions and 21 deletions

View File

@@ -97,8 +97,8 @@ namespace Kernel
return; return;
uint8_t page_buffer[PAGE_SIZE]; uint8_t page_buffer[PAGE_SIZE];
PageTable::with_fast_page(pages[page_index], [&] { PageTable::with_per_cpu_fast_page(pages[page_index], [&](void* addr) {
memcpy(page_buffer, PageTable::fast_page_as_ptr(), PAGE_SIZE); memcpy(page_buffer, addr, PAGE_SIZE);
}); });
const size_t write_size = BAN::Math::min<size_t>(PAGE_SIZE, inode->size() - page_index * PAGE_SIZE); const size_t write_size = BAN::Math::min<size_t>(PAGE_SIZE, inode->size() - page_index * PAGE_SIZE);
@@ -162,8 +162,8 @@ namespace Kernel
m_shared_data->pages[shared_page_index] = Heap::get().take_free_page(); m_shared_data->pages[shared_page_index] = Heap::get().take_free_page();
if (m_shared_data->pages[shared_page_index] == 0) if (m_shared_data->pages[shared_page_index] == 0)
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
PageTable::with_fast_page(m_shared_data->pages[shared_page_index], [&] { PageTable::with_per_cpu_fast_page(m_shared_data->pages[shared_page_index], [&](void* addr) {
memcpy(PageTable::fast_page_as_ptr(), page_buffer, PAGE_SIZE); memcpy(addr, page_buffer, PAGE_SIZE);
}); });
shared_data_has_correct_page = true; shared_data_has_correct_page = true;
} }
@@ -181,12 +181,12 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
if (!shared_data_has_correct_page) if (!shared_data_has_correct_page)
{ {
PageTable::with_fast_page(m_shared_data->pages[shared_page_index], [&] { PageTable::with_per_cpu_fast_page(m_shared_data->pages[shared_page_index], [&](void* addr) {
memcpy(page_buffer, PageTable::fast_page_as_ptr(), PAGE_SIZE); memcpy(page_buffer, addr, PAGE_SIZE);
}); });
} }
PageTable::with_fast_page(paddr, [&] { PageTable::with_per_cpu_fast_page(paddr, [&](void* addr) {
memcpy(PageTable::fast_page_as_ptr(), page_buffer, PAGE_SIZE); memcpy(addr, page_buffer, PAGE_SIZE);
}); });
m_dirty_pages[local_page_index] = paddr; m_dirty_pages[local_page_index] = paddr;
m_page_table.map_page_at(paddr, vaddr, m_flags); m_page_table.map_page_at(paddr, vaddr, m_flags);
@@ -210,8 +210,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
ASSERT(&m_page_table == &PageTable::current()); ASSERT(&m_page_table == &PageTable::current());
PageTable::with_fast_page(paddr, [vaddr] { PageTable::with_per_cpu_fast_page(paddr, [vaddr](void* addr) {
memcpy(PageTable::fast_page_as_ptr(), reinterpret_cast<void*>(vaddr), PAGE_SIZE); memcpy(addr, reinterpret_cast<void*>(vaddr), PAGE_SIZE);
}); });
m_dirty_pages[local_page_index] = paddr; m_dirty_pages[local_page_index] = paddr;
@@ -240,8 +240,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
ASSERT(&m_page_table == &PageTable::current() || &m_page_table == &PageTable::kernel()); ASSERT(&m_page_table == &PageTable::current() || &m_page_table == &PageTable::kernel());
PageTable::with_fast_page(paddr, [&] { PageTable::with_per_cpu_fast_page(paddr, [&](void* addr) {
memcpy(PageTable::fast_page_as_ptr(), reinterpret_cast<void*>(vaddr), PAGE_SIZE); memcpy(addr, reinterpret_cast<void*>(vaddr), PAGE_SIZE);
}); });
result->m_page_table.map_page_at(paddr, vaddr, m_flags); result->m_page_table.map_page_at(paddr, vaddr, m_flags);

View File

@@ -64,8 +64,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM); return BAN::Error::from_errno(ENOMEM);
m_page_table.map_page_at(paddr, vaddr, m_flags); m_page_table.map_page_at(paddr, vaddr, m_flags);
PageTable::with_fast_page(paddr, [] { PageTable::with_per_cpu_fast_page(paddr, [](void* addr) {
memset(PageTable::fast_page_as_ptr(), 0x00, PAGE_SIZE); memset(addr, 0x00, PAGE_SIZE);
}); });
return true; return true;
@@ -93,8 +93,8 @@ namespace Kernel
m_page_table.map_page_at(paddr, vaddr, m_flags); m_page_table.map_page_at(paddr, vaddr, m_flags);
ASSERT(&m_page_table == &PageTable::current()); ASSERT(&m_page_table == &PageTable::current());
PageTable::with_fast_page(physical_page->paddr, [vaddr] { PageTable::with_per_cpu_fast_page(physical_page->paddr, [vaddr](void* addr) {
memcpy(reinterpret_cast<void*>(vaddr), PageTable::fast_page_as_ptr(), PAGE_SIZE); memcpy(reinterpret_cast<void*>(vaddr), addr, PAGE_SIZE);
}); });
if (--physical_page->ref_count == 0) if (--physical_page->ref_count == 0)
@@ -164,9 +164,9 @@ namespace Kernel
size_t written = 0; size_t written = 0;
while (written < buffer_size) while (written < buffer_size)
{ {
vaddr_t write_vaddr = m_vaddr + offset_into_region + written; const vaddr_t write_vaddr = m_vaddr + offset_into_region + written;
vaddr_t page_offset = write_vaddr % PAGE_SIZE; const vaddr_t page_offset = write_vaddr % PAGE_SIZE;
size_t bytes = BAN::Math::min<size_t>(buffer_size - written, PAGE_SIZE - page_offset); const size_t bytes = BAN::Math::min<size_t>(buffer_size - written, PAGE_SIZE - page_offset);
if (!(m_page_table.get_page_flags(write_vaddr & PAGE_ADDR_MASK) & PageTable::ReadWrite)) if (!(m_page_table.get_page_flags(write_vaddr & PAGE_ADDR_MASK) & PageTable::ReadWrite))
{ {
@@ -180,8 +180,8 @@ namespace Kernel
const paddr_t paddr = m_page_table.physical_address_of(write_vaddr & PAGE_ADDR_MASK); const paddr_t paddr = m_page_table.physical_address_of(write_vaddr & PAGE_ADDR_MASK);
ASSERT(paddr); ASSERT(paddr);
PageTable::with_fast_page(paddr, [&] { PageTable::with_per_cpu_fast_page(paddr, [&](void* addr) {
memcpy(PageTable::fast_page_as_ptr(page_offset), (void*)(buffer + written), bytes); memcpy(static_cast<uint8_t*>(addr) + page_offset, (void*)(buffer + written), bytes);
}); });
written += bytes; written += bytes;