Kernel: Use per cpu fast page for {Memory,File}BackedRegion
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user