summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralk3pInjection <webmaster@raspii.tech>2022-08-05 20:43:06 +0800
committeralk3pInjection <webmaster@raspii.tech>2022-08-05 20:43:06 +0800
commit6bf5529a1dc2fe7c6269298fa98a0982f6cea2d5 (patch)
tree76b090ba1598e728ec85a8afbb88c909d076bf1b
parentf637d7a7cafb1540448d3622285bd6080e492a54 (diff)
parent9b46e1caea3e666973508df4f2013ec4a954bb8f (diff)
Merge tag 'LA.QSSI.12.0.r1-08300-qssi.0' into sugisawa-mr1
"LA.QSSI.12.0.r1-08300-qssi.0" Change-Id: Ie275081952d33914848f88404af4b28f7b3dea92
-rw-r--r--core/java/android/view/Choreographer.java4
-rw-r--r--services/core/java/com/android/server/BluetoothManagerService.java26
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java149
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java1
-rw-r--r--services/core/java/com/android/server/am/CachedAppOptimizer.java9
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java3
-rw-r--r--[-rwxr-xr-x]services/core/java/com/android/server/wm/ActivityRecord.java31
-rw-r--r--services/core/jni/com_android_server_am_CachedAppOptimizer.cpp79
9 files changed, 178 insertions, 128 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java
index 39beeeae11de..c3511e7c036d 100644
--- a/core/java/android/view/Choreographer.java
+++ b/core/java/android/view/Choreographer.java
@@ -844,6 +844,10 @@ public final class Choreographer {
mLastVsyncEventData = vsyncEventData;
}
+ if (frameIntervalNanos > 0 && frameIntervalNanos != mFrameIntervalNanos) {
+ mFrameIntervalNanos = frameIntervalNanos;
+ ScrollOptimizer.setFrameInterval(mFrameIntervalNanos);
+ }
ScrollOptimizer.setUITaskStatus(true);
AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS);
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 806ea95424a7..1ed5840c4ab4 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -2031,9 +2031,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
case MESSAGE_ENABLE:
int quietEnable = msg.arg1;
int isBle = msg.arg2;
+ Slog.d(TAG, "MESSAGE_ENABLE: isBle: " + isBle + " msg.obj : " + msg.obj);
if (mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED)
|| mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)) {
- if (msg.arg2 == 0) {
+ if (msg.obj == null) {
int delay = ENABLE_DISABLE_DELAY_MS;
if (mHandler.hasMessages(MESSAGE_DISABLE)) {
@@ -2044,11 +2045,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
mHandler.removeMessages(MESSAGE_ENABLE);
// We are handling enable or disable right now, wait for it.
mHandler.sendMessageDelayed(mHandler.obtainMessage(
- MESSAGE_ENABLE, quietEnable, 1), delay);
+ MESSAGE_ENABLE, quietEnable, isBle, 1), delay);
Slog.d(TAG, "Queue new MESSAGE_ENABLE");
} else {
mHandler.sendMessageDelayed(mHandler.obtainMessage(
- MESSAGE_ENABLE, quietEnable, 1), ENABLE_DISABLE_DELAY_MS);
+ MESSAGE_ENABLE, quietEnable, isBle, 1), ENABLE_DISABLE_DELAY_MS);
Slog.d(TAG, "Re-Queue previous MESSAGE_ENABLE");
if (mHandler.hasMessages(MESSAGE_DISABLE)) {
// Ensure the original order of just entering the queue
@@ -2060,10 +2061,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
}
}
break;
- } else if(msg.arg2 == 0 && mHandler.hasMessages(MESSAGE_DISABLE)) {
+ } else if(msg.obj == null && mHandler.hasMessages(MESSAGE_DISABLE)) {
mHandler.removeMessages(MESSAGE_ENABLE);
mHandler.sendMessageDelayed(mHandler.obtainMessage(
- MESSAGE_ENABLE, quietEnable, 1), ENABLE_DISABLE_DELAY_MS * 2);
+ MESSAGE_ENABLE, quietEnable, isBle, 1), ENABLE_DISABLE_DELAY_MS * 2);
Slog.d(TAG, "MESSAGE_DISABLE exist. Queue new MESSAGE_ENABLE");
break;
}
@@ -2088,11 +2089,14 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
int state = mBluetooth.getState();
switch (state) {
case BluetoothAdapter.STATE_BLE_ON:
- if (isBle == 1) {
- Slog.i(TAG, "Already at BLE_ON State");
- } else {
- Slog.w(TAG, "BT Enable in BLE_ON State, going to ON");
+ if (isBluetoothPersistedStateOnBluetooth() ||
+ mEnableExternal) {
+ Slog.w(TAG, "BLE_ON State:Enable from Settings or" +
+ "BT on persisted, going to ON");
mBluetooth.onLeServiceUp(mContext.getAttributionSource());
+ } else if (isBle == 1) {
+ Slog.w(TAG, "BLE_ON State:Queued enable from ble app," +
+ " stay in ble on");
}
break;
case BluetoothAdapter.STATE_BLE_TURNING_ON:
@@ -2165,8 +2169,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
// if MESSAGE_DISABLE present
mHandler.removeMessages(MESSAGE_ENABLE);
mHandler.sendMessageDelayed(mHandler.obtainMessage(
- MESSAGE_ENABLE, mQuietEnableExternal ? 1: 0, 1),
- ENABLE_DISABLE_DELAY_MS * 2);
+ MESSAGE_ENABLE, mQuietEnableExternal ? 1: 0,
+ mEnableExternal ? 0:1, 1), ENABLE_DISABLE_DELAY_MS * 2);
Slog.d(TAG, "Re-Queue previous MESSAGE_ENABLE");
}
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 3e905960d4df..ee5bc5374df0 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -306,6 +306,9 @@ public final class ActiveServices {
private IServicetracker mServicetracker;
+ private final boolean isLowRamDevice =
+ SystemProperties.getBoolean("ro.config.low_ram", false);
+
String mLastAnrDump;
AppWidgetManagerInternal mAppWidgetManagerInternal;
@@ -2848,28 +2851,30 @@ public final class ActiveServices {
}
clist.add(c);
- ServiceData sData = new ServiceData();
- sData.packageName = s.packageName;
- sData.processName = s.shortInstanceName;
- sData.lastActivity = s.lastActivity;
- if (s.app != null) {
- sData.pid = s.app.getPid();
- sData.serviceB = s.app.mState.isServiceB();
- } else {
- sData.pid = -1;
- sData.serviceB = false;
- }
+ if (!isLowRamDevice) {
+ ServiceData sData = new ServiceData();
+ sData.packageName = s.packageName;
+ sData.processName = s.shortInstanceName;
+ sData.lastActivity = s.lastActivity;
+ if (s.app != null) {
+ sData.pid = s.app.getPid();
+ sData.serviceB = s.app.mState.isServiceB();
+ } else {
+ sData.pid = -1;
+ sData.serviceB = false;
+ }
- ClientData cData = new ClientData();
- cData.processName = callerApp.processName;
- cData.pid = callerApp.getPid();
- try {
- if (getServicetrackerInstance()) {
- mServicetracker.bindService(sData, cData);
+ ClientData cData = new ClientData();
+ cData.processName = callerApp.processName;
+ cData.pid = callerApp.getPid();
+ try {
+ if (getServicetrackerInstance()) {
+ mServicetracker.bindService(sData, cData);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to send bind details to servicetracker HAL", e);
+ mServicetracker = null;
}
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to send bind details to servicetracker HAL", e);
- mServicetracker = null;
}
boolean needOomAdj = false;
@@ -3054,28 +3059,30 @@ public final class ActiveServices {
try {
while (clist.size() > 0) {
ConnectionRecord r = clist.get(0);
- ServiceData sData = new ServiceData();
- sData.packageName = r.binding.service.packageName;
- sData.processName = r.binding.service.shortInstanceName;
- sData.lastActivity = r.binding.service.lastActivity;
- if(r.binding.service.app != null) {
- sData.pid = r.binding.service.app.getPid();
- sData.serviceB = r.binding.service.app.mState.isServiceB();
- } else {
- sData.pid = -1;
- sData.serviceB = false;
- }
+ if (!isLowRamDevice) {
+ ServiceData sData = new ServiceData();
+ sData.packageName = r.binding.service.packageName;
+ sData.processName = r.binding.service.shortInstanceName;
+ sData.lastActivity = r.binding.service.lastActivity;
+ if(r.binding.service.app != null) {
+ sData.pid = r.binding.service.app.getPid();
+ sData.serviceB = r.binding.service.app.mState.isServiceB();
+ } else {
+ sData.pid = -1;
+ sData.serviceB = false;
+ }
- ClientData cData = new ClientData();
- cData.processName = r.binding.client.processName;
- cData.pid = r.binding.client.getPid();
- try {
- if (getServicetrackerInstance()) {
- mServicetracker.unbindService(sData, cData);
+ ClientData cData = new ClientData();
+ cData.processName = r.binding.client.processName;
+ cData.pid = r.binding.client.getPid();
+ try {
+ if (getServicetrackerInstance()) {
+ mServicetracker.unbindService(sData, cData);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to send unbind details to servicetracker HAL", e);
+ mServicetracker = null;
}
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to send unbind details to servicetracker HAL", e);
- mServicetracker = null;
}
removeConnectionLocked(r, null, null, true);
if (clist.size() > 0 && clist.get(0) == r) {
@@ -4086,20 +4093,22 @@ public final class ActiveServices {
r.postNotification();
created = true;
- ServiceData sData = new ServiceData();
- sData.packageName = r.packageName;
- sData.processName = r.shortInstanceName;
- sData.pid = r.app.getPid();
- sData.lastActivity = r.lastActivity;
- sData.serviceB = r.app.mState.isServiceB();
+ if (!isLowRamDevice) {
+ ServiceData sData = new ServiceData();
+ sData.packageName = r.packageName;
+ sData.processName = r.shortInstanceName;
+ sData.pid = r.app.getPid();
+ sData.lastActivity = r.lastActivity;
+ sData.serviceB = r.app.mState.isServiceB();
- try {
- if (getServicetrackerInstance()) {
- mServicetracker.startService(sData);
+ try {
+ if (getServicetrackerInstance()) {
+ mServicetracker.startService(sData);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to send start details to servicetracker HAL", e);
+ mServicetracker = null;
}
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to send start details to servicetracker HAL", e);
- mServicetracker = null;
}
} catch (DeadObjectException e) {
Slog.w(TAG, "Application dead when creating service " + r);
@@ -4300,24 +4309,26 @@ public final class ActiveServices {
private void bringDownServiceLocked(ServiceRecord r, boolean enqueueOomAdj) {
//Slog.i(TAG, "Bring down service:");
//r.dump(" ");
- ServiceData sData = new ServiceData();
- sData.packageName = r.packageName;
- sData.processName = r.shortInstanceName;
- sData.lastActivity = r.lastActivity;
- if (r.app != null) {
- sData.pid = r.app.getPid();
- } else {
- sData.pid = -1;
- sData.serviceB = false;
- }
+ if (!isLowRamDevice) {
+ ServiceData sData = new ServiceData();
+ sData.packageName = r.packageName;
+ sData.processName = r.shortInstanceName;
+ sData.lastActivity = r.lastActivity;
+ if (r.app != null) {
+ sData.pid = r.app.getPid();
+ } else {
+ sData.pid = -1;
+ sData.serviceB = false;
+ }
- try {
- if (getServicetrackerInstance()) {
- mServicetracker.destroyService(sData);
+ try {
+ if (getServicetrackerInstance()) {
+ mServicetracker.destroyService(sData);
+ }
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to send destroy details to servicetracker HAL", e);
+ mServicetracker = null;
}
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to send destroy details to servicetracker HAL", e);
- mServicetracker = null;
}
// Report to all of the connections that the service is no longer
// available.
@@ -5065,7 +5076,7 @@ public final class ActiveServices {
}
try {
- if (getServicetrackerInstance()) {
+ if (!isLowRamDevice && getServicetrackerInstance()) {
mServicetracker.killProcess(app.getPid());
}
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dbdb2ab54e89..3e3a4a51f372 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -6447,7 +6447,6 @@ public class ActivityManagerService extends IActivityManager.Stub
reportCurWakefulnessUsageEvent();
mActivityTaskManager.onScreenAwakeChanged(isAwake);
mOomAdjProfiler.onWakefulnessChanged(wakefulness);
- mOomAdjuster.onWakefulnessChanged(wakefulness);
}
updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 30b63940de7f..2aba375fc40b 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -1128,15 +1128,6 @@ public final class CachedAppOptimizer {
}
}
- void onWakefulnessChanged(int wakefulness) {
- if(wakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) {
- // Remove any pending compaction we may have scheduled to happen while screen was off
- Slog.e(TAG_AM, "Cancel pending or running compactions as system is awake");
- mPendingCompactionProcesses.clear();
- cancelCompaction();
- }
- }
-
@GuardedBy({"mService", "mProcLock"})
void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) {
// Cancel any currently executing compactions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 2ed6fc483e31..e94c2fa60fc1 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2687,10 +2687,6 @@ public class OomAdjuster {
}
}
- void onWakefulnessChanged(int wakefulness) {
- mCachedAppOptimizer.onWakefulnessChanged(wakefulness);
- }
-
/** Applies the computed oomadj, procstate and sched group values and freezes them in set* */
@GuardedBy({"mService", "mProcLock"})
private boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now,
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 96557f79a554..48d923b38c4e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -900,7 +900,8 @@ public class PackageManagerService extends IPackageManager.Stub
* List of packages path on the file system.
*/
final private List<String> mPackagesPathToBeDisabledForQSPA = new ArrayList<String>();
- final private boolean mQspaEnabled = SystemProperties.getBoolean("ro.config.qspa.apps", false);
+ final private boolean mQspaEnabled = SystemProperties.getBoolean(
+ "ro.vendor.config.qspa.apps", false);
/**
* Tracks new system packages [received in an OTA] that we expect to
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 55ac7ccdcaaf..b713e82b8534 100755..100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -284,6 +284,7 @@ import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.service.contentcapture.ActivityEvent;
@@ -613,6 +614,9 @@ public final class ActivityRecord extends WindowToken implements WindowManagerSe
public BoostFramework mPerf = null;
public BoostFramework mPerf_iop = null;
+ private final boolean isLowRamDevice =
+ SystemProperties.getBoolean("ro.config.low_ram", false);
+
boolean mVoiceInteraction;
private int mPendingRelaunchCount;
@@ -5270,18 +5274,21 @@ public final class ActivityRecord extends WindowToken implements WindowManagerSe
aState = ActivityStates.RESTARTING_PROCESS;
break;
}
- if(DEBUG_SERVICETRACKER) {
- Slog.v(TAG, "Calling mServicetracker.OnActivityStateChange with flag " + early_notify + " state " + state);
- }
- try {
- mServicetracker = mAtmService.mTaskSupervisor.getServicetrackerInstance();
- if (mServicetracker != null)
- mServicetracker.OnActivityStateChange(aState, aDetails, aStats, early_notify);
- else
- Slog.e(TAG, "Unable to get servicetracker HAL instance");
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to send activity state change details to servicetracker HAL", e);
- mAtmService.mTaskSupervisor.destroyServicetrackerInstance();
+ if (!isLowRamDevice) {
+ if(DEBUG_SERVICETRACKER) {
+ Slog.v(TAG, "Calling mServicetracker.OnActivityStateChange with flag "
+ + early_notify + " state " + state);
+ }
+ try {
+ mServicetracker = mAtmService.mTaskSupervisor.getServicetrackerInstance();
+ if (mServicetracker != null)
+ mServicetracker.OnActivityStateChange(aState, aDetails, aStats, early_notify);
+ else
+ Slog.e(TAG, "Unable to get servicetracker HAL instance");
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to send activity state change details to servicetracker HAL", e);
+ mAtmService.mTaskSupervisor.destroyServicetrackerInstance();
+ }
}
}
diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
index 619b612b0374..636ca4143a33 100644
--- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
+++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
@@ -88,9 +88,7 @@ static inline void compactProcessProcfs(int pid, const std::string& compactionTy
// If any VMA fails compaction due to -EINVAL it will be skipped and continue.
// However, if it fails for any other reason, it will bail out and forward the error
static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseType) {
- // UIO_MAXIOV is currently a small value and we might have more addresses
- // we do multiple syscalls if we exceed its maximum
- static struct iovec vmasToKernel[UIO_MAXIOV];
+ static struct iovec vmasToKernel[MAX_VMAS_PER_COMPACTION];
if (vmas.empty()) {
return 0;
@@ -104,33 +102,72 @@ static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseT
compactionInProgress = true;
cancelRunningCompaction = false;
- int64_t totalBytesCompacted = 0;
- for (int iBase = 0; iBase < vmas.size(); iBase += UIO_MAXIOV) {
- if (CC_UNLIKELY(cancelRunningCompaction)) {
- // There could be a significant delay betweenwhen a compaction
- // is requested and when it is handled during this time
- // our OOM adjust could have improved.
+ int64_t totalBytesProcessed = 0;
+
+ int64_t vmaOffset = 0;
+ for (int iVma = 0; iVma < vmas.size();) {
+ uint64_t bytesSentToCompact = 0;
+ int iVec = 0;
+ while (iVec < MAX_VMAS_PER_COMPACTION && iVma < vmas.size()) {
+ if (CC_UNLIKELY(cancelRunningCompaction)) {
+ // There could be a significant delay between when a compaction
+ // is requested and when it is handled during this time our
+ // OOM adjust could have improved.
+ LOG(DEBUG) << "Cancelled running compaction for " << pid;
+ break;
+ }
+
+ uint64_t vmaStart = vmas[iVma].start + vmaOffset;
+ uint64_t vmaSize = vmas[iVma].end - vmaStart;
+ if (vmaSize == 0) {
+ goto next_vma;
+ }
+ vmasToKernel[iVec].iov_base = (void*)vmaStart;
+ if (vmaSize > MAX_BYTES_PER_COMPACTION - bytesSentToCompact) {
+ // Exceeded the max bytes that could be sent, so clamp
+ // the end to avoid exceeding limit and issue compaction
+ vmaSize = MAX_BYTES_PER_COMPACTION - bytesSentToCompact;
+ }
+
+ vmasToKernel[iVec].iov_len = vmaSize;
+ bytesSentToCompact += vmaSize;
+ ++iVec;
+ if (bytesSentToCompact >= MAX_BYTES_PER_COMPACTION) {
+ // Ran out of bytes within iovec, dispatch compaction.
+ vmaOffset += vmaSize;
+ break;
+ }
+
+ next_vma:
+ // Finished current VMA, and have more bytes remaining
+ vmaOffset = 0;
+ ++iVma;
+ }
+
+ if (cancelRunningCompaction) {
cancelRunningCompaction = false;
break;
}
- int totalVmasToKernel = std::min(UIO_MAXIOV, (int)(vmas.size() - iBase));
- for (int iVec = 0, iVma = iBase; iVec < totalVmasToKernel; ++iVec, ++iVma) {
- vmasToKernel[iVec].iov_base = (void*)vmas[iVma].start;
- vmasToKernel[iVec].iov_len = vmas[iVma].end - vmas[iVma].start;
- }
- auto bytesCompacted =
- process_madvise(pidfd, vmasToKernel, totalVmasToKernel, madviseType, 0);
- if (CC_UNLIKELY(bytesCompacted == -1)) {
- compactionInProgress = false;
- return -errno;
+ auto bytesProcessed = process_madvise(pidfd, vmasToKernel, iVec, madviseType, 0);
+
+ if (CC_UNLIKELY(bytesProcessed == -1)) {
+ if (errno == EINVAL) {
+ // This error is somewhat common due to an unevictable VMA if this is
+ // the case silently skip the bad VMA and continue compacting the rest.
+ continue;
+ } else {
+ // Forward irrecoverable errors and bail out compaction
+ compactionInProgress = false;
+ return -errno;
+ }
}
- totalBytesCompacted += bytesCompacted;
+ totalBytesProcessed += bytesProcessed;
}
compactionInProgress = false;
- return totalBytesCompacted;
+ return totalBytesProcessed;
}
static int getFilePageAdvice(const Vma& vma) {