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;
uint8_t page_buffer[PAGE_SIZE];
PageTable::with_fast_page(pages[page_index], [&] {
memcpy(page_buffer, PageTable::fast_page_as_ptr(), PAGE_SIZE);
PageTable::with_per_cpu_fast_page(pages[page_index], [&](void* addr) {
memcpy(page_buffer, addr, 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();
if (m_shared_data->pages[shared_page_index] == 0)
return BAN::Error::from_errno(ENOMEM);
PageTable::with_fast_page(m_shared_data->pages[shared_page_index], [&] {
memcpy(PageTable::fast_page_as_ptr(), page_buffer, PAGE_SIZE);
PageTable::with_per_cpu_fast_page(m_shared_data->pages[shared_page_index], [&](void* addr) {
memcpy(addr, page_buffer, PAGE_SIZE);
});
shared_data_has_correct_page = true;
}
@@ -181,12 +181,12 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM);
if (!shared_data_has_correct_page)
{
PageTable::with_fast_page(m_shared_data->pages[shared_page_index], [&] {
memcpy(page_buffer, PageTable::fast_page_as_ptr(), PAGE_SIZE);
PageTable::with_per_cpu_fast_page(m_shared_data->pages[shared_page_index], [&](void* addr) {
memcpy(page_buffer, addr, PAGE_SIZE);
});
}
PageTable::with_fast_page(paddr, [&] {
memcpy(PageTable::fast_page_as_ptr(), page_buffer, PAGE_SIZE);
PageTable::with_per_cpu_fast_page(paddr, [&](void* addr) {
memcpy(addr, page_buffer, PAGE_SIZE);
});
m_dirty_pages[local_page_index] = paddr;
m_page_table.map_page_at(paddr, vaddr, m_flags);
@@ -210,8 +210,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM);
ASSERT(&m_page_table == &PageTable::current());
PageTable::with_fast_page(paddr, [vaddr] {
memcpy(PageTable::fast_page_as_ptr(), reinterpret_cast<void*>(vaddr), PAGE_SIZE);
PageTable::with_per_cpu_fast_page(paddr, [vaddr](void* addr) {
memcpy(addr, reinterpret_cast<void*>(vaddr), PAGE_SIZE);
});
m_dirty_pages[local_page_index] = paddr;
@@ -240,8 +240,8 @@ namespace Kernel
return BAN::Error::from_errno(ENOMEM);
ASSERT(&m_page_table == &PageTable::current() || &m_page_table == &PageTable::kernel());
PageTable::with_fast_page(paddr, [&] {
memcpy(PageTable::fast_page_as_ptr(), reinterpret_cast<void*>(vaddr), PAGE_SIZE);
PageTable::with_per_cpu_fast_page(paddr, [&](void* addr) {
memcpy(addr, reinterpret_cast<void*>(vaddr), PAGE_SIZE);
});
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);
m_page_table.map_page_at(paddr, vaddr, m_flags);
PageTable::with_fast_page(paddr, [] {
memset(PageTable::fast_page_as_ptr(), 0x00, PAGE_SIZE);
PageTable::with_per_cpu_fast_page(paddr, [](void* addr) {
memset(addr, 0x00, PAGE_SIZE);
});
return true;
@@ -93,8 +93,8 @@ namespace Kernel
m_page_table.map_page_at(paddr, vaddr, m_flags);
ASSERT(&m_page_table == &PageTable::current());
PageTable::with_fast_page(physical_page->paddr, [vaddr] {
memcpy(reinterpret_cast<void*>(vaddr), PageTable::fast_page_as_ptr(), PAGE_SIZE);
PageTable::with_per_cpu_fast_page(physical_page->paddr, [vaddr](void* addr) {
memcpy(reinterpret_cast<void*>(vaddr), addr, PAGE_SIZE);
});
if (--physical_page->ref_count == 0)
@@ -164,9 +164,9 @@ namespace Kernel
size_t written = 0;
while (written < buffer_size)
{
vaddr_t write_vaddr = m_vaddr + offset_into_region + written;
vaddr_t page_offset = write_vaddr % PAGE_SIZE;
size_t bytes = BAN::Math::min<size_t>(buffer_size - written, PAGE_SIZE - page_offset);
const vaddr_t write_vaddr = m_vaddr + offset_into_region + written;
const vaddr_t page_offset = write_vaddr % PAGE_SIZE;
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))
{
@@ -180,8 +180,8 @@ namespace Kernel
const paddr_t paddr = m_page_table.physical_address_of(write_vaddr & PAGE_ADDR_MASK);
ASSERT(paddr);
PageTable::with_fast_page(paddr, [&] {
memcpy(PageTable::fast_page_as_ptr(page_offset), (void*)(buffer + written), bytes);
PageTable::with_per_cpu_fast_page(paddr, [&](void* addr) {
memcpy(static_cast<uint8_t*>(addr) + page_offset, (void*)(buffer + written), bytes);
});
written += bytes;