From 56e0cf4e396b2bafd2758360495a5daf3372d014 Mon Sep 17 00:00:00 2001 From: Fuchun Liao Date: Wed, 21 Feb 2024 10:21:26 +0800 Subject: [PATCH] ANDROID: binder: Add vendor hook to fix priority restore When cpu loading is high, the task maybe preempted after restoring the sched priority in trace_android_vh_binder_free_buf(). This means that node->has_async_transaction can't be cleared immediately and the work isn't added to the proc->todo queue as soon as possible. To fix this we add a new hook trace_android_vh_binder_buffer_release() to restore the priority after node->has_async_transaction has been updated and the node->work has been added to the proc->todo queue. Note: the old trace_android_vh_binder_free_buf() hook is kept to avoid breaking KMI but is not extrictly needed. Bug: 327307900 Fixes: 0eb66ec39ca8 ("ANDROID: vendor_hooks: Add hooks for binder") Change-Id: I8126c79c9c68faa3ce0cd87ce83e2591bd61d5dd Signed-off-by: Fuchun Liao [cmllamas: fix-up commit log and variable naming] Signed-off-by: Carlos Llamas --- drivers/android/binder.c | 4 ++++ drivers/android/vendor_hooks.c | 1 + include/trace/hooks/binder.h | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/drivers/android/binder.c b/drivers/android/binder.c index d36caa9fd6e7..cc6c9ceca866 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -3989,12 +3989,14 @@ binder_free_buf(struct binder_proc *proc, struct binder_buffer *buffer, bool is_failure) { bool enqueue_task = true; + bool has_transaction = false; trace_android_vh_binder_free_buf(proc, thread, buffer); binder_inner_proc_lock(proc); if (buffer->transaction) { buffer->transaction->buffer = NULL; buffer->transaction = NULL; + has_transaction = true; } binder_inner_proc_unlock(proc); if (buffer->async_transaction && buffer->target_node) { @@ -4018,6 +4020,8 @@ binder_free_buf(struct binder_proc *proc, } binder_node_inner_unlock(buf_node); } + trace_android_vh_binder_buffer_release(proc, thread, buffer, + has_transaction); trace_binder_transaction_buffer_release(buffer); binder_release_entire_buffer(proc, thread, buffer, is_failure); binder_alloc_free_buf(&proc->alloc, buffer); diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 19f96411720a..a11e37bcfb88 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -353,6 +353,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_received); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_oem_binder_struct); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_special_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_free_buf); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_buffer_release); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_try_to_compact_pages_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_alloc_pages_direct_reclaim_enter); diff --git a/include/trace/hooks/binder.h b/include/trace/hooks/binder.h index b895f23f8cf7..e67cfc5fee1b 100644 --- a/include/trace/hooks/binder.h +++ b/include/trace/hooks/binder.h @@ -126,6 +126,10 @@ DECLARE_HOOK(android_vh_binder_free_buf, TP_PROTO(struct binder_proc *proc, struct binder_thread *thread, struct binder_buffer *buffer), TP_ARGS(proc, thread, buffer)); +DECLARE_HOOK(android_vh_binder_buffer_release, + TP_PROTO(struct binder_proc *proc, struct binder_thread *thread, + struct binder_buffer *buffer, bool has_transaction), + TP_ARGS(proc, thread, buffer, has_transaction)); DECLARE_HOOK(android_vh_binder_ioctl_end, TP_PROTO(struct task_struct *caller_task,