[PATCH 3/3] rust_binder: use SetOnce::try_get_or_populate()
From: Alice Ryhl
Date: Wed Jul 22 2026 - 05:20:29 EST
Since this method has just been added, use it instead of open coding the
loop. This also has the side effect of dropping the PollCondVarBox
outside of the node_refs lock when two threads initialize it in
parallel.
Suggested-by: Boqun Feng <boqun@xxxxxxxxxx>
Link: https://lore.kernel.org/all/alJHCkMIcnXYPNoJ@tardis.local/
Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
---
drivers/android/binder/process.rs | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/drivers/android/binder/process.rs b/drivers/android/binder/process.rs
index d486bf7c0b8a..5f8779badd3d 100644
--- a/drivers/android/binder/process.rs
+++ b/drivers/android/binder/process.rs
@@ -1793,21 +1793,12 @@ pub(crate) fn poll(
table: PollTable<'_>,
) -> Result<u32> {
let thread = this.get_current_thread()?;
- {
- let poll = loop {
- if let Some(poll) = this.poll.as_ref() {
- break poll;
- }
- let poll = PollCondVarBox::new(c"Process::poll", kernel::static_lock_class!())?;
- // Reuse our existing lock to synchronize callers initializing.
- let guard = this.node_refs.lock();
- let _ret = this.poll.populate(poll);
- drop(guard);
- };
+ let poll = this.poll.try_get_or_populate(&this.node_refs, || {
+ PollCondVarBox::new(c"Process::poll", kernel::static_lock_class!())
+ })?;
+ table.register_wait(file, poll);
- table.register_wait(file, poll);
- }
let (from_proc, mut mask) = thread.poll()?;
if mask == 0 && from_proc && !this.inner.lock().work.is_empty() {
mask |= bindings::POLLIN;
--
2.55.0.229.g6434b31f56-goog