mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
Kernel: Propagate failure to commit VM regions in more places
Ultimately we should not panic just because we can't fully commit a VM region (by populating it with physical pages.) This patch handles some of the situations where commit() can fail.
This commit is contained in:
parent
25db315b29
commit
042b1f6814
Notes:
sideshowbarker
2024-07-19 06:50:06 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/042b1f68145
3 changed files with 12 additions and 12 deletions
|
@ -193,23 +193,23 @@ Region& Process::allocate_split_region(const Region& source_region, const Range&
|
|||
return region;
|
||||
}
|
||||
|
||||
Region* Process::allocate_region(const Range& range, const String& name, int prot, bool commit)
|
||||
Region* Process::allocate_region(const Range& range, const String& name, int prot, bool should_commit)
|
||||
{
|
||||
ASSERT(range.is_valid());
|
||||
auto vmobject = AnonymousVMObject::create_with_size(range.size());
|
||||
auto& region = add_region(Region::create_user_accessible(range, vmobject, 0, name, prot_to_region_access_flags(prot)));
|
||||
region.map(page_directory());
|
||||
if (commit)
|
||||
region.commit();
|
||||
return ®ion;
|
||||
auto region = Region::create_user_accessible(range, vmobject, 0, name, prot_to_region_access_flags(prot));
|
||||
region->map(page_directory());
|
||||
if (should_commit && !region->commit())
|
||||
return nullptr;
|
||||
return &add_region(move(region));
|
||||
}
|
||||
|
||||
Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String& name, int prot, bool commit)
|
||||
Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String& name, int prot, bool should_commit)
|
||||
{
|
||||
auto range = allocate_range(vaddr, size);
|
||||
if (!range.is_valid())
|
||||
return nullptr;
|
||||
return allocate_region(range, name, prot, commit);
|
||||
return allocate_region(range, name, prot, should_commit);
|
||||
}
|
||||
|
||||
Region* Process::allocate_region_with_vmobject(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, const String& name, int prot)
|
||||
|
|
|
@ -374,9 +374,9 @@ public:
|
|||
bool is_superuser() const { return m_euid == 0; }
|
||||
|
||||
Region* allocate_region_with_vmobject(VirtualAddress, size_t, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, const String& name, int prot);
|
||||
Region* allocate_region(VirtualAddress, size_t, const String& name, int prot = PROT_READ | PROT_WRITE, bool commit = true);
|
||||
Region* allocate_region(VirtualAddress, size_t, const String& name, int prot = PROT_READ | PROT_WRITE, bool should_commit = true);
|
||||
Region* allocate_region_with_vmobject(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, const String& name, int prot);
|
||||
Region* allocate_region(const Range&, const String& name, int prot = PROT_READ | PROT_WRITE, bool commit = true);
|
||||
Region* allocate_region(const Range&, const String& name, int prot = PROT_READ | PROT_WRITE, bool should_commit = true);
|
||||
bool deallocate_region(Region& region);
|
||||
|
||||
Region& allocate_split_region(const Region& source_region, const Range&, size_t offset_in_vmobject);
|
||||
|
|
|
@ -358,8 +358,8 @@ OwnPtr<Region> MemoryManager::allocate_kernel_region(size_t size, const StringVi
|
|||
auto region = allocate_kernel_region_with_vmobject(range, vmobject, name, access, user_accessible, cacheable);
|
||||
if (!region)
|
||||
return nullptr;
|
||||
if (should_commit)
|
||||
region->commit();
|
||||
if (should_commit && !region->commit())
|
||||
return nullptr;
|
||||
return region;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue