mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:38:11 +00:00
LibWeb: Make VM allocation atomic for kernel regions
Instead of first allocating the VM range, and then inserting a region with that range into the MM region tree, we now do both things in a single atomic operation: - RegionTree::place_anywhere(Region&, size, alignment) - RegionTree::place_specifically(Region&, address, size) To reduce the number of things we do while locking the region tree, we also require callers to provide a constructed Region object.
This commit is contained in:
parent
cbf52d474c
commit
e852a69a06
7 changed files with 85 additions and 57 deletions
|
@ -22,11 +22,21 @@
|
|||
|
||||
namespace Kernel::Memory {
|
||||
|
||||
Region::Region(VirtualRange const& range)
|
||||
: m_range(range)
|
||||
Region::Region()
|
||||
: m_range(VirtualRange({}, 0))
|
||||
{
|
||||
if (is_kernel())
|
||||
MM.register_kernel_region(*this);
|
||||
}
|
||||
|
||||
Region::Region(NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
|
||||
: m_range(VirtualRange({}, 0))
|
||||
, m_offset_in_vmobject(offset_in_vmobject)
|
||||
, m_vmobject(move(vmobject))
|
||||
, m_name(move(name))
|
||||
, m_access(access | ((access & 0x7) << 4))
|
||||
, m_shared(shared)
|
||||
, m_cacheable(cacheable == Cacheable::Yes)
|
||||
{
|
||||
m_vmobject->add_region(*this);
|
||||
}
|
||||
|
||||
Region::Region(VirtualRange const& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
|
||||
|
@ -43,9 +53,6 @@ Region::Region(VirtualRange const& range, NonnullRefPtr<VMObject> vmobject, size
|
|||
VERIFY((m_range.size() % PAGE_SIZE) == 0);
|
||||
|
||||
m_vmobject->add_region(*this);
|
||||
|
||||
if (is_kernel())
|
||||
MM.register_kernel_region(*this);
|
||||
}
|
||||
|
||||
Region::~Region()
|
||||
|
@ -72,9 +79,14 @@ Region::~Region()
|
|||
}
|
||||
}
|
||||
|
||||
ErrorOr<NonnullOwnPtr<Region>> Region::create_unbacked(VirtualRange const& range)
|
||||
ErrorOr<NonnullOwnPtr<Region>> Region::create_unbacked()
|
||||
{
|
||||
return adopt_nonnull_own_or_enomem(new (nothrow) Region(range));
|
||||
return adopt_nonnull_own_or_enomem(new (nothrow) Region);
|
||||
}
|
||||
|
||||
ErrorOr<NonnullOwnPtr<Region>> Region::create_unplaced(NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable)
|
||||
{
|
||||
return adopt_nonnull_own_or_enomem(new (nothrow) Region(move(vmobject), offset_in_vmobject, move(name), access, cacheable, false));
|
||||
}
|
||||
|
||||
ErrorOr<NonnullOwnPtr<Region>> Region::try_clone()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue