# Meeting 2023-06-28 <!-- Leave your topic starting with ### in the relevant sections below --> ## Critical <!-- bugs, soundness issues, urgent patches/reviews etc. --> ## Status Reports <!-- You want to report on something you are working on/request reviews. Or you want to know the status of something someone else is doing --> ### Kangrejos Miguel is looking at still organizing it around September 14-17. ## Discussion Questions <!-- Anything that requires lengthy discussion/more general questions also fit here --> ### u32 overflows In [this review](https://lore.kernel.org/rust-for-linux/udHI3v-OLUqHQt3fwnH71QuRJjzGxexw2rkIYEfnsChCmrLoJTIL_GL1wLCARf-UotY51jkPT6tC8nVDvjf8LkY2zvddpgeRQ5owysZwJos=@proton.me/) I noted at the end that "What if `data.len() > u32::MAX`?". What should be done in this case? Do we want to error? Or write `u32::MAX` bytes? Or call the C side repeatedly? Consensus: Ask C maintainers what to do. ### `pin-init` chain functions Lina [suggested](https://rust-for-linux.zulipchat.com/#narrow/stream/367382-Asahi-Meeting/topic/pin_init.20rebase.20and.20test/near/359664612) to have `chain` and `pin_chain` functions: ```rust pub trait PinInit<T, E> { // ... fn pin_chain(self, f: impl FnOnce(Pin<&mut T>) -> Result<(), E>) -> impl PinInit<T, E>; } ``` It first initializes the value and then calls the closure. I think it would be a good idea, since [others](https://lore.kernel.org/rust-for-linux/20230625121657.3631109-2-changxian.cqs@antgroup.com/) seem to require it as well. But for the function above to compile we need [`feature(return_position_impl_trait_in_trait)`](https://github.com/rust-lang/rust/issues/91611), do we want to add that? Otherwise it could be standalone functions, but they do not look as nice. Boqun [said](https://rust-for-linux.zulipchat.com/#narrow/stream/367382-Asahi-Meeting/topic/pin_init.20rebase.20and.20test/near/366369034) that it could get stabilized soon-ish. Consensus: use concrete `PinChain` type. ### Make `Opaque` `!Unpin`? In [this](https://lore.kernel.org/rust-for-linux/20230625121657.3631109-2-changxian.cqs@antgroup.com/) patch I saw someone forgetting to write ```rust #[pin] _pin: PhantomPinned, ``` But they had a ```rust #[pin] opaque: Opaque<bindings::..>, ``` So should we make `Opaque` `!Unpin`? Consensus: Yes! ### [XArray](https://rust-for-linux.zulipchat.com/#narrow/stream/288089-General/topic/xarray.20bindings) #### Locking in `get` Lina's [original patch](https://lore.kernel.org/rust-for-linux/20230224-rust-xarray-v3-1-04305b1173a5@asahilina.net/) takes xarray's internal `xa_lock`, and "users are expected to use an inner type that can be efficiently cloned (such as Arc<T>), and eagerly clone and drop the guard to unblock other users after a lookup." - Should we instead have `pub fn get(&self) -> Option<&T> where T: Clone { ... }`? Whereby we would take the lock, clone the value, then release the lock and return the cloned value? This means that the caller does not have to worry about the `Guard`, and there is no risk of deadlock when you call `get` twice. - Consensus: this one makes sense - There could be another variant of `get` that does not require `Clone` and gives you access to the value for the duration of a closure, with `xa_lock` held during that closure. - Consensus: this one makes sense - There could be yet another variant `pub fn get_mut(&mut self) -> Option<&mut T>`, that would take and release the internal lock (due to how xarray is designed), but would not need the the clone, since the mutable reference should already be exclusive. - Consensus: it's possible we should have a separate abstraction for users that want mutable access #### Use in Binder (vs. RBTree) We're interested in `XArray` because [RBTree is deprecated](https://rust-for-linux.zulipchat.com/#narrow/stream/288089-General/topic/Red.2Fblack.20tree.20deprecation), but there isn't a natural replacement for one proposed usage of `RBTree` [here](https://android-review.googlesource.com/c/kernel/common/+/2567935/14/drivers/android/range_alloc.rs#12). We need to look up the smallest `T` equal to or greater than a given `size` (where `size` is a field in `T`). The problem is there could be multiple `T`'s of the same size, so we used a tuple `(size, offset)` as the key in an `RBTree`, since each `T` has a unique field `offset` (which, incidentally, is used as the key in another "map"). `RBTree` supported custom keys. Since `XArray` only supports integer keys, we need to do something more complicated, e.g. have it point at just one of the elements of that size, and have `prev_same_size` and `next_same_size` fields in the values. This gets rather complicated. ...thoughts? - Consensus: we (matt g) will draft an email to the mailing list asking what to do if we can't use `RBTree`. ## Miscellaneous <!-- stuff that does not fit into other categories --> ### rust: bindgen: upgrade to 0.65.1 @Miguel, do you plan to take it for v6.6? Miguel: yeah (and the Rust 1.70.0 upgrade too).