drivers/android/binder/process.rs | 1 + drivers/android/binder/thread.rs | 2 ++ 2 files changed, 3 insertions(+)
Currently ps -A shows processes waiting on schedule() in functions with
names such as do_epoll_wait, wait_woken, and the impeccably named
_RNvMs2_NtCs8QPsHWIn21X_16rust_binder_main6threadNtB5_6Thread8get_work.
To improve how ps output looks, give explicit non-mangled names to the
functions where Rust Binder calls schedule(), since these are the most
likely places to show up on ps output.
The name of rust_binder_waitlcl is truncated instead of using _local
suffix because rust_binder_wait_local is sufficiently long that ps shows
unaligned output.
Suggested-by: Matthew Maurer <mmaurer@google.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
---
drivers/android/binder/process.rs | 1 +
drivers/android/binder/thread.rs | 2 ++
2 files changed, 3 insertions(+)
diff --git a/drivers/android/binder/process.rs b/drivers/android/binder/process.rs
index 132055b4790f0ec69a87635b498909df2bf475e2..cf7425e74183966063ab53114637aec7b3672ac8 100644
--- a/drivers/android/binder/process.rs
+++ b/drivers/android/binder/process.rs
@@ -1436,6 +1436,7 @@ pub(crate) fn drop_outstanding_txn(&self) {
}
}
+ #[export_name = "rust_binder_freeze"]
pub(crate) fn ioctl_freeze(&self, info: &BinderFreezeInfo) -> Result {
if info.enable == 0 {
let msgs = self.prepare_freeze_messages()?;
diff --git a/drivers/android/binder/thread.rs b/drivers/android/binder/thread.rs
index 1f1709a6a77abc1c865cc9387e7ba7493448c71d..2ca8ed8962314b58a3cfeb3ae0aa0ed60f179433 100644
--- a/drivers/android/binder/thread.rs
+++ b/drivers/android/binder/thread.rs
@@ -514,6 +514,7 @@ pub(crate) fn has_current_transaction(&self) -> bool {
/// Attempts to fetch a work item from the thread-local queue. The behaviour if the queue is
/// empty depends on `wait`: if it is true, the function waits for some work to be queued (or a
/// signal); otherwise it returns indicating that none is available.
+ #[export_name = "rust_binder_waitlcl"]
fn get_work_local(self: &Arc<Self>, wait: bool) -> Result<Option<DLArc<dyn DeliverToRead>>> {
{
let mut inner = self.inner.lock();
@@ -552,6 +553,7 @@ fn get_work_local(self: &Arc<Self>, wait: bool) -> Result<Option<DLArc<dyn Deliv
///
/// This must only be called when the thread is not participating in a transaction chain. If it
/// is, the local version (`get_work_local`) should be used instead.
+ #[export_name = "rust_binder_wait"]
fn get_work(self: &Arc<Self>, wait: bool) -> Result<Option<DLArc<dyn DeliverToRead>>> {
// Try to get work from the thread's work queue, using only a local lock.
{
---
base-commit: cee73b1e840c154f64ace682cb477c1ae2e29cc4
change-id: 20260213-rust-binder-ps-46d9d060243a
Best regards,
--
Alice Ryhl <aliceryhl@google.com>
(Sorry Alice, resending as I didn't hit "Reply All". I was travelling
and not on my usual email setup).
On 2026-02-13 11:37, Alice Ryhl wrote:
> Currently ps -A shows processes waiting on schedule() in functions with
> names such as do_epoll_wait, wait_woken, and the impeccably named
> _RNvMs2_NtCs8QPsHWIn21X_16rust_binder_main6threadNtB5_6Thread8get_work.
>
> To improve how ps output looks, give explicit non-mangled names to the
> functions where Rust Binder calls schedule(), since these are the most
> likely places to show up on ps output.
>
> The name of rust_binder_waitlcl is truncated instead of using _local
> suffix because rust_binder_wait_local is sufficiently long that ps
> shows
> unaligned output.
>
> Suggested-by: Matthew Maurer <mmaurer@google.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
I don't think this the direction that we should head for. It's not
feasible to
do this for all users that can possibly call `schedule()`. In edition
2024
forwards, `export_name` is also an unsafe attribute and it will become
tedious to
justify all usages.
I think if the function names are demangled, it won't be too bad?
Best,
Gary
> ---
> drivers/android/binder/process.rs | 1 +
> drivers/android/binder/thread.rs | 2 ++
> 2 files changed, 3 insertions(+)
>
> diff --git a/drivers/android/binder/process.rs
> b/drivers/android/binder/process.rs
> index
> 132055b4790f0ec69a87635b498909df2bf475e2..cf7425e74183966063ab53114637aec7b3672ac8
> 100644
> --- a/drivers/android/binder/process.rs
> +++ b/drivers/android/binder/process.rs
> @@ -1436,6 +1436,7 @@ pub(crate) fn drop_outstanding_txn(&self) {
> }
> }
>
> + #[export_name = "rust_binder_freeze"]
> pub(crate) fn ioctl_freeze(&self, info: &BinderFreezeInfo) ->
> Result {
> if info.enable == 0 {
> let msgs = self.prepare_freeze_messages()?;
> diff --git a/drivers/android/binder/thread.rs
> b/drivers/android/binder/thread.rs
> index
> 1f1709a6a77abc1c865cc9387e7ba7493448c71d..2ca8ed8962314b58a3cfeb3ae0aa0ed60f179433
> 100644
> --- a/drivers/android/binder/thread.rs
> +++ b/drivers/android/binder/thread.rs
> @@ -514,6 +514,7 @@ pub(crate) fn has_current_transaction(&self) ->
> bool {
> /// Attempts to fetch a work item from the thread-local queue. The
> behaviour if the queue is
> /// empty depends on `wait`: if it is true, the function waits for
> some work to be queued (or a
> /// signal); otherwise it returns indicating that none is
> available.
> + #[export_name = "rust_binder_waitlcl"]
> fn get_work_local(self: &Arc<Self>, wait: bool) ->
> Result<Option<DLArc<dyn DeliverToRead>>> {
> {
> let mut inner = self.inner.lock();
> @@ -552,6 +553,7 @@ fn get_work_local(self: &Arc<Self>, wait: bool) ->
> Result<Option<DLArc<dyn Deliv
> ///
> /// This must only be called when the thread is not participating
> in a transaction chain. If it
> /// is, the local version (`get_work_local`) should be used
> instead.
> + #[export_name = "rust_binder_wait"]
> fn get_work(self: &Arc<Self>, wait: bool) ->
> Result<Option<DLArc<dyn DeliverToRead>>> {
> // Try to get work from the thread's work queue, using only a
> local lock.
> {
>
> ---
> base-commit: cee73b1e840c154f64ace682cb477c1ae2e29cc4
> change-id: 20260213-rust-binder-ps-46d9d060243a
>
> Best regards,
On Sat, Feb 14, 2026 at 12:52 AM <gary@garyguo.net> wrote: > > (Sorry Alice, resending as I didn't hit "Reply All". I was travelling > and not on my usual email setup). > > On 2026-02-13 11:37, Alice Ryhl wrote: > > Currently ps -A shows processes waiting on schedule() in functions with > > names such as do_epoll_wait, wait_woken, and the impeccably named > > _RNvMs2_NtCs8QPsHWIn21X_16rust_binder_main6threadNtB5_6Thread8get_work. > > > > To improve how ps output looks, give explicit non-mangled names to the > > functions where Rust Binder calls schedule(), since these are the most > > likely places to show up on ps output. > > > > The name of rust_binder_waitlcl is truncated instead of using _local > > suffix because rust_binder_wait_local is sufficiently long that ps > > shows > > unaligned output. > > > > Suggested-by: Matthew Maurer <mmaurer@google.com> > > Signed-off-by: Alice Ryhl <aliceryhl@google.com> > > I don't think this the direction that we should head for. It's not > feasible to > do this for all users that can possibly call `schedule()`. In edition > 2024 > forwards, `export_name` is also an unsafe attribute and it will become > tedious to > justify all usages. > > I think if the function names are demangled, it won't be too bad? This is mostly meant as a temporary fix. Ideally ps can demangle them. (Though even demangled, they are still too long for ps -A output as it is right now.) Alice
On Sat, Feb 14, 2026 at 1:20 AM Alice Ryhl <aliceryhl@google.com> wrote: > > This is mostly meant as a temporary fix. Ideally ps can demangle them. In that case, could we please write that in the commit message, or even better, add a one-line comment on top of the attributes? Thanks! Cheers, Miguel
© 2016 - 2026 Red Hat, Inc.