From fbcc05b19b9b64d68db95e4c3324200176e686f9 Mon Sep 17 00:00:00 2001 From: jimmyshiu Date: Thu, 18 Jul 2024 20:16:00 +0530 Subject: [PATCH] sm6375-common: power-libperfmgr: ADPF: Fix updateHintBoost blocks the binder thread post the task into a looper thread. Bug: 232992641 Test: Manually playing UIBench -> Transitions -> ActivityTransition Change-Id: Ibd241834f904b4c87a51363e766e110d2818d496 --- power-libperfmgr/Power.cpp | 10 ++++++++-- power-libperfmgr/PowerExt.cpp | 10 ++++++++-- power-libperfmgr/PowerHintSession.cpp | 18 +++++++++--------- power-libperfmgr/PowerHintSession.h | 3 ++- power-libperfmgr/PowerSessionManager.cpp | 6 +++++- power-libperfmgr/PowerSessionManager.h | 12 +++++++++++- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/power-libperfmgr/Power.cpp b/power-libperfmgr/Power.cpp index ca36b16..265a045 100644 --- a/power-libperfmgr/Power.cpp +++ b/power-libperfmgr/Power.cpp @@ -77,7 +77,10 @@ Power::Power() ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { LOG(DEBUG) << "Power setMode: " << toString(type) << " to: " << enabled; - PowerSessionManager::getInstance()->updateHintMode(toString(type), enabled); + if (HintManager::GetInstance()->GetAdpfProfile() && + HintManager::GetInstance()->GetAdpfProfile()->mReportingRateLimitNs > 0) { + PowerSessionManager::getInstance()->updateHintMode(toString(type), enabled); + } switch (type) { #ifdef TAP_TO_WAKE_NODE case Mode::DOUBLE_TAP_TO_WAKE: @@ -137,7 +140,10 @@ ndk::ScopedAStatus Power::isModeSupported(Mode type, bool *_aidl_return) { ndk::ScopedAStatus Power::setBoost(Boost type, int32_t durationMs) { LOG(DEBUG) << "Power setBoost: " << toString(type) << " duration: " << durationMs; - PowerSessionManager::getInstance()->updateHintBoost(toString(type), durationMs); + if (HintManager::GetInstance()->GetAdpfProfile() && + HintManager::GetInstance()->GetAdpfProfile()->mReportingRateLimitNs > 0) { + PowerSessionManager::getInstance()->updateHintBoost(toString(type), durationMs); + } switch (type) { case Boost::INTERACTION: if (mSustainedPerfModeOn) { diff --git a/power-libperfmgr/PowerExt.cpp b/power-libperfmgr/PowerExt.cpp index bc2d475..6bd61fb 100644 --- a/power-libperfmgr/PowerExt.cpp +++ b/power-libperfmgr/PowerExt.cpp @@ -47,7 +47,10 @@ ndk::ScopedAStatus PowerExt::setMode(const std::string &mode, bool enabled) { } else { HintManager::GetInstance()->EndHint(mode); } - PowerSessionManager::getInstance()->updateHintMode(mode, enabled); + if (HintManager::GetInstance()->GetAdpfProfile() && + HintManager::GetInstance()->GetAdpfProfile()->mReportingRateLimitNs > 0) { + PowerSessionManager::getInstance()->updateHintMode(mode, enabled); + } return ndk::ScopedAStatus::ok(); } @@ -61,7 +64,10 @@ ndk::ScopedAStatus PowerExt::isModeSupported(const std::string &mode, bool *_aid ndk::ScopedAStatus PowerExt::setBoost(const std::string &boost, int32_t durationMs) { LOG(DEBUG) << "PowerExt setBoost: " << boost << " duration: " << durationMs; - PowerSessionManager::getInstance()->updateHintBoost(boost, durationMs); + if (HintManager::GetInstance()->GetAdpfProfile() && + HintManager::GetInstance()->GetAdpfProfile()->mReportingRateLimitNs > 0) { + PowerSessionManager::getInstance()->updateHintBoost(boost, durationMs); + } if (durationMs > 0) { HintManager::GetInstance()->DoHint(boost, std::chrono::milliseconds(durationMs)); diff --git a/power-libperfmgr/PowerHintSession.cpp b/power-libperfmgr/PowerHintSession.cpp index 4875117..2eea100 100644 --- a/power-libperfmgr/PowerHintSession.cpp +++ b/power-libperfmgr/PowerHintSession.cpp @@ -145,7 +145,7 @@ PowerHintSession::PowerHintSession(int32_t tgid, int32_t uid, const std::vector< } PowerSessionManager::getInstance()->addPowerSession(this); // init boost - wakeup(); + setSessionUclampMin(HintManager::GetInstance()->GetAdpfProfile()->mUclampMinInit); ALOGV("PowerHintSession created: %s", mDescriptor->toString().c_str()); } @@ -161,10 +161,6 @@ PowerHintSession::~PowerHintSession() { sz = sz = StringPrintf("adpf.%s-active", idstr.c_str()); ATRACE_INT(sz.c_str(), 0); } - { - std::lock_guard guard(mSessionLock); - mSessionClosed.store(true); - } delete mDescriptor; } @@ -265,11 +261,16 @@ ndk::ScopedAStatus PowerHintSession::close() { if (!mSessionClosed.compare_exchange_strong(sessionClosedExpectedToBe, true)) { return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE); } + // Remove the session from PowerSessionManager first to avoid racing. + PowerSessionManager::getInstance()->removePowerSession(this); + setSessionUclampMin(0); + { + std::lock_guard guard(mSessionLock); + mSessionClosed.store(true); + } mDescriptor->is_active.store(false); mEarlyBoostHandler->setSessionDead(); mStaleTimerHandler->setSessionDead(); - setSessionUclampMin(0); - PowerSessionManager::getInstance()->removePowerSession(this); updateUniveralBoostMode(); return ndk::ScopedAStatus::ok(); } @@ -439,8 +440,7 @@ void PowerHintSession::updateWorkPeriod(const std::vector &actualD } const WorkDuration ¤t = actualDurations.back(); int64_t curr_start = current.timeStampNanos - current.durationNanos; - int64_t period = mDescriptor->duration.count(); - period = curr_start - mLastStartedTimeNs; + int64_t period = curr_start - mLastStartedTimeNs; if (period > 0 && period < mDescriptor->duration.count() * 2) { // Accounting workload period with moving average for the last 10 workload. mWorkPeriodNs = 0.9 * mWorkPeriodNs + 0.1 * period; diff --git a/power-libperfmgr/PowerHintSession.h b/power-libperfmgr/PowerHintSession.h index e81d96f..d922744 100644 --- a/power-libperfmgr/PowerHintSession.h +++ b/power-libperfmgr/PowerHintSession.h @@ -112,7 +112,8 @@ class PowerHintSession : public BnPowerHintSession { class EarlyBoostHandler : public MessageHandler { public: - EarlyBoostHandler(PowerHintSession *session) : mSession(session) {} + EarlyBoostHandler(PowerHintSession *session) + : mSession(session), mIsMonitoring(false), mIsSessionDead(false) {} void updateTimer(time_point boostTime); void handleMessage(const Message &message) override; void setSessionDead(); diff --git a/power-libperfmgr/PowerSessionManager.cpp b/power-libperfmgr/PowerSessionManager.cpp index 313a19e..516942a 100644 --- a/power-libperfmgr/PowerSessionManager.cpp +++ b/power-libperfmgr/PowerSessionManager.cpp @@ -97,7 +97,7 @@ void PowerSessionManager::updateHintBoost(const std::string &boost, int32_t dura ALOGV("PowerSessionManager::updateHintBoost: boost: %s, durationMs: %d", boost.c_str(), durationMs); if (boost.compare("DISPLAY_UPDATE_IMMINENT") == 0) { - wakeSessions(); + PowerHintMonitor::getInstance()->getLooper()->sendMessage(mWakeupHandler, NULL); } } @@ -201,6 +201,10 @@ void PowerSessionManager::handleMessage(const Message &) { } } +void PowerSessionManager::WakeupHandler::handleMessage(const Message &) { + PowerSessionManager::getInstance()->wakeSessions(); +} + void PowerSessionManager::dumpToFd(int fd) { std::ostringstream dump_buf; std::lock_guard guard(mLock); diff --git a/power-libperfmgr/PowerSessionManager.h b/power-libperfmgr/PowerSessionManager.h index 9007659..6cd0886 100644 --- a/power-libperfmgr/PowerSessionManager.h +++ b/power-libperfmgr/PowerSessionManager.h @@ -61,6 +61,13 @@ class PowerSessionManager : public MessageHandler { return instance; } + private: + class WakeupHandler : public MessageHandler { + public: + WakeupHandler() {} + void handleMessage(const Message &message) override; + }; + private: void wakeSessions(); std::optional isAnyAppSessionActive(); @@ -71,6 +78,7 @@ class PowerSessionManager : public MessageHandler { std::unordered_set mSessions; // protected by mLock std::unordered_map mTidRefCountMap; // protected by mLock std::unordered_map> mTidSessionListMap; + sp mWakeupHandler; bool mActive; // protected by mLock /** * mLock to pretect the above data objects opertions. @@ -82,7 +90,9 @@ class PowerSessionManager : public MessageHandler { : kDisableBoostHintName(::android::base::GetProperty(kPowerHalAdpfDisableTopAppBoost, "ADPF_DISABLE_TA_BOOST")), mActive(false), - mDisplayRefreshRate(60) {} + mDisplayRefreshRate(60) { + mWakeupHandler = sp(new WakeupHandler()); + } PowerSessionManager(PowerSessionManager const &) = delete; void operator=(PowerSessionManager const &) = delete; };