diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2026-10-05 09:34:50 +0200 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2026-10-05 09:34:50 +0200 |
| commit | d47322a612daf8e97b2e5e4dbbabdff27080c1ec (patch) | |
| tree | d4b647004679f55fb95873efb8611f2233918d6d /drivers/android/binder/node/wrapper.rs | |
| parent | 3d1986a982041b18ea604302bca22b9fb5dc4cbb (diff) | |
| parent | a90ee4305c4a5df72c11b31dacfdc76e00fcf78a (diff) | |
Merge 7.3-rc6 into char-misc-next
This resolves a number of merge conflicts between the branches, and we
pick up the fixes in 7.3-rc6 that we need for testing.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/android/binder/node/wrapper.rs')
| -rw-r--r-- | drivers/android/binder/node/wrapper.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/android/binder/node/wrapper.rs b/drivers/android/binder/node/wrapper.rs index 02085beb6fab..edfbccf6e6da 100644 --- a/drivers/android/binder/node/wrapper.rs +++ b/drivers/android/binder/node/wrapper.rs @@ -55,7 +55,39 @@ impl DeliverToRead for NodeWrapper { node.do_work_locked(writer, owner_inner) } - fn cancel(self: DArc<Self>) {} + fn cancel(self: DArc<Self>) { + let _drop_outside_lock; + let node = &self.node; + let mut owner_inner = node.owner.inner.lock(); + + // We only do something on BINDER_THREAD_EXIT, not process exit. + if owner_inner.is_dead { + return; + } + + // We transfer the responsibility of the node refcount update to the scheduled Node because + // NodeWrapper has no way to re-create the ListArc. + let inner = node.inner.access_mut(&mut owner_inner); + + let ds = &mut inner.delivery_state; + assert!(ds.has_pushed_wrapper); + assert!(ds.has_strong_zero2one); + ds.has_pushed_wrapper = false; + + // We are changing the state to one where the Node is the strong zero2one update instead of + // the wrapper. + ds.has_weak_zero2one = false; + + if !ds.has_pushed_node { + if let Some(node2) = ListArc::try_from_arc_borrow(node.as_arc_borrow()) { + ds.has_pushed_node = true; + _drop_outside_lock = owner_inner.push_work(&node.owner, node2); + } else { + // This can't actually happen. + ds.has_strong_zero2one = false; + } + } + } fn should_sync_wakeup(&self) -> bool { false |
