diff options
author | Michael Wachenschwanz <mwachens@google.com> | 2018-05-15 15:03:57 -0700 |
---|---|---|
committer | Michael Wachenschwanz <mwachens@google.com> | 2018-05-23 17:43:16 -0700 |
commit | 74d967a817dd3c84fb8ca043c7d80b566586fb69 (patch) | |
tree | ae90b796599d607d83fcec15dba527c961d98e3f | |
parent | 79ab72151d9622a2b92c55767a6e652de14c4c87 (diff) | |
download | native-74d967a817dd3c84fb8ca043c7d80b566586fb69.tar.gz |
Log Binder Proxy Limit reached only once
Bug: 79578081
Test: bit FrameworksCoreTests:android.os.BinderProxyCountingTest
Change-Id: Ia0d4148d5d9d5b57fe69b86b280fbeb7e68dca2a
-rw-r--r-- | libs/binder/BpBinder.cpp | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp index 289433b0bd..a58168f73e 100644 --- a/libs/binder/BpBinder.cpp +++ b/libs/binder/BpBinder.cpp @@ -46,7 +46,7 @@ uint32_t BpBinder::sBinderProxyCountHighWatermark = 2500; uint32_t BpBinder::sBinderProxyCountLowWatermark = 2000; enum { - CALLBACK_TRIGGERED_MASK = 0x80000000, // A flag denoting that the callback has been called + LIMIT_REACHED_MASK = 0x80000000, // A flag denoting that the limit has been reached COUNTING_VALUE_MASK = 0x7FFFFFFF, // A mask of the remaining bits for the count value }; @@ -109,35 +109,30 @@ void BpBinder::ObjectManager::kill() BpBinder* BpBinder::create(int32_t handle) { int32_t trackedUid = -1; if (sCountByUidEnabled) { - BpBinder* out; trackedUid = IPCThreadState::self()->getCallingUid(); AutoMutex _l(sTrackingLock); - if ((sTrackingMap[trackedUid] & COUNTING_VALUE_MASK) >= sBinderProxyCountHighWatermark) { - ALOGE("Too many binder proxy objects sent to uid %d from uid %d (over %d proxies held)", - getuid(), trackedUid, sBinderProxyCountHighWatermark); - + uint32_t trackedValue = sTrackingMap[trackedUid]; + if (CC_UNLIKELY(trackedValue & LIMIT_REACHED_MASK)) { if (sBinderProxyThrottleCreate) { - ALOGE("Returning Null Binder Proxy Object to uid %d", trackedUid); - out = nullptr; - } else { - // increment and construct here in case callback has an async kill causing a race - sTrackingMap[trackedUid]++; - out = new BpBinder(handle, trackedUid); - } - - if (sLimitCallback && !(sTrackingMap[trackedUid] & CALLBACK_TRIGGERED_MASK)) { - sTrackingMap[trackedUid] |= CALLBACK_TRIGGERED_MASK; - sLimitCallback(trackedUid); + return nullptr; } } else { - sTrackingMap[trackedUid]++; - out = new BpBinder(handle, trackedUid); + 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); + if (sBinderProxyThrottleCreate) { + ALOGI("Throttling binder proxy creates from uid %d in uid %d until binder proxy" + " count drops below %d", + trackedUid, getuid(), sBinderProxyCountLowWatermark); + return nullptr; + } + } } - - return out; - } else { - return new BpBinder(handle, trackedUid); + sTrackingMap[trackedUid]++; } + return new BpBinder(handle, trackedUid); } BpBinder::BpBinder(int32_t handle, int32_t trackedUid) @@ -371,15 +366,17 @@ BpBinder::~BpBinder() if (mTrackedUid >= 0) { AutoMutex _l(sTrackingLock); - if (CC_UNLIKELY(sTrackingMap[mTrackedUid] == 0)) { + uint32_t trackedValue = sTrackingMap[mTrackedUid]; + if (CC_UNLIKELY((trackedValue & COUNTING_VALUE_MASK) == 0)) { ALOGE("Unexpected Binder Proxy tracking decrement in %p handle %d\n", this, mHandle); } else { if (CC_UNLIKELY( - (sTrackingMap[mTrackedUid] & CALLBACK_TRIGGERED_MASK) && - ((sTrackingMap[mTrackedUid] & COUNTING_VALUE_MASK) <= sBinderProxyCountLowWatermark) + (trackedValue & LIMIT_REACHED_MASK) && + ((trackedValue & COUNTING_VALUE_MASK) <= sBinderProxyCountLowWatermark) )) { - // Clear the Callback Triggered bit when crossing below the low watermark - sTrackingMap[mTrackedUid] &= ~CALLBACK_TRIGGERED_MASK; + ALOGI("Limit reached bit reset for uid %d (fewer than %d proxies from uid %d held)", + getuid(), mTrackedUid, sBinderProxyCountLowWatermark); + sTrackingMap[mTrackedUid] &= ~LIMIT_REACHED_MASK; } if (--sTrackingMap[mTrackedUid] == 0) { sTrackingMap.erase(mTrackedUid); |