diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-09-25 03:06:37 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-09-25 03:06:37 +0000 |
commit | 2085407c5de522c982f2d0c42b472739479af24c (patch) | |
tree | 67ef98b8ec0a068becafa32ce6e9c3090d96db2b | |
parent | 68acddb4dd184ff3136fce943b44b76ae035c242 (diff) | |
parent | 41b552872df5a10a996340b0faa13ccceedb5f14 (diff) | |
download | native-2085407c5de522c982f2d0c42b472739479af24c.tar.gz |
Snap for 7766788 from 41b552872df5a10a996340b0faa13ccceedb5f14 to sc-qpr1-releaseandroid-12.0.0_r16
Change-Id: I455c04d2481b0f4e87d43ae0f677b43b3b525e4f
-rw-r--r-- | libs/binder/BpBinder.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp index 1dcb94c80f..6471aa6d6b 100644 --- a/libs/binder/BpBinder.cpp +++ b/libs/binder/BpBinder.cpp @@ -36,7 +36,8 @@ namespace android { // --------------------------------------------------------------------------- Mutex BpBinder::sTrackingLock; -std::unordered_map<int32_t,uint32_t> BpBinder::sTrackingMap; +std::unordered_map<int32_t, uint32_t> BpBinder::sTrackingMap; +std::unordered_map<int32_t, uint32_t> sLastLimitCallbackMap; int BpBinder::sNumTrackedUids = 0; std::atomic_bool BpBinder::sCountByUidEnabled(false); binder_proxy_limit_callback BpBinder::sLimitCallback; @@ -117,12 +118,24 @@ sp<BpBinder> BpBinder::create(int32_t handle) { if (sBinderProxyThrottleCreate) { return nullptr; } + trackedValue = trackedValue & COUNTING_VALUE_MASK; + uint32_t lastLimitCallbackAt = sLastLimitCallbackMap[trackedUid]; + + if (trackedValue > lastLimitCallbackAt && + (trackedValue - lastLimitCallbackAt > sBinderProxyCountHighWatermark)) { + ALOGE("Still too many binder proxy objects sent to uid %d from uid %d (%d proxies " + "held)", + getuid(), trackedUid, trackedValue); + if (sLimitCallback) sLimitCallback(trackedUid); + sLastLimitCallbackMap[trackedUid] = trackedValue; + } } else { if ((trackedValue & COUNTING_VALUE_MASK) >= sBinderProxyCountHighWatermark) { ALOGE("Too many binder proxy objects sent to uid %d from uid %d (%d proxies held)", getuid(), trackedUid, trackedValue); sTrackingMap[trackedUid] |= LIMIT_REACHED_MASK; if (sLimitCallback) sLimitCallback(trackedUid); + sLastLimitCallbackMap[trackedUid] = trackedValue & COUNTING_VALUE_MASK; if (sBinderProxyThrottleCreate) { ALOGI("Throttling binder proxy creates from uid %d in uid %d until binder proxy" " count drops below %d", @@ -452,8 +465,9 @@ BpBinder::~BpBinder() ((trackedValue & COUNTING_VALUE_MASK) <= sBinderProxyCountLowWatermark) )) { ALOGI("Limit reached bit reset for uid %d (fewer than %d proxies from uid %d held)", - getuid(), mTrackedUid, sBinderProxyCountLowWatermark); + getuid(), sBinderProxyCountLowWatermark, mTrackedUid); sTrackingMap[mTrackedUid] &= ~LIMIT_REACHED_MASK; + sLastLimitCallbackMap.erase(mTrackedUid); } if (--sTrackingMap[mTrackedUid] == 0) { sTrackingMap.erase(mTrackedUid); |