mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-19 09:17:38 +03:00
Only COW on fault if the physical page has retain_count > 1.
This makes COW pages lazily-but-transparently revert back to read/write.
This commit is contained in:
parent
2d045d2a64
commit
9e62eb4856
Notes:
sideshowbarker
2024-07-19 18:33:36 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/9e62eb48566
@ -223,6 +223,16 @@ Region* MemoryManager::region_from_laddr(Process& process, LinearAddress laddr)
|
||||
|
||||
bool MemoryManager::copy_on_write(Process& process, Region& region, unsigned page_index_in_region)
|
||||
{
|
||||
ASSERT_INTERRUPTS_DISABLED();
|
||||
if (region.physical_pages[page_index_in_region]->retain_count() == 1) {
|
||||
#ifdef PAGE_FAULT_DEBUG
|
||||
dbgprintf(" >> It's a COW page but nobody is sharing it anymore. Remap r/w\n");
|
||||
#endif
|
||||
region.cow_map.set(page_index_in_region, false);
|
||||
remap_region_page(process.m_page_directory, region, page_index_in_region, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef PAGE_FAULT_DEBUG
|
||||
dbgprintf(" >> It's a COW page and it's time to COW!\n");
|
||||
#endif
|
||||
|
@ -37,6 +37,8 @@ public:
|
||||
return_to_freelist();
|
||||
}
|
||||
|
||||
unsigned retain_count() const { return m_retain_count; }
|
||||
|
||||
private:
|
||||
PhysicalPage(PhysicalAddress paddr)
|
||||
: m_paddr(paddr)
|
||||
|
@ -61,9 +61,10 @@ ByteBuffer procfs$pid_vm(Process& process)
|
||||
region->name.characters());
|
||||
for (size_t i = 0; i < region->physical_pages.size(); ++i) {
|
||||
auto& physical_page = region->physical_pages[i];
|
||||
ptr += ksprintf(ptr, "P%x%s ",
|
||||
ptr += ksprintf(ptr, "P%x%s(%u) ",
|
||||
physical_page ? physical_page->paddr().get() : 0,
|
||||
region->cow_map.get(i) ? "!" : ""
|
||||
region->cow_map.get(i) ? "!" : "",
|
||||
physical_page->retain_count()
|
||||
);
|
||||
}
|
||||
ptr += ksprintf(ptr, "\n");
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include "IRQHandler.h"
|
||||
#include "PIC.h"
|
||||
|
||||
//#define PAGE_FAULT_DEBUG
|
||||
|
||||
struct DescriptorTablePointer {
|
||||
WORD size;
|
||||
void* address;
|
||||
|
Loading…
Reference in New Issue
Block a user