diff --git a/Kernel/MemoryManager.h b/Kernel/MemoryManager.h index 0096538243..78ed36fc11 100644 --- a/Kernel/MemoryManager.h +++ b/Kernel/MemoryManager.h @@ -140,6 +140,9 @@ public: void set_shared(bool shared) { m_shared = shared; } + bool is_bitmap() const { return m_is_bitmap; } + void set_is_bitmap(bool b) { m_is_bitmap = b; } + RetainPtr clone(); bool contains(LinearAddress laddr) const { @@ -198,6 +201,7 @@ private: bool m_readable { true }; bool m_writable { true }; bool m_shared { false }; + bool m_is_bitmap { false }; Bitmap m_cow_map; }; diff --git a/Kernel/ProcFS.cpp b/Kernel/ProcFS.cpp index 64ba5c0949..1f17042154 100644 --- a/Kernel/ProcFS.cpp +++ b/Kernel/ProcFS.cpp @@ -488,7 +488,7 @@ ByteBuffer procfs$all(InodeIdentifier) auto processes = Process::all_processes(); StringBuilder builder; auto build_process_line = [&builder] (Process* process) { - builder.appendf("%u,%u,%u,%u,%u,%u,%u,%s,%u,%u,%s,%s,%u,%u,%u\n", + builder.appendf("%u,%u,%u,%u,%u,%u,%u,%s,%u,%u,%s,%s,%u,%u,%u,%u\n", process->pid(), process->times_scheduled(), process->tty() ? process->tty()->pgid() : 0, @@ -503,7 +503,8 @@ ByteBuffer procfs$all(InodeIdentifier) process->name().characters(), process->amount_virtual(), process->amount_resident(), - process->amount_shared() + process->amount_shared(), + process->amount_in_bitmaps() ); }; build_process_line(Scheduler::colonel()); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index b79df0b696..6876776597 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -2201,6 +2201,16 @@ size_t Process::amount_virtual() const return amount; } +size_t Process::amount_in_bitmaps() const +{ + size_t amount = 0; + for (auto& region : m_regions) { + if (region->is_bitmap()) + amount += region->size(); + } + return amount; +} + size_t Process::amount_resident() const { // FIXME: This will double count if multiple regions use the same physical page. diff --git a/Kernel/Process.h b/Kernel/Process.h index 08c535d59d..a7e20040a9 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -273,6 +273,7 @@ public: size_t amount_virtual() const; size_t amount_resident() const; size_t amount_shared() const; + size_t amount_in_bitmaps() const; Process* fork(RegisterDump&); int exec(const String& path, Vector&& arguments, Vector&& environment); diff --git a/SharedGraphics/GraphicsBitmap.cpp b/SharedGraphics/GraphicsBitmap.cpp index 6069e757ea..8c8b6c0949 100644 --- a/SharedGraphics/GraphicsBitmap.cpp +++ b/SharedGraphics/GraphicsBitmap.cpp @@ -23,10 +23,12 @@ GraphicsBitmap::GraphicsBitmap(Process& process, const Size& size) auto vmo = VMObject::create_anonymous(size_in_bytes); m_client_region = process.allocate_region_with_vmo(LinearAddress(), size_in_bytes, vmo.copy_ref(), 0, "GraphicsBitmap (client)", true, true); m_client_region->set_shared(true); + m_client_region->set_is_bitmap(true); m_client_region->commit(); auto& server = WSMessageLoop::the().server_process(); m_server_region = server.allocate_region_with_vmo(LinearAddress(), size_in_bytes, move(vmo), 0, "GraphicsBitmap (server)", true, false); m_server_region->set_shared(true); + m_server_region->set_is_bitmap(true); m_data = (RGBA32*)m_server_region->laddr().as_ptr(); } diff --git a/Userland/top.cpp b/Userland/top.cpp index aab16a1a81..2e0d20bfa7 100644 --- a/Userland/top.cpp +++ b/Userland/top.cpp @@ -15,8 +15,9 @@ struct Process { String name; String state; String user; - unsigned virt; - unsigned res; + unsigned linear; + unsigned committed; + unsigned in_bitmaps; unsigned nsched_since_prev; unsigned cpu_percent; unsigned cpu_percent_decimal; @@ -42,7 +43,7 @@ static Snapshot get_snapshot() if (!ptr) break; auto parts = String(buf, Chomp).split(','); - if (parts.size() < 14) + if (parts.size() < 16) break; bool ok; pid_t pid = parts[0].to_uint(ok); @@ -58,9 +59,11 @@ static Snapshot get_snapshot() process.user = s_usernames->get(uid); process.state = parts[7]; process.name = parts[11]; - process.virt = parts[12].to_uint(ok); + process.linear = parts[12].to_uint(ok); ASSERT(ok); - process.res = parts[13].to_uint(ok); + process.committed = parts[13].to_uint(ok); + ASSERT(ok); + process.in_bitmaps = parts[15].to_uint(ok); ASSERT(ok); snapshot.map.set(pid, move(process)); } @@ -79,17 +82,19 @@ int main(int, char**) Vector processes; auto prev = get_snapshot(); + usleep(10000); for (;;) { auto current = get_snapshot(); auto sum_diff = current.sum_nsched - prev.sum_nsched; printf("\033[3J\033[H\033[2J"); - printf("\033[47;30m%6s % 8s %8s %8s %8s %4s %s\033[K\033[0m\n", + printf("\033[47;30m%6s % 8s %8s %6s %6s %6s %4s %s\033[K\033[0m\n", "PID", "USER", "STATE", - "VIRTUAL", - "RESIDENT", + "LINEAR", + "COMMIT", + "BITMAP", "%CPU", "NAME"); for (auto& it : current.map) { @@ -115,12 +120,13 @@ int main(int, char**) }); for (auto* process : processes) { - printf("%6d % 8s %8s %8u %8u %2u.%1u %s\n", + printf("%6d % 8s %8s %6u %6u %6u %2u.%1u %s\n", process->pid, process->user.characters(), process->state.characters(), - process->virt / 1024, - process->res / 1024, + process->linear / 1024, + process->committed / 1024, + process->in_bitmaps / 1024, process->cpu_percent, process->cpu_percent_decimal, process->name.characters()