diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 422761c4dca58..d7ed055776972 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -2526,4 +2526,12 @@ public final class Debug * @hide */ public static native long getIonMappedSizeKb(); + + /** + * Return whether virtually-mapped kernel stacks are enabled (CONFIG_VMAP_STACK). + * Note: caller needs config_gz read sepolicy permission + * + * @hide + */ + public static native boolean isVmapStack(); } diff --git a/core/java/com/android/internal/util/MemInfoReader.java b/core/java/com/android/internal/util/MemInfoReader.java index 362bc92e40ad2..580c2fa66de21 100644 --- a/core/java/com/android/internal/util/MemInfoReader.java +++ b/core/java/com/android/internal/util/MemInfoReader.java @@ -107,9 +107,12 @@ public final class MemInfoReader { * 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_UNRECLAIMABLE] - + mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES] - + mInfos[Debug.MEMINFO_KERNEL_STACK]; + long size = mInfos[Debug.MEMINFO_SHMEM] + mInfos[Debug.MEMINFO_SLAB_UNRECLAIMABLE] + + mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES]; + if (!Debug.isVmapStack()) { + size += mInfos[Debug.MEMINFO_KERNEL_STACK]; + } + return size; } public long getSwapTotalSizeKb() { diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 3e7b6b3a6bffb..52ce54bc89245 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -50,6 +50,7 @@ #include #include #include "android_os_Debug.h" +#include namespace android { @@ -833,6 +834,23 @@ static jlong android_os_Debug_getIonMappedSizeKb(JNIEnv* env, jobject clazz) { return ionPss; } +static jboolean android_os_Debug_isVmapStack(JNIEnv *env, jobject clazz) +{ + static enum { + CONFIG_UNKNOWN, + CONFIG_SET, + CONFIG_UNSET, + } cfg_state = CONFIG_UNKNOWN; + + if (cfg_state == CONFIG_UNKNOWN) { + const std::map configs = + vintf::VintfObject::GetInstance()->getRuntimeInfo()->kernelConfigs(); + std::map::const_iterator it = configs.find("CONFIG_VMAP_STACK"); + cfg_state = (it != configs.end() && it->second == "y") ? CONFIG_SET : CONFIG_UNSET; + } + return cfg_state == CONFIG_SET; +} + /* * JNI registration. */ @@ -882,6 +900,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_getIonPoolsSizeKb }, { "getIonMappedSizeKb", "()J", (void*)android_os_Debug_getIonMappedSizeKb }, + { "isVmapStack", "()Z", + (void*)android_os_Debug_isVmapStack }, }; int register_android_os_Debug(JNIEnv *env)