From 5e11a512d60f9ff9b8714b8528ba72a25ec9c787 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 23 Aug 2022 21:21:20 +0200 Subject: [PATCH] Kernel: Buffer an entire region when generating coredumps This allows us to unlock the region tree lock early, to avoid keeping the lock while we are doing IO. --- Kernel/Coredump.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Kernel/Coredump.cpp b/Kernel/Coredump.cpp index b010881443..cc0e963c9b 100644 --- a/Kernel/Coredump.cpp +++ b/Kernel/Coredump.cpp @@ -220,6 +220,8 @@ ErrorOr Coredump::write_regions() if (region.access() == Memory::Region::Access::None) continue; + auto buffer = TRY(KBuffer::try_create_with_size("Coredump Region Copy Buffer"sv, region.page_count() * PAGE_SIZE)); + TRY(m_process->address_space().with([&](auto& space) -> ErrorOr { auto* real_region = space->region_tree().regions().find(region.vaddr().get()); @@ -244,11 +246,13 @@ ErrorOr Coredump::write_regions() // If the current page is not backed by a physical page, we zero it in the coredump file. return UserOrKernelBuffer::for_kernel_buffer(zero_buffer); }(); - TRY(m_description->write(src_buffer.value(), PAGE_SIZE)); + TRY(src_buffer.value().read(buffer->bytes().slice(i * PAGE_SIZE, PAGE_SIZE))); } return {}; })); + + TRY(m_description->write(UserOrKernelBuffer::for_kernel_buffer(buffer->data()), buffer->size())); } return {};