android: binder: Rate-limit debug and userspace triggered err msgs
Use rate-limited debug messages where userspace can trigger excessive log spams. Acked-by: Arve Hjønnevåg <arve@android.com> Signed-off-by: Sherry Yang <sherryy@android.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6d33b3069e
commit
128f380410
|
@ -70,6 +70,7 @@
|
||||||
#include <linux/pid_namespace.h>
|
#include <linux/pid_namespace.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
|
|
||||||
#include <uapi/linux/android/binder.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...) \
|
#define binder_debug(mask, x...) \
|
||||||
do { \
|
do { \
|
||||||
if (binder_debug_mask & mask) \
|
if (binder_debug_mask & mask) \
|
||||||
pr_info(x); \
|
pr_info_ratelimited(x); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define binder_user_error(x...) \
|
#define binder_user_error(x...) \
|
||||||
do { \
|
do { \
|
||||||
if (binder_debug_mask & BINDER_DEBUG_USER_ERROR) \
|
if (binder_debug_mask & BINDER_DEBUG_USER_ERROR) \
|
||||||
pr_info(x); \
|
pr_info_ratelimited(x); \
|
||||||
if (binder_stop_on_user_error) \
|
if (binder_stop_on_user_error) \
|
||||||
binder_stop_on_user_error = 2; \
|
binder_stop_on_user_error = 2; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/list_lru.h>
|
#include <linux/list_lru.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include "binder_alloc.h"
|
#include "binder_alloc.h"
|
||||||
#include "binder_trace.h"
|
#include "binder_trace.h"
|
||||||
|
@ -36,11 +37,12 @@ struct list_lru binder_alloc_lru;
|
||||||
static DEFINE_MUTEX(binder_alloc_mmap_lock);
|
static DEFINE_MUTEX(binder_alloc_mmap_lock);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
BINDER_DEBUG_USER_ERROR = 1U << 0,
|
||||||
BINDER_DEBUG_OPEN_CLOSE = 1U << 1,
|
BINDER_DEBUG_OPEN_CLOSE = 1U << 1,
|
||||||
BINDER_DEBUG_BUFFER_ALLOC = 1U << 2,
|
BINDER_DEBUG_BUFFER_ALLOC = 1U << 2,
|
||||||
BINDER_DEBUG_BUFFER_ALLOC_ASYNC = 1U << 3,
|
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,
|
module_param_named(debug_mask, binder_alloc_debug_mask,
|
||||||
uint, 0644);
|
uint, 0644);
|
||||||
|
@ -48,7 +50,7 @@ module_param_named(debug_mask, binder_alloc_debug_mask,
|
||||||
#define binder_alloc_debug(mask, x...) \
|
#define binder_alloc_debug(mask, x...) \
|
||||||
do { \
|
do { \
|
||||||
if (binder_alloc_debug_mask & mask) \
|
if (binder_alloc_debug_mask & mask) \
|
||||||
pr_info(x); \
|
pr_info_ratelimited(x); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static struct binder_buffer *binder_buffer_next(struct binder_buffer *buffer)
|
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
|
* free the buffer twice
|
||||||
*/
|
*/
|
||||||
if (buffer->free_in_progress) {
|
if (buffer->free_in_progress) {
|
||||||
pr_err("%d:%d FREE_BUFFER u%016llx user freed buffer twice\n",
|
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||||
alloc->pid, current->pid, (u64)user_ptr);
|
"%d:%d FREE_BUFFER u%016llx user freed buffer twice\n",
|
||||||
|
alloc->pid, current->pid,
|
||||||
|
(u64)user_ptr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
buffer->free_in_progress = 1;
|
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) {
|
if (!vma && need_mm) {
|
||||||
pr_err("%d: binder_alloc_buf failed to map pages in userspace, no vma\n",
|
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||||
alloc->pid);
|
"%d: binder_alloc_buf failed to map pages in userspace, no vma\n",
|
||||||
|
alloc->pid);
|
||||||
goto err_no_vma;
|
goto err_no_vma;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,8 +349,9 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (alloc->vma == NULL) {
|
if (alloc->vma == NULL) {
|
||||||
pr_err("%d: binder_alloc_buf, no vma\n",
|
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||||
alloc->pid);
|
"%d: binder_alloc_buf, no vma\n",
|
||||||
|
alloc->pid);
|
||||||
return ERR_PTR(-ESRCH);
|
return ERR_PTR(-ESRCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,11 +423,14 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
|
||||||
if (buffer_size > largest_free_size)
|
if (buffer_size > largest_free_size)
|
||||||
largest_free_size = buffer_size;
|
largest_free_size = buffer_size;
|
||||||
}
|
}
|
||||||
pr_err("%d: binder_alloc_buf size %zd failed, no address space\n",
|
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||||
alloc->pid, size);
|
"%d: binder_alloc_buf size %zd failed, no address space\n",
|
||||||
pr_err("allocated: %zd (num: %zd largest: %zd), free: %zd (num: %zd largest: %zd)\n",
|
alloc->pid, size);
|
||||||
total_alloc_size, allocated_buffers, largest_alloc_size,
|
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||||
total_free_size, free_buffers, largest_free_size);
|
"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);
|
return ERR_PTR(-ENOSPC);
|
||||||
}
|
}
|
||||||
if (n == NULL) {
|
if (n == NULL) {
|
||||||
|
@ -731,8 +740,10 @@ err_alloc_pages_failed:
|
||||||
err_get_vm_area_failed:
|
err_get_vm_area_failed:
|
||||||
err_already_mapped:
|
err_already_mapped:
|
||||||
mutex_unlock(&binder_alloc_mmap_lock);
|
mutex_unlock(&binder_alloc_mmap_lock);
|
||||||
pr_err("%s: %d %lx-%lx %s failed %d\n", __func__,
|
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||||
alloc->pid, vma->vm_start, vma->vm_end, failure_string, ret);
|
"%s: %d %lx-%lx %s failed %d\n", __func__,
|
||||||
|
alloc->pid, vma->vm_start, vma->vm_end,
|
||||||
|
failure_string, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue