diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index c649c00bcbfa..ac6b68aaea09 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c @@ -383,6 +383,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked( void __user *end_page_addr; size_t size, data_offsets_size; int ret; + bool should_fail = false; /* Check binder_alloc is fully initialized */ if (!binder_alloc_get_vma(alloc)) { @@ -409,6 +410,13 @@ static struct binder_buffer *binder_alloc_new_buf_locked( return ERR_PTR(-EINVAL); } trace_android_vh_binder_alloc_new_buf_locked(size, &alloc->free_async_space, is_async); + trace_android_vh_binder_detect_low_async_space_locked(is_async, &alloc->free_async_space, pid, &should_fail); + if (should_fail) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd failed, not allowed to alloc more async space\n", + alloc->pid, size); + return ERR_PTR(-EPERM); + } if (is_async && alloc->free_async_space < size + sizeof(struct binder_buffer)) { binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 3b50cf94742b..98ef19a76bb9 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -375,3 +375,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_ioctl_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_looper_exited); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_spawn_new_thread); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_has_special_work_ilocked); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_detect_low_async_space_locked); diff --git a/include/trace/hooks/binder.h b/include/trace/hooks/binder.h index 1a1d051fb079..b895f23f8cf7 100644 --- a/include/trace/hooks/binder.h +++ b/include/trace/hooks/binder.h @@ -82,6 +82,10 @@ DECLARE_HOOK(android_vh_binder_select_special_worklist, DECLARE_HOOK(android_vh_binder_alloc_new_buf_locked, TP_PROTO(size_t size, size_t *free_async_space, int is_async), TP_ARGS(size, free_async_space, is_async)); + +DECLARE_HOOK(android_vh_binder_detect_low_async_space_locked, + TP_PROTO(int is_async, size_t *free_async_space, int pid, bool *should_fail), + TP_ARGS(is_async, free_async_space, pid, should_fail)); struct binder_transaction_data; DECLARE_HOOK(android_vh_binder_reply, TP_PROTO(struct binder_proc *target_proc, struct binder_proc *proc,