Use rate-limited debug messages where userspace can trigger
excessive log spams.

Acked-by: Arve Hjønnevåg <a...@android.com>
Signed-off-by: Sherry Yang <sher...@android.com>
---
v2: rebase onto char-misc-next to resolve include order
difference from master

 drivers/android/binder.c       |  5 +++--
 drivers/android/binder_alloc.c | 41 +++++++++++++++++++++-------------
 2 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 1cc2fa16af8b..d58763b6b009 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -70,6 +70,7 @@
 #include <linux/pid_namespace.h>
 #include <linux/security.h>
 #include <linux/spinlock.h>
+#include <linux/ratelimit.h>
 
 #include <uapi/linux/android/binder.h>
 
@@ -163,13 +164,13 @@ module_param_call(stop_on_user_error, 
binder_set_stop_on_user_error,
 #define binder_debug(mask, x...) \
        do { \
                if (binder_debug_mask & mask) \
-                       pr_info(x); \
+                       pr_info_ratelimited(x); \
        } while (0)
 
 #define binder_user_error(x...) \
        do { \
                if (binder_debug_mask & BINDER_DEBUG_USER_ERROR) \
-                       pr_info(x); \
+                       pr_info_ratelimited(x); \
                if (binder_stop_on_user_error) \
                        binder_stop_on_user_error = 2; \
        } while (0)
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
index 2c258dcf9d72..3f3b7b253445 100644
--- a/drivers/android/binder_alloc.c
+++ b/drivers/android/binder_alloc.c
@@ -27,6 +27,7 @@
 #include <linux/slab.h>
 #include <linux/sched.h>
 #include <linux/list_lru.h>
+#include <linux/ratelimit.h>
 #include <asm/cacheflush.h>
 #include "binder_alloc.h"
 #include "binder_trace.h"
@@ -36,11 +37,12 @@ struct list_lru binder_alloc_lru;
 static DEFINE_MUTEX(binder_alloc_mmap_lock);
 
 enum {
+       BINDER_DEBUG_USER_ERROR             = 1U << 0,
        BINDER_DEBUG_OPEN_CLOSE             = 1U << 1,
        BINDER_DEBUG_BUFFER_ALLOC           = 1U << 2,
        BINDER_DEBUG_BUFFER_ALLOC_ASYNC     = 1U << 3,
 };
-static uint32_t binder_alloc_debug_mask;
+static uint32_t binder_alloc_debug_mask = BINDER_DEBUG_USER_ERROR;
 
 module_param_named(debug_mask, binder_alloc_debug_mask,
                   uint, 0644);
@@ -48,7 +50,7 @@ module_param_named(debug_mask, binder_alloc_debug_mask,
 #define binder_alloc_debug(mask, x...) \
        do { \
                if (binder_alloc_debug_mask & mask) \
-                       pr_info(x); \
+                       pr_info_ratelimited(x); \
        } while (0)
 
 static struct binder_buffer *binder_buffer_next(struct binder_buffer *buffer)
@@ -152,8 +154,10 @@ static struct binder_buffer 
*binder_alloc_prepare_to_free_locked(
                         * free the buffer twice
                         */
                        if (buffer->free_in_progress) {
-                               pr_err("%d:%d FREE_BUFFER u%016llx user freed 
buffer twice\n",
-                                      alloc->pid, current->pid, (u64)user_ptr);
+                               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                                                  "%d:%d FREE_BUFFER u%016llx 
user freed buffer twice\n",
+                                                  alloc->pid, current->pid,
+                                                  (u64)user_ptr);
                                return NULL;
                        }
                        buffer->free_in_progress = 1;
@@ -224,8 +228,9 @@ static int binder_update_page_range(struct binder_alloc 
*alloc, int allocate,
        }
 
        if (!vma && need_mm) {
-               pr_err("%d: binder_alloc_buf failed to map pages in userspace, 
no vma\n",
-                       alloc->pid);
+               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                                  "%d: binder_alloc_buf failed to map pages in 
userspace, no vma\n",
+                                  alloc->pid);
                goto err_no_vma;
        }
 
@@ -344,8 +349,9 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
        int ret;
 
        if (alloc->vma == NULL) {
-               pr_err("%d: binder_alloc_buf, no vma\n",
-                      alloc->pid);
+               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                                  "%d: binder_alloc_buf, no vma\n",
+                                  alloc->pid);
                return ERR_PTR(-ESRCH);
        }
 
@@ -417,11 +423,14 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
                        if (buffer_size > largest_free_size)
                                largest_free_size = buffer_size;
                }
-               pr_err("%d: binder_alloc_buf size %zd failed, no address 
space\n",
-                       alloc->pid, size);
-               pr_err("allocated: %zd (num: %zd largest: %zd), free: %zd (num: 
%zd largest: %zd)\n",
-                      total_alloc_size, allocated_buffers, largest_alloc_size,
-                      total_free_size, free_buffers, largest_free_size);
+               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                                  "%d: binder_alloc_buf size %zd failed, no 
address space\n",
+                                  alloc->pid, size);
+               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                                  "allocated: %zd (num: %zd largest: %zd), 
free: %zd (num: %zd largest: %zd)\n",
+                                  total_alloc_size, allocated_buffers,
+                                  largest_alloc_size, total_free_size,
+                                  free_buffers, largest_free_size);
                return ERR_PTR(-ENOSPC);
        }
        if (n == NULL) {
@@ -731,8 +740,10 @@ int binder_alloc_mmap_handler(struct binder_alloc *alloc,
 err_get_vm_area_failed:
 err_already_mapped:
        mutex_unlock(&binder_alloc_mmap_lock);
-       pr_err("%s: %d %lx-%lx %s failed %d\n", __func__,
-              alloc->pid, vma->vm_start, vma->vm_end, failure_string, ret);
+       binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                          "%s: %d %lx-%lx %s failed %d\n", __func__,
+                          alloc->pid, vma->vm_start, vma->vm_end,
+                          failure_string, ret);
        return ret;
 }
 
-- 
2.18.0.597.ga71716f1ad-goog

Reply via email to