This speeds up fork by A LOT. Forking WindowServer took ~90 ms before this and now its ~5 ms.
48 lines
1.3 KiB
C++
48 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <kernel/Memory/MemoryRegion.h>
|
|
|
|
namespace Kernel
|
|
{
|
|
|
|
class MemoryBackedRegion final : public MemoryRegion
|
|
{
|
|
BAN_NON_COPYABLE(MemoryBackedRegion);
|
|
BAN_NON_MOVABLE(MemoryBackedRegion);
|
|
|
|
public:
|
|
static BAN::ErrorOr<BAN::UniqPtr<MemoryBackedRegion>> create(PageTable&, size_t size, AddressRange, Type, PageTable::flags_t, int status_flags);
|
|
~MemoryBackedRegion();
|
|
|
|
BAN::ErrorOr<BAN::UniqPtr<MemoryRegion>> clone(PageTable& new_page_table) override;
|
|
BAN::ErrorOr<BAN::UniqPtr<MemoryRegion>> split(size_t offset) override;
|
|
|
|
BAN::ErrorOr<void> msync(vaddr_t, size_t, int) override { return {}; }
|
|
|
|
// Copy data from buffer into this region
|
|
// This can fail if no memory is mapped and no free memory was available
|
|
BAN::ErrorOr<void> copy_data_to_region(size_t offset_into_region, const uint8_t* buffer, size_t buffer_size);
|
|
|
|
protected:
|
|
BAN::ErrorOr<bool> allocate_page_containing_impl(vaddr_t vaddr, bool wants_write) override;
|
|
|
|
private:
|
|
MemoryBackedRegion(PageTable&, size_t size, Type, PageTable::flags_t, int status_flags);
|
|
|
|
private:
|
|
struct PhysicalPage
|
|
{
|
|
PhysicalPage(paddr_t paddr)
|
|
: paddr(paddr)
|
|
{ }
|
|
~PhysicalPage();
|
|
|
|
BAN::Atomic<uint32_t> ref_count { 1 };
|
|
const paddr_t paddr;
|
|
};
|
|
BAN::Vector<PhysicalPage*> m_physical_pages;
|
|
Mutex m_mutex;
|
|
};
|
|
|
|
}
|