summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Colin Cross <ccross@android.com> 2013-07-25 10:45:05 -0700
committer Colin Cross <ccross@android.com> 2013-07-26 16:06:45 -0700
commit59d80a5270249b8b0b32b7ce8e081f4fbd41129a (patch)
tree9b468bb4445a57fae9e01acb9ed7546e47a4a650
parent54e5f0eb7634c42b702f8ac0bb7cc2a48f0bc14c (diff)
set the extra_free_kbytes kernel vm tunable
Set the sys.sysctl.extra_free_kbytes property, which will proxy through init to the /proc/sys/vm/extra_free_kbytes tunable (on kernels where it exists). This will ask the kernel to keep more memory free, causing lowmemorykiller to fire earlier and allocations to succeed faster. The size is set to 3 full screen 32bpp buffers. Products can override the size with an absolute or adjustment value using overlays config_extraFreeKbytesAbsolute and config_extraFreeKbytesAdjust. Bug: 10024467 Change-Id: Ib4d4507513ec3c1f4d4ceeb81ed632d1ad643437
-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