From 4d2f1a05ecc8d6e1c1573d2013eebb87d91dc83b Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Fri, 28 Jan 2022 16:23:24 +0200 Subject: Kernel: Make allocate_contiguous_supervisor_physical_pages OOM-fallible --- Kernel/Memory/AnonymousVMObject.cpp | 4 +--- Kernel/Memory/MemoryManager.cpp | 17 +++++------------ Kernel/Memory/MemoryManager.h | 2 +- 3 files changed, 7 insertions(+), 16 deletions(-) (limited to 'Kernel') diff --git a/Kernel/Memory/AnonymousVMObject.cpp b/Kernel/Memory/AnonymousVMObject.cpp index ad3465e732..fe7471bcfc 100644 --- a/Kernel/Memory/AnonymousVMObject.cpp +++ b/Kernel/Memory/AnonymousVMObject.cpp @@ -81,9 +81,7 @@ ErrorOr> AnonymousVMObject::try_create_with_siz ErrorOr> AnonymousVMObject::try_create_physically_contiguous_with_size(size_t size) { - auto contiguous_physical_pages = MM.allocate_contiguous_supervisor_physical_pages(size); - if (contiguous_physical_pages.is_empty()) - return ENOMEM; + auto contiguous_physical_pages = TRY(MM.allocate_contiguous_supervisor_physical_pages(size)); auto new_physical_pages = TRY(FixedArray>::try_create(contiguous_physical_pages.span())); diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp index 1b72cc4d24..670b5123d7 100644 --- a/Kernel/Memory/MemoryManager.cpp +++ b/Kernel/Memory/MemoryManager.cpp @@ -759,12 +759,9 @@ ErrorOr> MemoryManager::allocate_dma_buffer_page(S ErrorOr> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullRefPtrVector& dma_buffer_pages) { VERIFY(!(size % PAGE_SIZE)); - dma_buffer_pages = allocate_contiguous_supervisor_physical_pages(size); - if (dma_buffer_pages.is_empty()) - return ENOMEM; + dma_buffer_pages = TRY(allocate_contiguous_supervisor_physical_pages(size)); // Do not enable Cache for this region as physical memory transfers are performed (Most architectures have this behaviour by default) - auto region_or_error = allocate_kernel_region(dma_buffer_pages.first().paddr(), size, name, access, Region::Cacheable::No); - return region_or_error; + return allocate_kernel_region(dma_buffer_pages.first().paddr(), size, name, access, Region::Cacheable::No); } ErrorOr> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access) @@ -939,7 +936,7 @@ RefPtr MemoryManager::allocate_user_physical_page(ShouldZeroFill s return page; } -NonnullRefPtrVector MemoryManager::allocate_contiguous_supervisor_physical_pages(size_t size) +ErrorOr> MemoryManager::allocate_contiguous_supervisor_physical_pages(size_t size) { VERIFY(!(size % PAGE_SIZE)); SpinlockLocker lock(s_mm_lock); @@ -948,15 +945,11 @@ NonnullRefPtrVector MemoryManager::allocate_contiguous_supervisor_ if (physical_pages.is_empty()) { dmesgln("MM: no super physical pages available"); - VERIFY_NOT_REACHED(); - return {}; + return ENOMEM; } { - auto region_or_error = MM.allocate_kernel_region(physical_pages[0].paddr(), PAGE_SIZE * count, "MemoryManager Allocation Sanitization", Region::Access::Read | Region::Access::Write); - if (region_or_error.is_error()) - TODO(); - auto cleanup_region = region_or_error.release_value(); + auto cleanup_region = TRY(MM.allocate_kernel_region(physical_pages[0].paddr(), PAGE_SIZE * count, "MemoryManager Allocation Sanitization", Region::Access::Read | Region::Access::Write)); memset(cleanup_region->vaddr().as_ptr(), 0, PAGE_SIZE * count); } m_system_memory_info.super_physical_pages_used += count; diff --git a/Kernel/Memory/MemoryManager.h b/Kernel/Memory/MemoryManager.h index 9ccf422115..0020a77d6e 100644 --- a/Kernel/Memory/MemoryManager.h +++ b/Kernel/Memory/MemoryManager.h @@ -173,7 +173,7 @@ public: NonnullRefPtr allocate_committed_user_physical_page(Badge, ShouldZeroFill = ShouldZeroFill::Yes); RefPtr allocate_user_physical_page(ShouldZeroFill = ShouldZeroFill::Yes, bool* did_purge = nullptr); RefPtr allocate_supervisor_physical_page(); - NonnullRefPtrVector allocate_contiguous_supervisor_physical_pages(size_t size); + ErrorOr> allocate_contiguous_supervisor_physical_pages(size_t size); void deallocate_physical_page(PhysicalAddress); ErrorOr> allocate_contiguous_kernel_region(size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes); -- cgit v1.2.3