Prevent double-counting of kernel stack size in dumpsys reports
When kernel is configured with CONFIG_VMAP_STACK=y kernel stacks are mapped into process space and therefore already accounted as part of the value returned by ReadVmallocInfo and reported under MEMINFO_VM_ALLOC_USED category. Introduce isVmapStack function to check if kernel is configured with that option and if so do not exclude kernel stack size in the calculation of memory used by kernel. Bug: 146088882 Test: dumpsys meminfo with CONFIG_VMAP_STACK enabled and disabled Change-Id: I9230bbf0ab05524cf52ded35171fd9ec3da16fa0 Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
#include <memunreachable/memunreachable.h>
|
||||
#include <android-base/strings.h>
|
||||
#include "android_os_Debug.h"
|
||||
#include <vintf/VintfObject.h>
|
||||
|
||||
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<std::string, std::string> configs =
|
||||
vintf::VintfObject::GetInstance()->getRuntimeInfo()->kernelConfigs();
|
||||
std::map<std::string, std::string>::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)
|
||||
|
||||
Reference in New Issue
Block a user