mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 07:51:31 -04:00
rust_binder: add wait_for_work tracepoint
Add the Rust Binder `wait_for_work` tracepoint declaration and wire it into the thread read path before selecting the work source. Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc> Link: https://patch.msgid.link/20260317-rust-binder-trace-v3-3-6fae4fbcf637@sdhn.cc Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
be3953bb26
commit
2335167a61
@@ -51,6 +51,24 @@ DEFINE_RBINDER_FUNCTION_RETURN_EVENT(binder_ioctl_done);
|
||||
DEFINE_RBINDER_FUNCTION_RETURN_EVENT(binder_read_done);
|
||||
DEFINE_RBINDER_FUNCTION_RETURN_EVENT(binder_write_done);
|
||||
|
||||
TRACE_EVENT(binder_wait_for_work,
|
||||
TP_PROTO(bool proc_work, bool transaction_stack, bool thread_todo),
|
||||
TP_ARGS(proc_work, transaction_stack, thread_todo),
|
||||
TP_STRUCT__entry(
|
||||
__field(bool, proc_work)
|
||||
__field(bool, transaction_stack)
|
||||
__field(bool, thread_todo)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->proc_work = proc_work;
|
||||
__entry->transaction_stack = transaction_stack;
|
||||
__entry->thread_todo = thread_todo;
|
||||
),
|
||||
TP_printk("proc_work=%d transaction_stack=%d thread_todo=%d",
|
||||
__entry->proc_work, __entry->transaction_stack,
|
||||
__entry->thread_todo)
|
||||
);
|
||||
|
||||
TRACE_EVENT(binder_transaction,
|
||||
TP_PROTO(bool reply, rust_binder_transaction t, struct task_struct *thread),
|
||||
TP_ARGS(reply, t, thread),
|
||||
|
||||
@@ -1437,11 +1437,18 @@ fn read(self: &Arc<Self>, req: &mut BinderWriteRead, wait: bool) -> Result {
|
||||
UserSlice::new(UserPtr::from_addr(read_start as _), read_len as _).writer(),
|
||||
self,
|
||||
);
|
||||
let (in_pool, use_proc_queue) = {
|
||||
let (in_pool, has_transaction, thread_todo, use_proc_queue) = {
|
||||
let inner = self.inner.lock();
|
||||
(inner.is_looper(), inner.should_use_process_work_queue())
|
||||
(
|
||||
inner.is_looper(),
|
||||
inner.current_transaction.is_some(),
|
||||
!inner.work_list.is_empty(),
|
||||
inner.should_use_process_work_queue(),
|
||||
)
|
||||
};
|
||||
|
||||
crate::trace::trace_wait_for_work(use_proc_queue, has_transaction, thread_todo);
|
||||
|
||||
let getter = if use_proc_queue {
|
||||
Self::get_work
|
||||
} else {
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
unsafe fn binder_ioctl_done(ret: c_int);
|
||||
unsafe fn binder_read_done(ret: c_int);
|
||||
unsafe fn binder_write_done(ret: c_int);
|
||||
unsafe fn binder_wait_for_work(proc_work: bool, transaction_stack: bool, thread_todo: bool);
|
||||
unsafe fn binder_transaction(reply: bool, t: rust_binder_transaction, thread: *mut task_struct);
|
||||
}
|
||||
|
||||
@@ -53,6 +54,12 @@ pub(crate) fn trace_write_done(ret: Result) {
|
||||
unsafe { binder_write_done(to_errno(ret)) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn trace_wait_for_work(proc_work: bool, transaction_stack: bool, thread_todo: bool) {
|
||||
// SAFETY: Always safe to call.
|
||||
unsafe { binder_wait_for_work(proc_work, transaction_stack, thread_todo) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn trace_transaction(reply: bool, t: &Transaction, thread: Option<&Task>) {
|
||||
let thread = match thread {
|
||||
|
||||
Reference in New Issue
Block a user