xref: /linux/drivers/android/binder/node/wrapper.rs (revision e3966940559d52aa1800a008dcfeec218dd31f88)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 // Copyright (C) 2025 Google LLC.
4 
5 use kernel::{list::ListArc, prelude::*, seq_file::SeqFile, seq_print, sync::UniqueArc};
6 
7 use crate::{node::Node, thread::Thread, BinderReturnWriter, DArc, DLArc, DTRWrap, DeliverToRead};
8 
9 use core::mem::MaybeUninit;
10 
11 pub(crate) struct CritIncrWrapper {
12     inner: UniqueArc<MaybeUninit<DTRWrap<NodeWrapper>>>,
13 }
14 
15 impl CritIncrWrapper {
16     pub(crate) fn new() -> Result<Self> {
17         Ok(CritIncrWrapper {
18             inner: UniqueArc::new_uninit(GFP_KERNEL)?,
19         })
20     }
21 
22     pub(super) fn init(self, node: DArc<Node>) -> DLArc<dyn DeliverToRead> {
23         match self.inner.pin_init_with(DTRWrap::new(NodeWrapper { node })) {
24             Ok(initialized) => ListArc::from(initialized) as _,
25             Err(err) => match err {},
26         }
27     }
28 }
29 
30 struct NodeWrapper {
31     node: DArc<Node>,
32 }
33 
34 kernel::list::impl_list_arc_safe! {
35     impl ListArcSafe<0> for NodeWrapper {
36         untracked;
37     }
38 }
39 
40 impl DeliverToRead for NodeWrapper {
41     fn do_work(
42         self: DArc<Self>,
43         _thread: &Thread,
44         writer: &mut BinderReturnWriter<'_>,
45     ) -> Result<bool> {
46         let node = &self.node;
47         let mut owner_inner = node.owner.inner.lock();
48         let inner = node.inner.access_mut(&mut owner_inner);
49 
50         let ds = &mut inner.delivery_state;
51 
52         assert!(ds.has_pushed_wrapper);
53         assert!(ds.has_strong_zero2one);
54         ds.has_pushed_wrapper = false;
55         ds.has_strong_zero2one = false;
56 
57         node.do_work_locked(writer, owner_inner)
58     }
59 
60     fn cancel(self: DArc<Self>) {}
61 
62     fn should_sync_wakeup(&self) -> bool {
63         false
64     }
65 
66     #[inline(never)]
67     fn debug_print(&self, m: &SeqFile, prefix: &str, _tprefix: &str) -> Result<()> {
68         seq_print!(
69             m,
70             "{}node work {}: u{:016x} c{:016x}\n",
71             prefix,
72             self.node.debug_id,
73             self.node.ptr,
74             self.node.cookie,
75         );
76         Ok(())
77     }
78 }
79