diff options
Diffstat (limited to 'drivers/android/binder_alloc.c')
| -rw-r--r-- | drivers/android/binder_alloc.c | 15 | 
1 files changed, 12 insertions, 3 deletions
| diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index 7caf74ad2405..340515f54498 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c @@ -338,7 +338,7 @@ static inline struct vm_area_struct *binder_alloc_get_vma(  	return vma;  } -static void debug_low_async_space_locked(struct binder_alloc *alloc, int pid) +static bool debug_low_async_space_locked(struct binder_alloc *alloc, int pid)  {  	/*  	 * Find the amount and size of buffers allocated by the current caller; @@ -366,13 +366,19 @@ static void debug_low_async_space_locked(struct binder_alloc *alloc, int pid)  	/*  	 * Warn if this pid has more than 50 transactions, or more than 50% of -	 * async space (which is 25% of total buffer size). +	 * async space (which is 25% of total buffer size). Oneway spam is only +	 * detected when the threshold is exceeded.  	 */  	if (num_buffers > 50 || total_alloc_size > alloc->buffer_size / 4) {  		binder_alloc_debug(BINDER_DEBUG_USER_ERROR,  			     "%d: pid %d spamming oneway? %zd buffers allocated for a total size of %zd\n",  			      alloc->pid, pid, num_buffers, total_alloc_size); +		if (!alloc->oneway_spam_detected) { +			alloc->oneway_spam_detected = true; +			return true; +		}  	} +	return false;  }  static struct binder_buffer *binder_alloc_new_buf_locked( @@ -525,6 +531,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked(  	buffer->async_transaction = is_async;  	buffer->extra_buffers_size = extra_buffers_size;  	buffer->pid = pid; +	buffer->oneway_spam_suspect = false;  	if (is_async) {  		alloc->free_async_space -= size + sizeof(struct binder_buffer);  		binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, @@ -536,7 +543,9 @@ static struct binder_buffer *binder_alloc_new_buf_locked(  			 * of async space left (which is less than 10% of total  			 * buffer size).  			 */ -			debug_low_async_space_locked(alloc, pid); +			buffer->oneway_spam_suspect = debug_low_async_space_locked(alloc, pid); +		} else { +			alloc->oneway_spam_detected = false;  		}  	}  	return buffer; | 
