diff --git a/Applications/SystemMonitor/ProcessMemoryMapWidget.cpp b/Applications/SystemMonitor/ProcessMemoryMapWidget.cpp index 8ce589303f..c624cf01d2 100644 --- a/Applications/SystemMonitor/ProcessMemoryMapWidget.cpp +++ b/Applications/SystemMonitor/ProcessMemoryMapWidget.cpp @@ -37,6 +37,7 @@ ProcessMemoryMapWidget::ProcessMemoryMapWidget(GWidget* parent) return "Volatile"; return "Non-volatile"; }); + pid_vm_fields.empend("cow_pages", "# CoW", TextAlignment::CenterRight); pid_vm_fields.empend("name", "Name", TextAlignment::CenterLeft); m_json_model = GJsonArrayModel::create({}, move(pid_vm_fields)); m_table_view->set_model(GSortingProxyModel::create(*m_json_model)); diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index 07598e419a..0195717083 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -273,6 +273,7 @@ Optional procfs$pid_vm(InodeIdentifier identifier) region_object.add("address", region.vaddr().get()); region_object.add("size", (u32)region.size()); region_object.add("amount_resident", (u32)region.amount_resident()); + region_object.add("cow_pages", region.cow_pages()); region_object.add("name", region.name()); } array.finish(); diff --git a/Kernel/VM/Region.cpp b/Kernel/VM/Region.cpp index 3b2af1d7eb..32b332dadc 100644 --- a/Kernel/VM/Region.cpp +++ b/Kernel/VM/Region.cpp @@ -113,6 +113,16 @@ int Region::commit() return 0; } +u32 Region::cow_pages() const +{ + if (!m_cow_map) + return 0; + u32 count = 0; + for (int i = 0; i < m_cow_map->size(); ++i) + count += m_cow_map->get(i); + return count; +} + size_t Region::amount_resident() const { size_t bytes = 0; diff --git a/Kernel/VM/Region.h b/Kernel/VM/Region.h index bee22f9688..9092867bc1 100644 --- a/Kernel/VM/Region.h +++ b/Kernel/VM/Region.h @@ -105,6 +105,8 @@ public: bool should_cow(size_t page_index) const; void set_should_cow(size_t page_index, bool); + u32 cow_pages() const; + void set_writable(bool b) { if (b)