summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/res/res/values/config.xml18
-rwxr-xr-xcore/res/res/values/symbols.xml2
-rw-r--r--services/java/com/android/server/am/ProcessList.java19
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