mirror of
https://github.com/RGBCube/serenity
synced 2025-05-24 21:05:06 +00:00
Kernel: Use KString for Region names
Replace the AK::String used for Region::m_name with a KString. This seems beneficial across the board, but as a specific data point, it reduces time spent in sys$set_mmap_name() by ~50% on test-js. :^)
This commit is contained in:
parent
a1944ec966
commit
fc9ce22981
10 changed files with 64 additions and 62 deletions
|
@ -245,11 +245,8 @@ ByteBuffer CoreDump::create_notes_regions_data() const
|
||||||
info.program_header_index = region_index++;
|
info.program_header_index = region_index++;
|
||||||
|
|
||||||
memory_region_info_buffer.append((void*)&info, sizeof(info));
|
memory_region_info_buffer.append((void*)&info, sizeof(info));
|
||||||
|
// NOTE: The region name *is* null-terminated, so the following is ok:
|
||||||
auto name = region->name();
|
memory_region_info_buffer.append(region->name().characters_without_null_termination(), region->name().length() + 1);
|
||||||
if (name.is_null())
|
|
||||||
name = String::empty();
|
|
||||||
memory_region_info_buffer.append(name.characters(), name.length() + 1);
|
|
||||||
|
|
||||||
regions_data += memory_region_info_buffer;
|
regions_data += memory_region_info_buffer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace Kernel {
|
||||||
|
|
||||||
class KBufferImpl : public RefCounted<KBufferImpl> {
|
class KBufferImpl : public RefCounted<KBufferImpl> {
|
||||||
public:
|
public:
|
||||||
static RefPtr<KBufferImpl> try_create_with_size(size_t size, Region::Access access, const char* name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
static RefPtr<KBufferImpl> try_create_with_size(size_t size, Region::Access access, StringView name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
||||||
{
|
{
|
||||||
auto region = MM.allocate_kernel_region(page_round_up(size), name, access, strategy);
|
auto region = MM.allocate_kernel_region(page_round_up(size), name, access, strategy);
|
||||||
if (!region)
|
if (!region)
|
||||||
|
@ -35,7 +35,7 @@ public:
|
||||||
return adopt_ref_if_nonnull(new KBufferImpl(region.release_nonnull(), size, strategy));
|
return adopt_ref_if_nonnull(new KBufferImpl(region.release_nonnull(), size, strategy));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RefPtr<KBufferImpl> try_create_with_bytes(ReadonlyBytes bytes, Region::Access access, const char* name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
static RefPtr<KBufferImpl> try_create_with_bytes(ReadonlyBytes bytes, Region::Access access, StringView name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
||||||
{
|
{
|
||||||
auto region = MM.allocate_kernel_region(page_round_up(bytes.size()), name, access, strategy);
|
auto region = MM.allocate_kernel_region(page_round_up(bytes.size()), name, access, strategy);
|
||||||
if (!region)
|
if (!region)
|
||||||
|
@ -45,12 +45,12 @@ public:
|
||||||
return adopt_ref_if_nonnull(new KBufferImpl(region.release_nonnull(), bytes.size(), strategy));
|
return adopt_ref_if_nonnull(new KBufferImpl(region.release_nonnull(), bytes.size(), strategy));
|
||||||
}
|
}
|
||||||
|
|
||||||
static RefPtr<KBufferImpl> create_with_size(size_t size, Region::Access access, const char* name, AllocationStrategy strategy = AllocationStrategy::Reserve)
|
static RefPtr<KBufferImpl> create_with_size(size_t size, Region::Access access, StringView name, AllocationStrategy strategy = AllocationStrategy::Reserve)
|
||||||
{
|
{
|
||||||
return try_create_with_size(size, access, name, strategy);
|
return try_create_with_size(size, access, name, strategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static RefPtr<KBufferImpl> copy(const void* data, size_t size, Region::Access access, const char* name)
|
static RefPtr<KBufferImpl> copy(const void* data, size_t size, Region::Access access, StringView name)
|
||||||
{
|
{
|
||||||
auto buffer = create_with_size(size, access, name, AllocationStrategy::AllocateNow);
|
auto buffer = create_with_size(size, access, name, AllocationStrategy::AllocateNow);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
|
@ -104,7 +104,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static OwnPtr<KBuffer> try_create_with_size(size_t size, Region::Access access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
[[nodiscard]] static OwnPtr<KBuffer> try_create_with_size(size_t size, Region::Access access = Region::Access::Read | Region::Access::Write, StringView name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
||||||
{
|
{
|
||||||
auto impl = KBufferImpl::try_create_with_size(size, access, name, strategy);
|
auto impl = KBufferImpl::try_create_with_size(size, access, name, strategy);
|
||||||
if (!impl)
|
if (!impl)
|
||||||
|
@ -112,7 +112,7 @@ public:
|
||||||
return adopt_own(*new KBuffer(impl.release_nonnull()));
|
return adopt_own(*new KBuffer(impl.release_nonnull()));
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static OwnPtr<KBuffer> try_create_with_bytes(ReadonlyBytes bytes, Region::Access access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
[[nodiscard]] static OwnPtr<KBuffer> try_create_with_bytes(ReadonlyBytes bytes, Region::Access access = Region::Access::Read | Region::Access::Write, StringView name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
||||||
{
|
{
|
||||||
auto impl = KBufferImpl::try_create_with_bytes(bytes, access, name, strategy);
|
auto impl = KBufferImpl::try_create_with_bytes(bytes, access, name, strategy);
|
||||||
if (!impl)
|
if (!impl)
|
||||||
|
@ -120,12 +120,12 @@ public:
|
||||||
return adopt_own(*new KBuffer(impl.release_nonnull()));
|
return adopt_own(*new KBuffer(impl.release_nonnull()));
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static KBuffer create_with_size(size_t size, Region::Access access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
[[nodiscard]] static KBuffer create_with_size(size_t size, Region::Access access = Region::Access::Read | Region::Access::Write, StringView name = "KBuffer", AllocationStrategy strategy = AllocationStrategy::Reserve)
|
||||||
{
|
{
|
||||||
return KBuffer(KBufferImpl::create_with_size(size, access, name, strategy));
|
return KBuffer(KBufferImpl::create_with_size(size, access, name, strategy));
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static KBuffer copy(const void* data, size_t size, Region::Access access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer")
|
[[nodiscard]] static KBuffer copy(const void* data, size_t size, Region::Access access = Region::Access::Read | Region::Access::Write, StringView name = "KBuffer")
|
||||||
{
|
{
|
||||||
return KBuffer(KBufferImpl::copy(data, size, access, name));
|
return KBuffer(KBufferImpl::copy(data, size, access, name));
|
||||||
}
|
}
|
||||||
|
@ -146,7 +146,7 @@ public:
|
||||||
[[nodiscard]] const KBufferImpl& impl() const { return *m_impl; }
|
[[nodiscard]] const KBufferImpl& impl() const { return *m_impl; }
|
||||||
[[nodiscard]] RefPtr<KBufferImpl> take_impl() { return move(m_impl); }
|
[[nodiscard]] RefPtr<KBufferImpl> take_impl() { return move(m_impl); }
|
||||||
|
|
||||||
KBuffer(const ByteBuffer& buffer, Region::Access access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer")
|
KBuffer(const ByteBuffer& buffer, Region::Access access = Region::Access::Read | Region::Access::Write, StringView name = "KBuffer")
|
||||||
: m_impl(KBufferImpl::copy(buffer.data(), buffer.size(), access, name))
|
: m_impl(KBufferImpl::copy(buffer.data(), buffer.size(), access, name))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,13 +156,14 @@ KResultOr<FlatPtr> Process::sys$mmap(Userspace<const Syscall::SC_mmap_params*> u
|
||||||
if (!is_user_range(VirtualAddress(addr), page_round_up(size)))
|
if (!is_user_range(VirtualAddress(addr), page_round_up(size)))
|
||||||
return EFAULT;
|
return EFAULT;
|
||||||
|
|
||||||
String name;
|
OwnPtr<KString> name;
|
||||||
if (params.name.characters) {
|
if (params.name.characters) {
|
||||||
if (params.name.length > PATH_MAX)
|
if (params.name.length > PATH_MAX)
|
||||||
return ENAMETOOLONG;
|
return ENAMETOOLONG;
|
||||||
name = copy_string_from_user(params.name);
|
auto name_or_error = try_copy_kstring_from_user(params.name);
|
||||||
if (name.is_null())
|
if (name_or_error.is_error())
|
||||||
return EFAULT;
|
return name_or_error.error();
|
||||||
|
name = name_or_error.release_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
|
@ -213,7 +214,7 @@ KResultOr<FlatPtr> Process::sys$mmap(Userspace<const Syscall::SC_mmap_params*> u
|
||||||
|
|
||||||
if (map_anonymous) {
|
if (map_anonymous) {
|
||||||
auto strategy = map_noreserve ? AllocationStrategy::None : AllocationStrategy::Reserve;
|
auto strategy = map_noreserve ? AllocationStrategy::None : AllocationStrategy::Reserve;
|
||||||
auto region_or_error = space().allocate_region(range.value(), !name.is_null() ? name : "mmap", prot, strategy);
|
auto region_or_error = space().allocate_region(range.value(), {}, prot, strategy);
|
||||||
if (region_or_error.is_error())
|
if (region_or_error.is_error())
|
||||||
return region_or_error.error().error();
|
return region_or_error.error().error();
|
||||||
region = region_or_error.value();
|
region = region_or_error.value();
|
||||||
|
@ -253,8 +254,7 @@ KResultOr<FlatPtr> Process::sys$mmap(Userspace<const Syscall::SC_mmap_params*> u
|
||||||
region->set_shared(true);
|
region->set_shared(true);
|
||||||
if (map_stack)
|
if (map_stack)
|
||||||
region->set_stack(true);
|
region->set_stack(true);
|
||||||
if (!name.is_null())
|
region->set_name(move(name));
|
||||||
region->set_name(name);
|
|
||||||
|
|
||||||
PerformanceManager::add_mmap_perf_event(*this, *region);
|
PerformanceManager::add_mmap_perf_event(*this, *region);
|
||||||
|
|
||||||
|
@ -480,9 +480,10 @@ KResultOr<int> Process::sys$set_mmap_name(Userspace<const Syscall::SC_set_mmap_n
|
||||||
if (params.name.length > PATH_MAX)
|
if (params.name.length > PATH_MAX)
|
||||||
return ENAMETOOLONG;
|
return ENAMETOOLONG;
|
||||||
|
|
||||||
auto name = copy_string_from_user(params.name);
|
auto name_or_error = try_copy_kstring_from_user(params.name);
|
||||||
if (name.is_null())
|
if (name_or_error.is_error())
|
||||||
return EFAULT;
|
return name_or_error.error();
|
||||||
|
auto name = name_or_error.release_value();
|
||||||
|
|
||||||
auto range_or_error = expand_range_to_page_boundaries((FlatPtr)params.addr, params.size);
|
auto range_or_error = expand_range_to_page_boundaries((FlatPtr)params.addr, params.size);
|
||||||
if (range_or_error.is_error())
|
if (range_or_error.is_error())
|
||||||
|
|
|
@ -67,7 +67,11 @@ Thread::Thread(NonnullRefPtr<Process> process, NonnullOwnPtr<Region> kernel_stac
|
||||||
m_tid = Process::allocate_pid().value();
|
m_tid = Process::allocate_pid().value();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_kernel_stack_region->set_name(String::formatted("Kernel stack (thread {})", m_tid.value()));
|
{
|
||||||
|
// FIXME: Go directly to KString
|
||||||
|
auto string = String::formatted("Kernel stack (thread {})", m_tid.value());
|
||||||
|
m_kernel_stack_region->set_name(KString::try_create(string));
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
ScopedSpinLock lock(g_tid_map_lock);
|
ScopedSpinLock lock(g_tid_map_lock);
|
||||||
|
|
|
@ -456,7 +456,7 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
|
||||||
return region->handle_fault(fault, lock);
|
return region->handle_fault(fault, lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Region> MemoryManager::allocate_contiguous_kernel_region(size_t size, String name, Region::Access access, size_t physical_alignment, Region::Cacheable cacheable)
|
OwnPtr<Region> MemoryManager::allocate_contiguous_kernel_region(size_t size, StringView name, Region::Access access, size_t physical_alignment, Region::Cacheable cacheable)
|
||||||
{
|
{
|
||||||
VERIFY(!(size % PAGE_SIZE));
|
VERIFY(!(size % PAGE_SIZE));
|
||||||
ScopedSpinLock lock(s_mm_lock);
|
ScopedSpinLock lock(s_mm_lock);
|
||||||
|
@ -464,10 +464,10 @@ OwnPtr<Region> MemoryManager::allocate_contiguous_kernel_region(size_t size, Str
|
||||||
if (!range.has_value())
|
if (!range.has_value())
|
||||||
return {};
|
return {};
|
||||||
auto vmobject = ContiguousVMObject::create_with_size(size, physical_alignment);
|
auto vmobject = ContiguousVMObject::create_with_size(size, physical_alignment);
|
||||||
return allocate_kernel_region_with_vmobject(range.value(), vmobject, move(name), access, cacheable);
|
return allocate_kernel_region_with_vmobject(range.value(), vmobject, name, access, cacheable);
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Region> MemoryManager::allocate_kernel_region(size_t size, String name, Region::Access access, AllocationStrategy strategy, Region::Cacheable cacheable)
|
OwnPtr<Region> MemoryManager::allocate_kernel_region(size_t size, StringView name, Region::Access access, AllocationStrategy strategy, Region::Cacheable cacheable)
|
||||||
{
|
{
|
||||||
VERIFY(!(size % PAGE_SIZE));
|
VERIFY(!(size % PAGE_SIZE));
|
||||||
auto vm_object = AnonymousVMObject::create_with_size(size, strategy);
|
auto vm_object = AnonymousVMObject::create_with_size(size, strategy);
|
||||||
|
@ -477,10 +477,10 @@ OwnPtr<Region> MemoryManager::allocate_kernel_region(size_t size, String name, R
|
||||||
auto range = kernel_page_directory().range_allocator().allocate_anywhere(size);
|
auto range = kernel_page_directory().range_allocator().allocate_anywhere(size);
|
||||||
if (!range.has_value())
|
if (!range.has_value())
|
||||||
return {};
|
return {};
|
||||||
return allocate_kernel_region_with_vmobject(range.value(), vm_object.release_nonnull(), move(name), access, cacheable);
|
return allocate_kernel_region_with_vmobject(range.value(), vm_object.release_nonnull(), name, access, cacheable);
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Region> MemoryManager::allocate_kernel_region(PhysicalAddress paddr, size_t size, String name, Region::Access access, Region::Cacheable cacheable)
|
OwnPtr<Region> MemoryManager::allocate_kernel_region(PhysicalAddress paddr, size_t size, StringView name, Region::Access access, Region::Cacheable cacheable)
|
||||||
{
|
{
|
||||||
auto vm_object = AnonymousVMObject::create_for_physical_range(paddr, size);
|
auto vm_object = AnonymousVMObject::create_for_physical_range(paddr, size);
|
||||||
if (!vm_object)
|
if (!vm_object)
|
||||||
|
@ -490,10 +490,10 @@ OwnPtr<Region> MemoryManager::allocate_kernel_region(PhysicalAddress paddr, size
|
||||||
auto range = kernel_page_directory().range_allocator().allocate_anywhere(size);
|
auto range = kernel_page_directory().range_allocator().allocate_anywhere(size);
|
||||||
if (!range.has_value())
|
if (!range.has_value())
|
||||||
return {};
|
return {};
|
||||||
return allocate_kernel_region_with_vmobject(range.value(), *vm_object, move(name), access, cacheable);
|
return allocate_kernel_region_with_vmobject(range.value(), *vm_object, name, access, cacheable);
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Region> MemoryManager::allocate_kernel_region_identity(PhysicalAddress paddr, size_t size, String name, Region::Access access, Region::Cacheable cacheable)
|
OwnPtr<Region> MemoryManager::allocate_kernel_region_identity(PhysicalAddress paddr, size_t size, StringView name, Region::Access access, Region::Cacheable cacheable)
|
||||||
{
|
{
|
||||||
auto vm_object = AnonymousVMObject::create_for_physical_range(paddr, size);
|
auto vm_object = AnonymousVMObject::create_for_physical_range(paddr, size);
|
||||||
if (!vm_object)
|
if (!vm_object)
|
||||||
|
@ -503,26 +503,26 @@ OwnPtr<Region> MemoryManager::allocate_kernel_region_identity(PhysicalAddress pa
|
||||||
auto range = kernel_page_directory().identity_range_allocator().allocate_specific(VirtualAddress(paddr.get()), size);
|
auto range = kernel_page_directory().identity_range_allocator().allocate_specific(VirtualAddress(paddr.get()), size);
|
||||||
if (!range.has_value())
|
if (!range.has_value())
|
||||||
return {};
|
return {};
|
||||||
return allocate_kernel_region_with_vmobject(range.value(), *vm_object, move(name), access, cacheable);
|
return allocate_kernel_region_with_vmobject(range.value(), *vm_object, name, access, cacheable);
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject(const Range& range, VMObject& vmobject, String name, Region::Access access, Region::Cacheable cacheable)
|
OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject(const Range& range, VMObject& vmobject, StringView name, Region::Access access, Region::Cacheable cacheable)
|
||||||
{
|
{
|
||||||
ScopedSpinLock lock(s_mm_lock);
|
ScopedSpinLock lock(s_mm_lock);
|
||||||
auto region = Region::create_kernel_only(range, vmobject, 0, move(name), access, cacheable);
|
auto region = Region::create_kernel_only(range, vmobject, 0, KString::try_create(name), access, cacheable);
|
||||||
if (region)
|
if (region)
|
||||||
region->map(kernel_page_directory());
|
region->map(kernel_page_directory());
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject(VMObject& vmobject, size_t size, String name, Region::Access access, Region::Cacheable cacheable)
|
OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject(VMObject& vmobject, size_t size, StringView name, Region::Access access, Region::Cacheable cacheable)
|
||||||
{
|
{
|
||||||
VERIFY(!(size % PAGE_SIZE));
|
VERIFY(!(size % PAGE_SIZE));
|
||||||
ScopedSpinLock lock(s_mm_lock);
|
ScopedSpinLock lock(s_mm_lock);
|
||||||
auto range = kernel_page_directory().range_allocator().allocate_anywhere(size);
|
auto range = kernel_page_directory().range_allocator().allocate_anywhere(size);
|
||||||
if (!range.has_value())
|
if (!range.has_value())
|
||||||
return {};
|
return {};
|
||||||
return allocate_kernel_region_with_vmobject(range.value(), vmobject, move(name), access, cacheable);
|
return allocate_kernel_region_with_vmobject(range.value(), vmobject, name, access, cacheable);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MemoryManager::commit_user_physical_pages(size_t page_count)
|
bool MemoryManager::commit_user_physical_pages(size_t page_count)
|
||||||
|
|
|
@ -144,12 +144,12 @@ public:
|
||||||
void deallocate_user_physical_page(const PhysicalPage&);
|
void deallocate_user_physical_page(const PhysicalPage&);
|
||||||
void deallocate_supervisor_physical_page(const PhysicalPage&);
|
void deallocate_supervisor_physical_page(const PhysicalPage&);
|
||||||
|
|
||||||
OwnPtr<Region> allocate_contiguous_kernel_region(size_t, String name, Region::Access access, size_t physical_alignment = PAGE_SIZE, Region::Cacheable = Region::Cacheable::Yes);
|
OwnPtr<Region> allocate_contiguous_kernel_region(size_t, StringView name, Region::Access access, size_t physical_alignment = PAGE_SIZE, Region::Cacheable = Region::Cacheable::Yes);
|
||||||
OwnPtr<Region> allocate_kernel_region(size_t, String name, Region::Access access, AllocationStrategy strategy = AllocationStrategy::Reserve, Region::Cacheable = Region::Cacheable::Yes);
|
OwnPtr<Region> allocate_kernel_region(size_t, StringView name, Region::Access access, AllocationStrategy strategy = AllocationStrategy::Reserve, Region::Cacheable = Region::Cacheable::Yes);
|
||||||
OwnPtr<Region> allocate_kernel_region(PhysicalAddress, size_t, String name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
OwnPtr<Region> allocate_kernel_region(PhysicalAddress, size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
||||||
OwnPtr<Region> allocate_kernel_region_identity(PhysicalAddress, size_t, String name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
OwnPtr<Region> allocate_kernel_region_identity(PhysicalAddress, size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
||||||
OwnPtr<Region> allocate_kernel_region_with_vmobject(VMObject&, size_t, String name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
OwnPtr<Region> allocate_kernel_region_with_vmobject(VMObject&, size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
||||||
OwnPtr<Region> allocate_kernel_region_with_vmobject(const Range&, VMObject&, String name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
OwnPtr<Region> allocate_kernel_region_with_vmobject(const Range&, VMObject&, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
|
||||||
|
|
||||||
unsigned user_physical_pages() const { return m_user_physical_pages; }
|
unsigned user_physical_pages() const { return m_user_physical_pages; }
|
||||||
unsigned user_physical_pages_used() const { return m_user_physical_pages_used; }
|
unsigned user_physical_pages_used() const { return m_user_physical_pages_used; }
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
Region::Region(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, String name, Region::Access access, Cacheable cacheable, bool shared)
|
Region::Region(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
|
||||||
: PurgeablePageRanges(vmobject)
|
: PurgeablePageRanges(vmobject)
|
||||||
, m_range(range)
|
, m_range(range)
|
||||||
, m_offset_in_vmobject(offset_in_vmobject)
|
, m_offset_in_vmobject(offset_in_vmobject)
|
||||||
|
@ -84,7 +84,7 @@ OwnPtr<Region> Region::clone(Process& new_owner)
|
||||||
|
|
||||||
// Create a new region backed by the same VMObject.
|
// Create a new region backed by the same VMObject.
|
||||||
auto region = Region::create_user_accessible(
|
auto region = Region::create_user_accessible(
|
||||||
&new_owner, m_range, m_vmobject, m_offset_in_vmobject, m_name, access(), m_cacheable ? Cacheable::Yes : Cacheable::No, m_shared);
|
&new_owner, m_range, m_vmobject, m_offset_in_vmobject, m_name ? m_name->try_clone() : OwnPtr<KString> {}, access(), m_cacheable ? Cacheable::Yes : Cacheable::No, m_shared);
|
||||||
if (m_vmobject->is_anonymous())
|
if (m_vmobject->is_anonymous())
|
||||||
region->copy_purgeable_page_ranges(*this);
|
region->copy_purgeable_page_ranges(*this);
|
||||||
region->set_mmap(m_mmap);
|
region->set_mmap(m_mmap);
|
||||||
|
@ -103,7 +103,7 @@ OwnPtr<Region> Region::clone(Process& new_owner)
|
||||||
// Set up a COW region. The parent (this) region becomes COW as well!
|
// Set up a COW region. The parent (this) region becomes COW as well!
|
||||||
remap();
|
remap();
|
||||||
auto clone_region = Region::create_user_accessible(
|
auto clone_region = Region::create_user_accessible(
|
||||||
&new_owner, m_range, vmobject_clone.release_nonnull(), m_offset_in_vmobject, m_name, access(), m_cacheable ? Cacheable::Yes : Cacheable::No, m_shared);
|
&new_owner, m_range, vmobject_clone.release_nonnull(), m_offset_in_vmobject, m_name ? m_name->try_clone() : OwnPtr<KString> {}, access(), m_cacheable ? Cacheable::Yes : Cacheable::No, m_shared);
|
||||||
if (m_vmobject->is_anonymous())
|
if (m_vmobject->is_anonymous())
|
||||||
clone_region->copy_purgeable_page_ranges(*this);
|
clone_region->copy_purgeable_page_ranges(*this);
|
||||||
if (m_stack) {
|
if (m_stack) {
|
||||||
|
@ -208,7 +208,7 @@ size_t Region::amount_shared() const
|
||||||
return bytes;
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
NonnullOwnPtr<Region> Region::create_user_accessible(Process* owner, const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, String name, Region::Access access, Cacheable cacheable, bool shared)
|
NonnullOwnPtr<Region> Region::create_user_accessible(Process* owner, const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
|
||||||
{
|
{
|
||||||
auto region = adopt_own(*new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, shared));
|
auto region = adopt_own(*new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, shared));
|
||||||
if (owner)
|
if (owner)
|
||||||
|
@ -216,7 +216,7 @@ NonnullOwnPtr<Region> Region::create_user_accessible(Process* owner, const Range
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
NonnullOwnPtr<Region> Region::create_kernel_only(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, String name, Region::Access access, Cacheable cacheable)
|
NonnullOwnPtr<Region> Region::create_kernel_only(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable)
|
||||||
{
|
{
|
||||||
return adopt_own(*new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, false));
|
return adopt_own(*new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, false));
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,11 +8,11 @@
|
||||||
|
|
||||||
#include <AK/EnumBits.h>
|
#include <AK/EnumBits.h>
|
||||||
#include <AK/IntrusiveList.h>
|
#include <AK/IntrusiveList.h>
|
||||||
#include <AK/String.h>
|
|
||||||
#include <AK/WeakPtr.h>
|
#include <AK/WeakPtr.h>
|
||||||
#include <AK/Weakable.h>
|
#include <AK/Weakable.h>
|
||||||
#include <Kernel/Arch/x86/CPU.h>
|
#include <Kernel/Arch/x86/CPU.h>
|
||||||
#include <Kernel/Heap/SlabAllocator.h>
|
#include <Kernel/Heap/SlabAllocator.h>
|
||||||
|
#include <Kernel/KString.h>
|
||||||
#include <Kernel/VM/PageFaultResponse.h>
|
#include <Kernel/VM/PageFaultResponse.h>
|
||||||
#include <Kernel/VM/PurgeablePageRanges.h>
|
#include <Kernel/VM/PurgeablePageRanges.h>
|
||||||
#include <Kernel/VM/RangeAllocator.h>
|
#include <Kernel/VM/RangeAllocator.h>
|
||||||
|
@ -50,8 +50,8 @@ public:
|
||||||
Yes,
|
Yes,
|
||||||
};
|
};
|
||||||
|
|
||||||
static NonnullOwnPtr<Region> create_user_accessible(Process*, const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, String name, Region::Access access, Cacheable, bool shared);
|
static NonnullOwnPtr<Region> create_user_accessible(Process*, const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable, bool shared);
|
||||||
static NonnullOwnPtr<Region> create_kernel_only(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, String name, Region::Access access, Cacheable = Cacheable::Yes);
|
static NonnullOwnPtr<Region> create_kernel_only(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable = Cacheable::Yes);
|
||||||
|
|
||||||
~Region();
|
~Region();
|
||||||
|
|
||||||
|
@ -67,10 +67,10 @@ public:
|
||||||
bool has_been_executable() const { return m_access & Access::HasBeenExecutable; }
|
bool has_been_executable() const { return m_access & Access::HasBeenExecutable; }
|
||||||
|
|
||||||
bool is_cacheable() const { return m_cacheable; }
|
bool is_cacheable() const { return m_cacheable; }
|
||||||
const String& name() const { return m_name; }
|
StringView name() const { return m_name ? m_name->view() : StringView {}; }
|
||||||
Region::Access access() const { return static_cast<Region::Access>(m_access); }
|
Region::Access access() const { return static_cast<Region::Access>(m_access); }
|
||||||
|
|
||||||
void set_name(String name) { m_name = move(name); }
|
void set_name(OwnPtr<KString> name) { m_name = move(name); }
|
||||||
|
|
||||||
const VMObject& vmobject() const { return *m_vmobject; }
|
const VMObject& vmobject() const { return *m_vmobject; }
|
||||||
VMObject& vmobject() { return *m_vmobject; }
|
VMObject& vmobject() { return *m_vmobject; }
|
||||||
|
@ -226,7 +226,7 @@ public:
|
||||||
void set_syscall_region(bool b) { m_syscall_region = b; }
|
void set_syscall_region(bool b) { m_syscall_region = b; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Region(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, String, Region::Access access, Cacheable, bool shared);
|
Region(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString>, Region::Access access, Cacheable, bool shared);
|
||||||
|
|
||||||
bool do_remap_vmobject_page_range(size_t page_index, size_t page_count);
|
bool do_remap_vmobject_page_range(size_t page_index, size_t page_count);
|
||||||
|
|
||||||
|
@ -254,7 +254,7 @@ private:
|
||||||
Range m_range;
|
Range m_range;
|
||||||
size_t m_offset_in_vmobject { 0 };
|
size_t m_offset_in_vmobject { 0 };
|
||||||
NonnullRefPtr<VMObject> m_vmobject;
|
NonnullRefPtr<VMObject> m_vmobject;
|
||||||
String m_name;
|
OwnPtr<KString> m_name;
|
||||||
u8 m_access { Region::None };
|
u8 m_access { Region::None };
|
||||||
bool m_shared : 1 { false };
|
bool m_shared : 1 { false };
|
||||||
bool m_cacheable : 1 { false };
|
bool m_cacheable : 1 { false };
|
||||||
|
|
|
@ -47,7 +47,7 @@ Optional<Range> Space::allocate_range(VirtualAddress vaddr, size_t size, size_t
|
||||||
Region& Space::allocate_split_region(const Region& source_region, const Range& range, size_t offset_in_vmobject)
|
Region& Space::allocate_split_region(const Region& source_region, const Range& range, size_t offset_in_vmobject)
|
||||||
{
|
{
|
||||||
auto& region = add_region(Region::create_user_accessible(
|
auto& region = add_region(Region::create_user_accessible(
|
||||||
m_process, range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access(), source_region.is_cacheable() ? Region::Cacheable::Yes : Region::Cacheable::No, source_region.is_shared()));
|
m_process, range, source_region.vmobject(), offset_in_vmobject, KString::try_create(source_region.name()), source_region.access(), source_region.is_cacheable() ? Region::Cacheable::Yes : Region::Cacheable::No, source_region.is_shared()));
|
||||||
region.set_syscall_region(source_region.is_syscall_region());
|
region.set_syscall_region(source_region.is_syscall_region());
|
||||||
region.set_mmap(source_region.is_mmap());
|
region.set_mmap(source_region.is_mmap());
|
||||||
region.set_stack(source_region.is_stack());
|
region.set_stack(source_region.is_stack());
|
||||||
|
@ -59,19 +59,19 @@ Region& Space::allocate_split_region(const Region& source_region, const Range& r
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<Region*> Space::allocate_region(const Range& range, const String& name, int prot, AllocationStrategy strategy)
|
KResultOr<Region*> Space::allocate_region(Range const& range, StringView name, int prot, AllocationStrategy strategy)
|
||||||
{
|
{
|
||||||
VERIFY(range.is_valid());
|
VERIFY(range.is_valid());
|
||||||
auto vmobject = AnonymousVMObject::create_with_size(range.size(), strategy);
|
auto vmobject = AnonymousVMObject::create_with_size(range.size(), strategy);
|
||||||
if (!vmobject)
|
if (!vmobject)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
auto region = Region::create_user_accessible(m_process, range, vmobject.release_nonnull(), 0, name, prot_to_region_access_flags(prot), Region::Cacheable::Yes, false);
|
auto region = Region::create_user_accessible(m_process, range, vmobject.release_nonnull(), 0, KString::try_create(name), prot_to_region_access_flags(prot), Region::Cacheable::Yes, false);
|
||||||
if (!region->map(page_directory()))
|
if (!region->map(page_directory()))
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
return &add_region(move(region));
|
return &add_region(move(region));
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<Region*> Space::allocate_region_with_vmobject(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, const String& name, int prot, bool shared)
|
KResultOr<Region*> Space::allocate_region_with_vmobject(Range const& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared)
|
||||||
{
|
{
|
||||||
VERIFY(range.is_valid());
|
VERIFY(range.is_valid());
|
||||||
size_t end_in_vmobject = offset_in_vmobject + range.size();
|
size_t end_in_vmobject = offset_in_vmobject + range.size();
|
||||||
|
@ -88,7 +88,7 @@ KResultOr<Region*> Space::allocate_region_with_vmobject(const Range& range, Nonn
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
offset_in_vmobject &= PAGE_MASK;
|
offset_in_vmobject &= PAGE_MASK;
|
||||||
auto& region = add_region(Region::create_user_accessible(m_process, range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot), Region::Cacheable::Yes, shared));
|
auto& region = add_region(Region::create_user_accessible(m_process, range, move(vmobject), offset_in_vmobject, KString::try_create(name), prot_to_region_access_flags(prot), Region::Cacheable::Yes, shared));
|
||||||
if (!region.map(page_directory())) {
|
if (!region.map(page_directory())) {
|
||||||
// FIXME: What is an appropriate error code here, really?
|
// FIXME: What is an appropriate error code here, really?
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
|
@ -35,8 +35,8 @@ public:
|
||||||
|
|
||||||
Optional<Range> allocate_range(VirtualAddress, size_t, size_t alignment = PAGE_SIZE);
|
Optional<Range> allocate_range(VirtualAddress, size_t, size_t alignment = PAGE_SIZE);
|
||||||
|
|
||||||
KResultOr<Region*> allocate_region_with_vmobject(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, const String& name, int prot, bool shared);
|
KResultOr<Region*> allocate_region_with_vmobject(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, StringView name, int prot, bool shared);
|
||||||
KResultOr<Region*> allocate_region(const Range&, const String& name, int prot = PROT_READ | PROT_WRITE, AllocationStrategy strategy = AllocationStrategy::Reserve);
|
KResultOr<Region*> allocate_region(const Range&, StringView name, int prot = PROT_READ | PROT_WRITE, AllocationStrategy strategy = AllocationStrategy::Reserve);
|
||||||
bool deallocate_region(Region& region);
|
bool deallocate_region(Region& region);
|
||||||
OwnPtr<Region> take_region(Region& region);
|
OwnPtr<Region> take_region(Region& region);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue