diff options
| author | 2013-07-26 23:09:08 +0000 | |
|---|---|---|
| committer | 2013-07-26 23:09:09 +0000 | |
| commit | ddb1428ab619b624fffb6f425deef57d149c95a1 (patch) | |
| tree | 14ab57105db107c8d77816903f82ef14401c9925 | |
| parent | d06db894b2b092e95fc19bf993bfc5bab7a486b1 (diff) | |
| parent | 59d80a5270249b8b0b32b7ce8e081f4fbd41129a (diff) | |
Merge "set the extra_free_kbytes kernel vm tunable"
| -rw-r--r-- | core/res/res/values/config.xml | 18 | ||||
| -rwxr-xr-x | core/res/res/values/symbols.xml | 2 | ||||
| -rw-r--r-- | services/java/com/android/server/am/ProcessList.java | 19 |
3 files changed, 39 insertions, 0 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 7647917352b6..8e86950f68ad 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -152,6 +152,24 @@ bucket, and scaled proportionally to the smaller buckets. 0 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer> + <!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable in the kernel + (if it exists). A high value will increase the amount of memory that the kernel + tries to keep free, reducing allocation time and causing the lowmemorykiller to kill + earlier. A low value allows more memory to be used by processes but may cause more + allocations to block waiting on disk I/O or lowmemorykiller. Overrides the default + value chosen by ActivityManager based on screen size. 0 prevents keeping any extra + memory over what the kernel keeps by default. -1 keeps the default. --> + <integer name="config_extraFreeKbytesAbsolute">-1</integer> + + <!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes tunable in the kernel + (if it exists). 0 uses the default value chosen by ActivityManager. A positive value + will increase the amount of memory that the kernel tries to keep free, reducing + allocation time and causing the lowmemorykiller to kill earlier. A negative value + allows more memory to be used by processes but may cause more allocations to block + waiting on disk I/O or lowmemorykiller. Directly added to the default value chosen by + ActivityManager based on screen size. --> + <integer name="config_extraFreeKbytesAdjust">0</integer> + <!-- The duration (in milliseconds) that the radio will scan for a signal when there's no network connection. If the scan doesn't timeout, use zero --> <integer name="config_radioScanningTimeout">0</integer> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f1eae82420a0..008c3340578a 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -283,6 +283,8 @@ <java-symbol type="bool" name="config_useFixedVolume" /> <java-symbol type="integer" name="config_cursorWindowSize" /> + <java-symbol type="integer" name="config_extraFreeKbytesAdjust" /> + <java-symbol type="integer" name="config_extraFreeKbytesAbsolute" /> <java-symbol type="integer" name="config_longPressOnPowerBehavior" /> <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" /> <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" /> diff --git a/services/java/com/android/server/am/ProcessList.java b/services/java/com/android/server/am/ProcessList.java index 0642a6ca10be..ae5c65278de0 100644 --- a/services/java/com/android/server/am/ProcessList.java +++ b/services/java/com/android/server/am/ProcessList.java @@ -24,6 +24,7 @@ import com.android.server.wm.WindowManagerService; import android.content.res.Resources; import android.graphics.Point; +import android.os.SystemProperties; import android.util.Slog; import android.view.Display; @@ -237,10 +238,28 @@ final class ProcessList { memString.append((mOomMinFree[i]*1024)/PAGE_SIZE); } + // Ask the kernel to try to keep enough memory free to allocate 3 full + // screen 32bpp buffers without entering direct reclaim. + int reserve = displayWidth * displayHeight * 4 * 3 / 1024; + int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust); + int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute); + + if (reserve_abs >= 0) { + reserve = reserve_abs; + } + + if (reserve_adj != 0) { + reserve += reserve_adj; + if (reserve < 0) { + reserve = 0; + } + } + //Slog.i("XXXXXXX", "******************************* MINFREE: " + memString); if (write) { writeFile("/sys/module/lowmemorykiller/parameters/adj", adjString.toString()); writeFile("/sys/module/lowmemorykiller/parameters/minfree", memString.toString()); + SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve)); } // GB: 2048,3072,4096,6144,7168,8192 // HC: 8192,10240,12288,14336,16384,20480 |