From 2f429bd2d5ff3433c6a26208dd4abfdcc8129c19 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 1 Jan 2021 00:02:40 -0700 Subject: [PATCH] Kernel: Pass new region owner to Region::clone --- Kernel/Syscalls/fork.cpp | 2 +- Kernel/VM/Region.cpp | 8 ++++---- Kernel/VM/Region.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Kernel/Syscalls/fork.cpp b/Kernel/Syscalls/fork.cpp index 1523f18031..ac4ee52fad 100644 --- a/Kernel/Syscalls/fork.cpp +++ b/Kernel/Syscalls/fork.cpp @@ -88,7 +88,7 @@ pid_t Process::sys$fork(RegisterState& regs) #ifdef FORK_DEBUG dbg() << "fork: cloning Region{" << ®ion << "} '" << region.name() << "' @ " << region.vaddr(); #endif - auto region_clone = region.clone(); + auto region_clone = region.clone(*child); if (!region_clone) { dbg() << "fork: Cannot clone region, insufficient memory"; // TODO: tear down new process? diff --git a/Kernel/VM/Region.cpp b/Kernel/VM/Region.cpp index 011a91cfcd..35964c25af 100644 --- a/Kernel/VM/Region.cpp +++ b/Kernel/VM/Region.cpp @@ -86,7 +86,7 @@ void Region::unregister_purgeable_page_ranges() } } -OwnPtr Region::clone() +OwnPtr Region::clone(Process& new_owner) { ASSERT(Process::current()); @@ -98,7 +98,7 @@ OwnPtr Region::clone() auto new_vmobject = AnonymousVMObject::create_with_size(size(), AllocationStrategy::Reserve); // TODO: inherit committed non-volatile areas? if (!new_vmobject) return {}; - auto zeroed_region = Region::create_user_accessible(get_owner().ptr(), m_range, new_vmobject.release_nonnull(), 0, m_name, m_access); + auto zeroed_region = Region::create_user_accessible(&new_owner, m_range, new_vmobject.release_nonnull(), 0, m_name, m_access); zeroed_region->copy_purgeable_page_ranges(*this); zeroed_region->set_mmap(m_mmap); zeroed_region->set_inherit_mode(m_inherit_mode); @@ -114,7 +114,7 @@ OwnPtr Region::clone() ASSERT(vmobject().is_shared_inode()); // Create a new region backed by the same VMObject. - auto region = Region::create_user_accessible(get_owner().ptr(), m_range, m_vmobject, m_offset_in_vmobject, m_name, m_access); + auto region = Region::create_user_accessible(&new_owner, m_range, m_vmobject, m_offset_in_vmobject, m_name, m_access); if (m_vmobject->is_anonymous()) region->copy_purgeable_page_ranges(*this); region->set_mmap(m_mmap); @@ -134,7 +134,7 @@ OwnPtr Region::clone() #endif // Set up a COW region. The parent (this) region becomes COW as well! remap(); - auto clone_region = Region::create_user_accessible(get_owner().ptr(), m_range, vmobject_clone.release_nonnull(), m_offset_in_vmobject, m_name, m_access); + auto clone_region = Region::create_user_accessible(&new_owner, m_range, vmobject_clone.release_nonnull(), m_offset_in_vmobject, m_name, m_access); if (m_vmobject->is_anonymous()) clone_region->copy_purgeable_page_ranges(*this); if (m_stack) { diff --git a/Kernel/VM/Region.h b/Kernel/VM/Region.h index 86436a93e8..fc48c53042 100644 --- a/Kernel/VM/Region.h +++ b/Kernel/VM/Region.h @@ -100,7 +100,7 @@ public: PageFaultResponse handle_fault(const PageFault&); - OwnPtr clone(); + OwnPtr clone(Process&); bool contains(VirtualAddress vaddr) const {