diff options
| -rw-r--r-- | core/java/android/os/Debug.java | 13 | ||||
| -rw-r--r-- | core/jni/android_os_Debug.cpp | 116 |
2 files changed, 102 insertions, 27 deletions
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 60ce1327913b..8f68fc1a3cbc 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -158,7 +158,7 @@ public final class Debug public int otherSharedClean; /** @hide */ - public static final int NUM_OTHER_STATS = 13; + public static final int NUM_OTHER_STATS = 14; /** @hide */ public static final int NUM_DVK_STATS = 5; @@ -285,11 +285,12 @@ public final class Debug case 10: return "code mmap"; case 11: return "image mmap"; case 12: return "Other mmap"; - case 13: return ".Heap"; - case 14: return ".LOS"; - case 15: return ".LinearAlloc"; - case 16: return ".GC"; - case 17: return ".JITCache"; + case 13: return "GPU"; + case 14: return ".Heap"; + case 15: return ".LOS"; + case 16: return ".LinearAlloc"; + case 17: return ".GC"; + case 18: return ".JITCache"; default: return "????"; } } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index f5eb38988ef2..dd07c4f52144 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -56,6 +56,7 @@ enum { HEAP_OAT, HEAP_ART, HEAP_UNKNOWN_MAP, + HEAP_GPU, HEAP_DALVIK_NORMAL, HEAP_DALVIK_LARGE, @@ -64,7 +65,7 @@ enum { HEAP_DALVIK_CODE_CACHE, _NUM_HEAP, - _NUM_EXCLUSIVE_HEAP = HEAP_UNKNOWN_MAP+1, + _NUM_EXCLUSIVE_HEAP = HEAP_GPU+1, _NUM_CORE_HEAP = HEAP_NATIVE+1 }; @@ -137,6 +138,72 @@ static jlong android_os_Debug_getNativeHeapFreeSize(JNIEnv *env, jobject clazz) #endif } +// XXX Qualcom-specific! +static jlong read_gpu_mem(int pid) +{ + char line[1024]; + jlong uss = 0; + unsigned temp; + + char tmp[128]; + FILE *fp; + + sprintf(tmp, "/d/kgsl/proc/%d/mem", pid); + fp = fopen(tmp, "r"); + if (fp == 0) { + //ALOGI("Unable to open: %s", tmp); + return 0; + } + + while (true) { + if (fgets(line, 1024, fp) == NULL) { + break; + } + + //ALOGI("Read: %s", line); + + // Format is: + // gpuaddr useraddr size id flags type usage sglen + // 54676000 54676000 4096 1 ----p gpumem arraybuffer 1 + // + // If useraddr is 0, this is gpu mem not otherwise accounted + // against the process. + + // Make sure line is long enough. + int i = 0; + while (i < 9) { + if (line[i] == 0) { + break; + } + i++; + } + if (i < 9) { + //ALOGI("Early line term!"); + continue; + } + + // Look to see if useraddr is 00000000. + while (i < 17) { + if (line[i] != '0') { + break; + } + i++; + } + if (i < 17) { + //ALOGI("useraddr not 0!"); + continue; + } + + uss += atoi(line + i); + //ALOGI("Uss now: %ld", uss); + } + + fclose(fp); + + // Convert from bytes to KB. + return uss / 1024; +} + static void read_mapinfo(FILE *fp, stats_t* stats) { char line[1024]; @@ -340,6 +407,10 @@ static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz, load_maps(pid, stats); + jlong gpu = read_gpu_mem(pid); + stats[HEAP_GPU].pss += gpu; + stats[HEAP_GPU].privateDirty += gpu; + for (int i=_NUM_CORE_HEAP; i<_NUM_EXCLUSIVE_HEAP; i++) { stats[HEAP_UNKNOWN].pss += stats[i].pss; stats[HEAP_UNKNOWN].swappablePss += stats[i].swappablePss; @@ -394,34 +465,37 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, jl char tmp[128]; FILE *fp; + pss = uss = read_gpu_mem(pid); + sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); - if (fp == 0) return 0; - while (true) { - if (fgets(line, 1024, fp) == NULL) { - break; - } + if (fp != 0) { + while (true) { + if (fgets(line, 1024, fp) == NULL) { + break; + } - if (line[0] == 'P') { - if (strncmp(line, "Pss:", 4) == 0) { - char* c = line + 4; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - pss += atoi(c); - } else if (strncmp(line, "Private_Clean:", 14) - || strncmp(line, "Private_Dirty:", 14)) { - char* c = line + 14; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; + if (line[0] == 'P') { + if (strncmp(line, "Pss:", 4) == 0) { + char* c = line + 4; + while (*c != 0 && (*c < '0' || *c > '9')) { + c++; + } + pss += atoi(c); + } else if (strncmp(line, "Private_Clean:", 14) + || strncmp(line, "Private_Dirty:", 14)) { + char* c = line + 14; + while (*c != 0 && (*c < '0' || *c > '9')) { + c++; + } + uss += atoi(c); } - uss += atoi(c); } } - } - fclose(fp); + fclose(fp); + } if (outUss != NULL) { if (env->GetArrayLength(outUss) >= 1) { |