Add kernel memory allocations to bugreport

Add the contents of /proc/allocinfo to the bugreport.
This file shows the current snapshot of all the memory allocated and the
number of allocations associated with kernel code locations.
The collection and processing of /proc/allocinfo is done by calling the
alloctop tool, to return the top entries that allocated most memory.
The kernel memory allocations entry is added to the bugreport only if
the /proc/allocinfo file exists.

As shown below, a rough measurement of the execution time of this
command on Cuttlefish shows an average of ~43 ms.
On the same device, the total number of characters generated by the
command is 6704, so ~6.6 KiB uncompressed.

```
vsoc_x86_64:/ # time for i in $(seq 1 1000); do
  alloctop --once --sort s --min 1 --lines 100 > /dev/null
done
    0m42.25s real     0m00.17s user     0m03.63s system

vsoc_x86_64:/ # alloctop --once --sort s --min 1 --lines 100 | wc -c
6704
```

Bug: 384777823
Test: adb shell dumpstate
Change-Id: Ib8f7eeebe5ad88fc608e2d84582ad32e1b069985
Signed-off-by: Alessio Balsini <balsini@google.com>
diff --git a/cmds/dumpstate/Android.bp b/cmds/dumpstate/Android.bp
index b22cc2a..be96306 100644
--- a/cmds/dumpstate/Android.bp
+++ b/cmds/dumpstate/Android.bp
@@ -128,6 +128,7 @@
         "main.cpp",
     ],
     required: [
+        "alloctop",
         "atrace",
         "bugreport_procdump",
         "dmabuf_dump",
diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp
index 5e83e33..bb0ffe6 100644
--- a/cmds/dumpstate/dumpstate.cpp
+++ b/cmds/dumpstate/dumpstate.cpp
@@ -1257,6 +1257,15 @@
     RunCommand("IP RULES v6", {"ip", "-6", "rule", "show"});
 }
 
+static void DumpKernelMemoryAllocations() {
+    if (!access("/proc/allocinfo", F_OK)) {
+        // Print the top 100 biggest memory allocations of at least one byte.
+        // The output is sorted by size, descending.
+        RunCommand("KERNEL MEMORY ALLOCATIONS",
+                   {"alloctop", "--once", "--sort", "s", "--min", "1", "--lines", "100"});
+    }
+}
+
 static Dumpstate::RunStatus RunDumpsysTextByPriority(const std::string& title, int priority,
                                                      std::chrono::milliseconds timeout,
                                                      std::chrono::milliseconds service_timeout) {
@@ -1766,6 +1775,8 @@
 
     DoKmsg();
 
+    DumpKernelMemoryAllocations();
+
     DumpShutdownCheckpoints();
 
     DumpIpAddrAndRules();