mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-03-03 18:28:01 +01:00
This patch adds the binder_transaction tracepoint to Rust Binder. This was chosen as the next tracepoint to add as it is the most complex tracepoint. (And it's also an important tracepoint known to perfetto.) Signed-off-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20251203-binder-trace1-v1-2-22d3ffddb44e@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
38 lines
1.1 KiB
Rust
38 lines
1.1 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
// Copyright (C) 2025 Google LLC.
|
|
|
|
use crate::transaction::Transaction;
|
|
|
|
use kernel::bindings::{rust_binder_transaction, task_struct};
|
|
use kernel::ffi::{c_uint, c_ulong};
|
|
use kernel::task::Task;
|
|
use kernel::tracepoint::declare_trace;
|
|
|
|
declare_trace! {
|
|
unsafe fn rust_binder_ioctl(cmd: c_uint, arg: c_ulong);
|
|
unsafe fn rust_binder_transaction(reply: bool, t: rust_binder_transaction, thread: *mut task_struct);
|
|
}
|
|
|
|
#[inline]
|
|
fn raw_transaction(t: &Transaction) -> rust_binder_transaction {
|
|
t as *const Transaction as rust_binder_transaction
|
|
}
|
|
|
|
#[inline]
|
|
pub(crate) fn trace_ioctl(cmd: u32, arg: usize) {
|
|
// SAFETY: Always safe to call.
|
|
unsafe { rust_binder_ioctl(cmd, arg as c_ulong) }
|
|
}
|
|
|
|
#[inline]
|
|
pub(crate) fn trace_transaction(reply: bool, t: &Transaction, thread: Option<&Task>) {
|
|
let thread = match thread {
|
|
Some(thread) => thread.as_ptr(),
|
|
None => core::ptr::null_mut(),
|
|
};
|
|
// SAFETY: The raw transaction is valid for the duration of this call. The thread pointer is
|
|
// valid or null.
|
|
unsafe { rust_binder_transaction(reply, raw_transaction(t), thread) }
|
|
}
|