From 2a4e410b634e23f87dc985dccea276469d99f8f1 Mon Sep 17 00:00:00 2001 From: creator1creeper1 Date: Wed, 12 Jan 2022 20:52:39 +0100 Subject: [PATCH] Kernel: Make SharedInodeVMObject construction OOM-aware This commit moves the allocation of the resources required for SharedInodeVMObject from its constructors to its factory functions. We're making this change to expose the fallibility of the allocation. --- Kernel/Memory/SharedInodeVMObject.cpp | 14 ++++++++------ Kernel/Memory/SharedInodeVMObject.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Kernel/Memory/SharedInodeVMObject.cpp b/Kernel/Memory/SharedInodeVMObject.cpp index 48a6c27217..650455ef06 100644 --- a/Kernel/Memory/SharedInodeVMObject.cpp +++ b/Kernel/Memory/SharedInodeVMObject.cpp @@ -15,23 +15,25 @@ ErrorOr> SharedInodeVMObject::try_create_with size_t size = inode.size(); if (auto shared_vmobject = inode.shared_vmobject()) return shared_vmobject.release_nonnull(); - auto vmobject = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SharedInodeVMObject(inode, size))); + auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); + auto vmobject = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SharedInodeVMObject(inode, move(new_physical_pages)))); vmobject->inode().set_shared_vmobject(*vmobject); return vmobject; } ErrorOr> SharedInodeVMObject::try_clone() { - return adopt_nonnull_ref_or_enomem(new (nothrow) SharedInodeVMObject(*this)); + auto new_physical_pages = TRY(this->try_clone_physical_pages()); + return adopt_nonnull_ref_or_enomem(new (nothrow) SharedInodeVMObject(*this, move(new_physical_pages))); } -SharedInodeVMObject::SharedInodeVMObject(Inode& inode, size_t size) - : InodeVMObject(inode, VMObject::must_create_physical_pages_but_fixme_should_propagate_errors(size)) +SharedInodeVMObject::SharedInodeVMObject(Inode& inode, FixedArray>&& new_physical_pages) + : InodeVMObject(inode, move(new_physical_pages)) { } -SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other) - : InodeVMObject(other, other.must_clone_physical_pages_but_fixme_should_propagate_errors()) +SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other, FixedArray>&& new_physical_pages) + : InodeVMObject(other, move(new_physical_pages)) { } diff --git a/Kernel/Memory/SharedInodeVMObject.h b/Kernel/Memory/SharedInodeVMObject.h index 3a47c511ef..2c38eead01 100644 --- a/Kernel/Memory/SharedInodeVMObject.h +++ b/Kernel/Memory/SharedInodeVMObject.h @@ -23,8 +23,8 @@ public: private: virtual bool is_shared_inode() const override { return true; } - explicit SharedInodeVMObject(Inode&, size_t); - explicit SharedInodeVMObject(SharedInodeVMObject const&); + explicit SharedInodeVMObject(Inode&, FixedArray>&&); + explicit SharedInodeVMObject(SharedInodeVMObject const&, FixedArray>&&); virtual StringView class_name() const override { return "SharedInodeVMObject"sv; }