From 187a6aeb112ecbf85387a21ea75cf6beb3f9fc76 Mon Sep 17 00:00:00 2001 From: Greg Hackmann Date: Wed, 9 Dec 2015 09:36:12 -0800 Subject: Prefer new zram ABI Starting with Linux 4.1, reading from /dev/block/zram*/mem_used_total logs this warning: "Attribute mem_used_total (and others) will be removed. See zram documentation." mem_used_total and several related counters are now consolidated under a new node mm_stat. Prefer that when it's available. Bug: 25951511 Change-Id: I0862c3cd1af5d003158aca6be42db25e4bebe7c7 Signed-off-by: Greg Hackmann --- core/jni/android_os_Debug.cpp | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 1ee7ea8f7ea6..71f881e6d6e1 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -595,6 +595,36 @@ enum { MEMINFO_COUNT }; +static long get_zram_mem_used() +{ +#define ZRAM_SYSFS "/sys/block/zram0/" + FILE *f = fopen(ZRAM_SYSFS "mm_stat", "r"); + if (f) { + long mem_used_total = 0; + + int matched = fscanf(f, "%*d %*d %ld %*d %*d %*d %*d", &mem_used_total); + if (matched != 1) + ALOGW("failed to parse " ZRAM_SYSFS "mm_stat"); + + fclose(f); + return mem_used_total; + } + + f = fopen(ZRAM_SYSFS "mem_used_total", "r"); + if (f) { + long mem_used_total = 0; + + int matched = fscanf(f, "%ld", &mem_used_total); + if (matched != 1) + ALOGW("failed to parse " ZRAM_SYSFS "mem_used_total"); + + fclose(f); + return mem_used_total; + } + + return 0; +} + static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray out) { char buffer[1024]; @@ -680,15 +710,7 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o if (*p) p++; } - fd = open("/sys/block/zram0/mem_used_total", O_RDONLY); - if (fd >= 0) { - len = read(fd, buffer, sizeof(buffer)-1); - close(fd); - if (len > 0) { - buffer[len] = 0; - mem[MEMINFO_ZRAM_TOTAL] = atoll(buffer)/1024; - } - } + mem[MEMINFO_ZRAM_TOTAL] = get_zram_mem_used() / 1024; // Recompute Vmalloc Used since the value in meminfo // doesn't account for I/O remapping which doesn't use RAM. mem[MEMINFO_VMALLOC_USED] = get_allocated_vmalloc_memory() / 1024; -- cgit v1.2.3-59-g8ed1b