Merge branch 'for-5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
[linux-2.6-microblaze.git] / drivers / android / binder_alloc.c
index 7caf74a..340515f 100644 (file)
@@ -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;