Merge "Send top-app's render thread tid to perf HAL" into r-keystone-qcom-dev
diff --git a/core/java/android/util/BoostFramework.java b/core/java/android/util/BoostFramework.java
index f3e4965..b6a5f7e 100644
--- a/core/java/android/util/BoostFramework.java
+++ b/core/java/android/util/BoostFramework.java
@@ -83,6 +83,7 @@
     public static final int VENDOR_HINT_PERFORMANCE_MODE = 0x00001091;
     public static final int VENDOR_HINT_APP_UPDATE = 0x00001092;
     public static final int VENDOR_HINT_KILL = 0x00001093;
+    public static final int VENDOR_HINT_BOOST_RENDERTHREAD = 0x00001095;
     //perf events
     public static final int VENDOR_HINT_FIRST_DRAW = 0x00001042;
     public static final int VENDOR_HINT_TAP_EVENT = 0x00001043;
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 94be314..85189b1 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -219,6 +219,12 @@
 
     public static BoostFramework mPerf = new BoostFramework();
 
+    //Per Task Boost of top-app renderThread
+    public static BoostFramework mPerfBoost = new BoostFramework();
+    public static int mPerfHandle = -1;
+    public static int mCurRenderThreadTid = -1;
+    public static boolean mIsTopAppRenderThreadBoostEnabled = false;
+
     private final int mNumSlots;
     private ArrayList<ProcessRecord> mTmpProcessList = new ArrayList<ProcessRecord>();
     private ArrayList<UidRecord> mTmpBecameIdle = new ArrayList<UidRecord>();
@@ -258,6 +264,7 @@
             mEnableBServicePropagation = Boolean.parseBoolean(mPerf.perfGetProp("ro.vendor.qti.sys.fw.bservice_enable", "false"));
             mEnableProcessGroupCgroupFollow = Boolean.parseBoolean(mPerf.perfGetProp("ro.vendor.qti.cgroup_follow.enable", "false"));
             mProcessGroupCgroupFollowDex2oatOnly = Boolean.parseBoolean(mPerf.perfGetProp("ro.vendor.qti.cgroup_follow.dex2oat_only", "false"));
+            mIsTopAppRenderThreadBoostEnabled = Boolean.parseBoolean(mPerf.perfGetProp("vendor.perf.topAppRenderThreadBoost.enable", "false"));
         }
 
         mProcessGroupHandler = new Handler(adjusterThread.getLooper(), msg -> {
@@ -1286,6 +1293,24 @@
             }
             foregroundActivities = true;
             procState = PROCESS_STATE_CUR_TOP;
+            if(mIsTopAppRenderThreadBoostEnabled) {
+                if(mCurRenderThreadTid != app.renderThreadTid && app.renderThreadTid > 0) {
+                    mCurRenderThreadTid = app.renderThreadTid;
+                    if (mPerfBoost != null) {
+                        Slog.d(TAG, "TOP-APP: pid:" + app.pid + ", processName: "
+                               + app.processName + ", renderThreadTid: " + app.renderThreadTid);
+                        if (mPerfHandle >= 0) {
+                            mPerfBoost.perfLockRelease();
+                            mPerfHandle = -1;
+                        }
+                        mPerfHandle = mPerfBoost.perfHint(BoostFramework.VENDOR_HINT_BOOST_RENDERTHREAD,
+                                                          app.processName, app.renderThreadTid, 1);
+                        Slog.d(TAG, "VENDOR_HINT_BOOST_RENDERTHREAD perfHint was called. mPerfHandle: "
+                               + mPerfHandle);
+                    }
+                }
+            }
+
             if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
                 reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top: " + app);
             }