# Meeting 2024-06-26
<!-- 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 -->
## Discussion Questions
<!-- Anything that requires lengthy discussion/more general questions also fit here -->
- Is there any way to get a unique piece of const data that the compiler can't inline? I am trying to figure out how to make this work in rust: https://gitlab.freedesktop.org/lyudess/linux/-/blob/rvkms-rework-kms-reg/rust/kernel/drm/kms/plane.rs?ref_type=heads#L196
## Miscellaneous
<!-- stuff that does not fit into other categories -->
### Change of stewardship of `staging/rust-pci`
Danilo will handle `staging/rust-pci`, we need some admin work on the branch to change permissions.
Miguel to change the github permission, and Danilo to send a PR for the webpage.
### XArray patches status
Quick update: Andreas asked Maíra whether she is OK that Andreas takes over, no response. Andreas will inform Maíra that he will send a new version of the `XArray` patches.
### Allocator API
Brief update & sync
##### Dedicated kernel `Allocator`
- implements own `Allocator` trait and `KBox` / `KVec` types
- treewide replace of `Box<T, A>` with `KBox<T, A>`
- implements `kvec!`, returning `Result<KVec<T, A>, AllocError>` (for the applicable variants)
- TODO: implement `Iterator` for `KVec`
- https://gitlab.freedesktop.org/drm/nova/-/commits/topic/allocator
##### Extending Rust `allocator_api`
- old approach for comparison
- https://gitlab.freedesktop.org/drm/nova/-/commits/topic/allocator_api
* Motivation is to get rid of default flags and have all APIs take a flag.
* Also avoid extension traits and feature flags.
* Should we have completely custom Box and stop using alloc.
* Benno: we're essentially doing an experiment with new allocator_api design that works for more use cases.
* Boqun: Can we have a VBox instead of generic KBox?
* Danilo: I don't see why we want to maintain multiple types of boxes.
* Gary: Can we maybe keep alloc Box + KBox and make Box user default to GFP_KERNEL?
* Allows code reuse between kernel + userspace
* Danilo: is it useful?
* Boqun: Kent wants that for bcachefs
* Benno: When we drop `allocator_api` and extension trait then we don't have try_new anymore.
* Andreas: Rust project goals?
* arbitrary self types and `#[derive(SmartPointer)]`
* I see this as two options: one need unstable features and one not
* Gary: If we make flags assoc type that might work for an upstremable allocator API design.
* () would then work for the allocator without flags.
* No needed for kernel now.
* Consensus: don't want to use `allocator_api`.
* Example of Box is special: https://godbolt.org/z/9Mzqffvrq
Boqun: For `Allocator` trait, maybe s/`[u8]`/`[MaybeUninit<u8>]` for the return types
Boqun: I don't think `Unique<T>` should `impl` `Copy` or `Clone`.
- Seems I have some mis-understanding.
Boqun: `KBox<T>::drop` will need to `drop_in_place` the inner `T`. `Box` is [special](https://doc.rust-lang.org/src/alloc/boxed.rs.html#1240)
Boqun: If we have something like [`Owned`](https://lore.kernel.org/rust-for-linux/ZnCzLIly3DRK2eab@boqun-archlinux/), we could do
```rust=
// newtype for T alloced from kmalloc
#[repr(transparent)]
pub struct FromK<T: ?Sized>(T);
// newtype for T alloced from vmalloc
#[repr(transparent)]
pub struct FromV<T: ?Sized>(T);
unsafe impl<T: ?Sized> Ownable for FromK<T> {
unsafe fn ptr_drop(ptr: *mut Self) {
let ptr = ptr as *mut T;
drop_in_place(ptr);
kfree(ptr);
}
}
unsafe impl<T: ?Sized> Ownable for FromV<T> {
unsafe fn ptr_drop(ptr: *mut Self) {
let ptr = ptr as *mut T;
drop_in_place(ptr);
vfree(ptr);
}
}
```
and
```rust=
type KBox<T:?Sized> = Owned<FromK<T>>;
type VBox<T:?Sized> = Owned<FromV<T>>;
```
### Device / driver, PCI, `Io` series
Brief (strategy) update
### KMS
Lyude: need a unique address to determine if two things are of the same type by comparing the vtables.
Gary: this sounds like require a generic static, but it suffers from the issue on whether would the symbol be emitted when there're multiple translation units.
- Miguel: We would need to mark explicitly a particular TU to emit it -> `extern static`. (like in C++)
`extern static` (generic)
- Can we try to do it as an extension of https://github.com/rust-lang/rfcs/pull/3635 (`extern static`, non-generic)?
We need to give the Rust project a concrete example like we did for `const_refs_to_static`.
Gary: For vtable specificly, a macro solution might work.
Gary:
```rust
static VTABLE: bindings::drm_crtc_funcs = Crtc::<Driver>::FUNCS;
```
Benno & Gary:
```rust=
#[vtable(unique)]
trait FileOperations {
const VTABLE: ... = <construct vtable here>
}
// This can't be generic.
struct Bar;
#[vtable(unique)]
impl FileOperations for Bar {
}
```
that generates
```rust=
trait FileOperations {
}
struct VtableForFoo {
const VTABLE ...
}
impl FileOperations for Bar {
const VTABLE: &'static (Vtable type) = {
static VTABLE: Vtable type = VtableForFoo::<Bar>::...;
&VTABLE
};
}
```