diff options
| author | 2013-07-25 10:45:05 -0700 | |
|---|---|---|
| committer | 2013-07-26 16:06:45 -0700 | |
| commit | 59d80a5270249b8b0b32b7ce8e081f4fbd41129a (patch) | |
| tree | 9b468bb4445a57fae9e01acb9ed7546e47a4a650 | |
| parent | 54e5f0eb7634c42b702f8ac0bb7cc2a48f0bc14c (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.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 |