소스 검색

Kernel: Make InodeVMOBject construction OOM-aware

This commit moves the allocation of the resources required for
InodeVMObject from its constructors to the constructors of its child
classes.

We're making this change to give the child classes the chance to expose
the fallibility of the allocation.
creator1creeper1 3 년 전
부모
커밋
ad480ff18b
4개의 변경된 파일10개의 추가작업 그리고 10개의 파일을 삭제
  1. 4 4
      Kernel/Memory/InodeVMObject.cpp
  2. 2 2
      Kernel/Memory/InodeVMObject.h
  3. 2 2
      Kernel/Memory/PrivateInodeVMObject.cpp
  4. 2 2
      Kernel/Memory/SharedInodeVMObject.cpp

+ 4 - 4
Kernel/Memory/InodeVMObject.cpp

@@ -9,15 +9,15 @@
 
 namespace Kernel::Memory {
 
-InodeVMObject::InodeVMObject(Inode& inode, size_t size)
-    : VMObject(VMObject::must_create_physical_pages_but_fixme_should_propagate_errors(size))
+InodeVMObject::InodeVMObject(Inode& inode, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+    : VMObject(move(new_physical_pages))
     , m_inode(inode)
     , m_dirty_pages(page_count(), false)
 {
 }
 
-InodeVMObject::InodeVMObject(InodeVMObject const& other)
-    : VMObject(other.must_clone_physical_pages_but_fixme_should_propagate_errors())
+InodeVMObject::InodeVMObject(InodeVMObject const& other, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+    : VMObject(move(new_physical_pages))
     , m_inode(other.m_inode)
     , m_dirty_pages(page_count(), false)
 {

+ 2 - 2
Kernel/Memory/InodeVMObject.h

@@ -28,8 +28,8 @@ public:
     u32 executable_mappings() const;
 
 protected:
-    explicit InodeVMObject(Inode&, size_t);
-    explicit InodeVMObject(InodeVMObject const&);
+    explicit InodeVMObject(Inode&, FixedArray<RefPtr<PhysicalPage>>&&);
+    explicit InodeVMObject(InodeVMObject const&, FixedArray<RefPtr<PhysicalPage>>&&);
 
     InodeVMObject& operator=(InodeVMObject const&) = delete;
     InodeVMObject& operator=(InodeVMObject&&) = delete;

+ 2 - 2
Kernel/Memory/PrivateInodeVMObject.cpp

@@ -20,12 +20,12 @@ ErrorOr<NonnullRefPtr<VMObject>> PrivateInodeVMObject::try_clone()
 }
 
 PrivateInodeVMObject::PrivateInodeVMObject(Inode& inode, size_t size)
-    : InodeVMObject(inode, size)
+    : InodeVMObject(inode, VMObject::must_create_physical_pages_but_fixme_should_propagate_errors(size))
 {
 }
 
 PrivateInodeVMObject::PrivateInodeVMObject(PrivateInodeVMObject const& other)
-    : InodeVMObject(other)
+    : InodeVMObject(other, other.must_clone_physical_pages_but_fixme_should_propagate_errors())
 {
 }
 

+ 2 - 2
Kernel/Memory/SharedInodeVMObject.cpp

@@ -26,12 +26,12 @@ ErrorOr<NonnullRefPtr<VMObject>> SharedInodeVMObject::try_clone()
 }
 
 SharedInodeVMObject::SharedInodeVMObject(Inode& inode, size_t size)
-    : InodeVMObject(inode, size)
+    : InodeVMObject(inode, VMObject::must_create_physical_pages_but_fixme_should_propagate_errors(size))
 {
 }
 
 SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other)
-    : InodeVMObject(other)
+    : InodeVMObject(other, other.must_clone_physical_pages_but_fixme_should_propagate_errors())
 {
 }