Fix issue #17948288: Improve accuracy of memory use reporting

We now use Mapped to not double-count cached pages that are
mapped in to app processes.  Also read in some more values that
count towards kernel RAM use, and count buffers as free rather
than used RAM.

It also looks like the zram accounting is broken -- it was never
collecting the total zram reserved space.  I need to figure out
how I was finding that before.

Change-Id: I883f6fc93966774b5c7d2801d1801666dd11ed41
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 18730b6..084ca30 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -1093,7 +1093,15 @@
     /** @hide */
     public static final int MEMINFO_ZRAM_TOTAL = 8;
     /** @hide */
-    public static final int MEMINFO_COUNT = 9;
+    public static final int MEMINFO_MAPPED = 9;
+    /** @hide */
+    public static final int MEMINFO_VM_ALLOC_USED = 10;
+    /** @hide */
+    public static final int MEMINFO_PAGE_TABLES = 11;
+    /** @hide */
+    public static final int MEMINFO_KERNEL_STACK = 12;
+    /** @hide */
+    public static final int MEMINFO_COUNT = 13;
 
     /**
      * Retrieves /proc/meminfo.  outSizes is filled with fields
diff --git a/core/java/com/android/internal/util/MemInfoReader.java b/core/java/com/android/internal/util/MemInfoReader.java
index 5f240f7..1dd9464 100644
--- a/core/java/com/android/internal/util/MemInfoReader.java
+++ b/core/java/com/android/internal/util/MemInfoReader.java
@@ -34,40 +34,65 @@
         }
     }
 
+    /**
+     * Total amount of RAM available to the kernel.
+     */
     public long getTotalSize() {
         return mInfos[Debug.MEMINFO_TOTAL] * 1024;
     }
 
+    /**
+     * Amount of RAM that is not being used for anything.
+     */
     public long getFreeSize() {
         return mInfos[Debug.MEMINFO_FREE] * 1024;
     }
 
+    /**
+     * Amount of RAM that the kernel is being used for caches, not counting caches
+     * that are mapped in to processes.
+     */
     public long getCachedSize() {
-        return mInfos[Debug.MEMINFO_CACHED] * 1024;
+        return getCachedSizeKb() * 1024;
     }
 
+    /**
+     * Amount of RAM that is in use by the kernel for actual allocations.
+     */
+    public long getKernelUsedSize() {
+        return getKernelUsedSizeKb() * 1024;
+    }
+
+    /**
+     * Total amount of RAM available to the kernel.
+     */
     public long getTotalSizeKb() {
         return mInfos[Debug.MEMINFO_TOTAL];
     }
 
+    /**
+     * Amount of RAM that is not being used for anything.
+     */
     public long getFreeSizeKb() {
         return mInfos[Debug.MEMINFO_FREE];
     }
 
+    /**
+     * Amount of RAM that the kernel is being used for caches, not counting caches
+     * that are mapped in to processes.
+     */
     public long getCachedSizeKb() {
-        return mInfos[Debug.MEMINFO_CACHED];
+        return mInfos[Debug.MEMINFO_BUFFERS]
+                + mInfos[Debug.MEMINFO_CACHED] - mInfos[Debug.MEMINFO_MAPPED];
     }
 
-    public long getBuffersSizeKb() {
-        return mInfos[Debug.MEMINFO_BUFFERS];
-    }
-
-    public long getShmemSizeKb() {
-        return mInfos[Debug.MEMINFO_SHMEM];
-    }
-
-    public long getSlabSizeKb() {
-        return mInfos[Debug.MEMINFO_SLAB];
+    /**
+     * Amount of RAM that is in use by the kernel for actual allocations.
+     */
+    public long getKernelUsedSizeKb() {
+        return mInfos[Debug.MEMINFO_SHMEM] + mInfos[Debug.MEMINFO_SLAB]
+                + mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES]
+                + mInfos[Debug.MEMINFO_KERNEL_STACK];
     }
 
     public long getSwapTotalSizeKb() {
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 7b3528b..9ec9993 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -552,6 +552,10 @@
     MEMINFO_SWAP_TOTAL,
     MEMINFO_SWAP_FREE,
     MEMINFO_ZRAM_TOTAL,
+    MEMINFO_MAPPED,
+    MEMINFO_VMALLOC_USED,
+    MEMINFO_PAGE_TABLES,
+    MEMINFO_KERNEL_STACK,
     MEMINFO_COUNT
 };
 
@@ -590,6 +594,11 @@
             "Slab:",
             "SwapTotal:",
             "SwapFree:",
+            "ZRam:",
+            "Mapped:",
+            "VmallocUsed:",
+            "PageTables:",
+            "KernelStack:",
             NULL
     };
     static const int tagsLen[] = {
@@ -601,12 +610,17 @@
             5,
             10,
             9,
+            5,
+            7,
+            12,
+            11,
+            12,
             0
     };
-    long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+    long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
     char* p = buffer;
-    while (*p && numFound < 8) {
+    while (*p && numFound < 13) {
         int i = 0;
         while (tags[i]) {
             if (strncmp(p, tags[i], tagsLen[i]) == 0) {