From mboxrd@z Thu Jan 1 00:00:00 1970 From: Claude Code Review Bot To: dri-devel-reviews@example.com Subject: Claude review: rust: drm: Add RegistrationData to drm::Driver Date: Thu, 07 May 2026 12:45:09 +1000 Message-ID: In-Reply-To: <20260506221027.858481-4-dakr@kernel.org> References: <20260506221027.858481-1-dakr@kernel.org> <20260506221027.858481-4-dakr@kernel.org> X-Mailer: Claude Code Patch Reviewer Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Patch Review This is the most complex patch, involving higher-ranked lifetime (HRL) mani= pulation. **ForLt lifetime erasure**: The key transmute: ```rust let reg_data: Pin::Of<'bound>>> =3D KBox::pin_init(reg_data, GFP_KERNEL)?; let reg_data: Pin::Of<'static>>> =3D unsafe { mem::transmute(reg_data) }; ``` The safety argument is that `ForLt` guarantees covariance and lifetimes don= 't affect layout. This is correct: `ForLt::Of<'a>` is guaranteed to have th= e same representation for all `'a`, and `Pin>` is `repr(transparent= )` over a pointer. **UnsafeCell for registration_data field**: ```rust pub(super) registration_data: UnsafeCell::Of<'static>>>, ``` Using `UnsafeCell` here is appropriate since the field is written before re= gistration and read during ioctl dispatch. However, I note that the field i= s `pub(super)` =E2=80=94 this makes it accessible from within the `drm` mod= ule but not outside, which is reasonable. **Initialization with dangling pointer**: ```rust unsafe { (*raw_drm.as_ptr()).registration_data =3D UnsafeCell::new(NonNull:= :dangling()) }; ``` This is initialized to a dangling pointer before the real data pointer is s= tored in `Registration::new()`. The window between `UnregisteredDevice::new= ()` and `Registration::new()` has a dangling pointer. This is safe because = the device isn't registered yet (no ioctls can arrive), but it's worth noti= ng. **Error handling in Registration::new()**: On failure after `drm_dev_regist= er()`, the code resets the pointer to dangling: ```rust if let Err(e) =3D to_result(ret) { unsafe { *drm.registration_data.get() =3D NonNull::dangling() }; return Err(e); } ``` This is correct =E2=80=94 if registration fails, the caller will drop the `= UnregisteredDevice`, and the dangling pointer is never dereferenced. **Registration::drop ordering concern**: In the drop impl: ```rust unsafe { bindings::drm_dev_unplug(self.drm.as_raw()) }; // reg_data is dropped here automatically. ``` The SRCU barrier from `drm_dev_unplug()` happens before `reg_data` is dropp= ed, which is correct. The comment documents this. The field drop order in R= ust is declaration order (`drm` then `reg_data`), so `drm` would be dropped= first... but wait, the manual `drm_dev_unplug()` call is in the explicit `= drop()` implementation, and field drops happen *after* the explicit `drop()= ` body completes. So the actual order is: `drm_dev_unplug()` (in drop body)= =E2=86=92 `drm` field dropped (ARef put) =E2=86=92 `reg_data` field droppe= d. This is correct. **devres::register type annotation change**: ```rust devres::register::<_, core::convert::Infallible>(dev, reg, GFP_KERNEL)?; ``` This explicit `Infallible` type annotation suggests the `devres::register` = signature changed to accept a generic error type. This looks like an adapta= tion to the new `Registration` struct. **Send/Sync bounds**: The `where for<'a> ::Of= <'a>: Send` bound is correctly applied to the `impl` block, `Send`, and `Sy= nc` implementations. This ensures registration data is safe to access from = any thread. **The `#[allow(dead_code)]` on reg_data**: This annotation on the `reg_data= ` field: ```rust #[allow(dead_code)] reg_data: Pin::Of<'static>>>, ``` This is needed because the field is only read through the raw pointer store= d in `Device`, not through the struct field directly. The field exists pure= ly for ownership/drop semantics. Correct usage. --- Generated by Claude Code Patch Reviewer