diff --git a/Kernel/Memory/InodeVMObject.cpp b/Kernel/Memory/InodeVMObject.cpp index 77cacf7e53..3ef5075866 100644 --- a/Kernel/Memory/InodeVMObject.cpp +++ b/Kernel/Memory/InodeVMObject.cpp @@ -67,6 +67,25 @@ int InodeVMObject::release_all_clean_pages() return count; } +int InodeVMObject::try_release_clean_pages(int page_amount) +{ + SpinlockLocker locker(m_lock); + + int count = 0; + for (size_t i = 0; i < page_count() && count < page_amount; ++i) { + if (!m_dirty_pages.get(i) && m_physical_pages[i]) { + m_physical_pages[i] = nullptr; + ++count; + } + } + if (count) { + for_each_region([](auto& region) { + region.remap(); + }); + } + return count; +} + u32 InodeVMObject::writable_mappings() const { u32 count = 0; diff --git a/Kernel/Memory/InodeVMObject.h b/Kernel/Memory/InodeVMObject.h index 6f9500c933..1f09c5b263 100644 --- a/Kernel/Memory/InodeVMObject.h +++ b/Kernel/Memory/InodeVMObject.h @@ -23,6 +23,7 @@ public: size_t amount_clean() const; int release_all_clean_pages(); + int try_release_clean_pages(int page_amount); u32 writable_mappings() const; u32 executable_mappings() const;