From: Claude Code Review Bot <claude-review@example.com>
To: dri-devel-reviews@example.com
Subject: Claude review: rust: add basic serial device bus abstractions
Date: Thu, 04 Jun 2026 11:33:17 +1000 [thread overview]
Message-ID: <review-patch1-20260603-rust_serdev-v12-1-3400ffb88b12@posteo.de> (raw)
In-Reply-To: <20260603-rust_serdev-v12-1-3400ffb88b12@posteo.de>
Patch Review
This is the main patch adding `rust/kernel/serdev.rs`, C helpers, Kconfig, and bindings.
**1. Typo in `Parity::Even` doc (line 47 of serdev.rs):**
```rust
/// Even partiy.
Even = bindings::serdev_parity_SERDEV_PARITY_EVEN,
```
"partiy" should be "parity".
**2. `Timeout::into_jiffies` — silent overflow to infinite wait (lines 66–74):**
```rust
fn into_jiffies(self) -> isize {
match self {
Self::Jiffies(value) => value.get().try_into().unwrap_or_default(),
Self::Milliseconds(value) => {
msecs_to_jiffies(value.get()).try_into().unwrap_or_default()
}
Self::Max => 0,
}
}
```
`Jiffies` is `c_ulong` (u64 on 64-bit). If a caller passes a `NonZero<Jiffies>` value exceeding `isize::MAX`, `try_into()` fails and `unwrap_or_default()` returns 0. Since `serdev_device_write()` in C treats `timeout == 0` as `MAX_SCHEDULE_TIMEOUT`, this silently converts a large-but-finite timeout into an *infinite* timeout. The user explicitly used `Timeout::Jiffies(...)` — they did not ask for `Timeout::Max`. Consider saturating to `isize::MAX` instead:
```rust
Self::Jiffies(value) => value.get().try_into().unwrap_or(isize::MAX),
```
This would cap at the largest representable finite timeout rather than silently going infinite. The same applies to the `Milliseconds` arm.
**3. `Timeout` doc string is misleading (line 53):**
```rust
/// Timeout in Jiffies.
pub enum Timeout {
```
The enum supports Jiffies, Milliseconds, and Max. The doc should say something like "Timeout for serial device operations."
**4. `write_all()` — theoretical i32 truncation of ssize_t (lines 489–504):**
```rust
pub fn write_all(&self, data: &[u8], timeout: Timeout) -> Result<usize> {
let ret = unsafe {
bindings::serdev_device_write(
self.as_raw(), data.as_ptr(), data.len(), timeout.into_jiffies(),
)
};
to_result(ret as i32).map(|()| ret.unsigned_abs())
}
```
`serdev_device_write` returns `ssize_t` (i64 on 64-bit). The cast `ret as i32` truncates on 64-bit. If the return value were in the range `[0x80000000, 0xFFFFFFFF]` (2–4 GB), the truncated i32 would be negative and `to_result` would incorrectly treat it as an error code. This is academic for serial devices (serial writes are never that large), but it's a latent correctness issue. The comment "negative return values are guaranteed to be between `-MAX_ERRNO` and `-1`" only covers the error case. A cleaner pattern would be:
```rust
if ret < 0 {
return to_result(ret as i32).map(|()| 0);
}
Ok(ret as usize)
```
**5. `write()` doc — missing `[` in cross-reference (line 513):**
```rust
/// Note that any accepted data has only been buffered by the controller. Use
/// [ Device::wait_until_sent`] to make sure the controller write buffer has actually been
```
Should be `[`Device::wait_until_sent`]` (missing opening backtick-bracket).
**6. `unbind()` doc — incomplete sentence (line 403):**
```rust
/// This callback serves as a place for drivers to perform teardown operations that require a
/// `&Device<Core>` or `&Device<Bound>` reference. For instance.
```
"For instance." is an incomplete sentence. Either provide an example or remove it.
**7. `remove_callback` does not drop PrivateData (lines 223–244):**
```rust
extern "C" fn remove_callback(sdev: *mut bindings::serdev_device) {
let sdev = unsafe { &*sdev.cast::<Device<device::CoreInternal<'_>>>() };
let private_data = unsafe { sdev.as_ref().drvdata_borrow::<PrivateData<'_, T>>() };
// ... calls T::unbind, but never calls drvdata_obtain to free PrivateData
}
```
This relies on the driver-lifetime framework to drop PrivateData after the remove callback returns. This is correct per the framework design, but worth noting that the driver data (`T::Data`) is dropped via `PinnedDrop` on `PrivateData`, not via `unbind`. The ordering is: `remove_callback` calls `unbind` → framework drops `PrivateData` → `PinnedDrop` drops `T::Data` then closes the device. This is fine.
**8. Probe: receive_buf can fire before T::probe completes (lines 194–210):**
The probe sequence is: set drvdata → set client ops → open device → call `T::probe`. Since `active` starts as `false`, any `receive_buf_callback` firing between `serdev_device_open` and probe completion will see `!*active` and return `length` (discarding data). This is intentional and matches the v11 changelog ("simplify abstraction by removing ability to receive the initial transmission"). Just noting this is a design choice visible to driver authors — data arriving during probe is silently consumed and discarded.
**9. C helpers look correct:**
The three helpers (`serdev_device_driver_unregister`, `serdev_device_put`, `serdev_device_set_client_ops`) wrap inline functions / macros that can't be called directly from Rust bindgen. These are straightforward and correct.
**10. `Device<Bound>` but not `Device<Core>` for serial ops:**
All the serial operations (`set_baudrate`, `set_flow_control`, `write`, etc.) are only available on `Device<Bound>`. However, the `probe` callback receives `Device<Core<'_>>` and `Core` derefs to `Bound`, so the driver can call these methods during probe. This is consistent with the driver-lifetime pattern.
---
---
Generated by Claude Code Patch Reviewer
next prev parent reply other threads:[~2026-06-04 1:33 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 15:56 [PATCH v12 0/3] rust: add basic serial device bus abstractions Markus Probst via B4 Relay
2026-06-03 15:56 ` [PATCH v12 1/3] " Markus Probst via B4 Relay
2026-06-04 1:33 ` Claude Code Review Bot [this message]
2026-06-03 15:56 ` [PATCH v12 2/3] samples: rust: add Rust serial device bus sample device driver Markus Probst via B4 Relay
2026-06-04 1:33 ` Claude review: " Claude Code Review Bot
2026-06-03 15:56 ` [PATCH v12 3/3] MAINTAINERS: serdev: Add self for serdev Markus Probst via B4 Relay
2026-06-04 1:33 ` Claude review: " Claude Code Review Bot
2026-06-04 1:33 ` Claude review: rust: add basic serial device bus abstractions Claude Code Review Bot
-- strict thread matches above, loose matches on Subject: below --
2026-05-30 22:51 [PATCH v11 0/3] " Markus Probst via B4 Relay
2026-05-30 22:51 ` [PATCH v11 1/3] " Markus Probst via B4 Relay
2026-06-04 5:07 ` Claude review: " Claude Code Review Bot
2026-06-04 5:07 ` Claude Code Review Bot
2026-05-30 19:25 [PATCH v10 0/5] " Markus Probst
2026-05-30 19:25 ` [PATCH v10 3/5] " Markus Probst
2026-06-04 5:18 ` Claude review: " Claude Code Review Bot
2026-06-04 5:18 ` Claude Code Review Bot
2026-05-30 17:36 [PATCH v9 0/3] " Markus Probst
2026-05-30 17:36 ` [PATCH v9 1/3] " Markus Probst
2026-06-04 5:28 ` Claude review: " Claude Code Review Bot
2026-06-04 5:28 ` Claude Code Review Bot
2026-05-30 1:13 [PATCH v8 0/5] " Markus Probst via B4 Relay
2026-05-30 1:13 ` [PATCH v8 3/5] " Markus Probst via B4 Relay
2026-06-04 5:57 ` Claude review: " Claude Code Review Bot
2026-06-04 5:57 ` Claude Code Review Bot
2026-04-29 18:21 [PATCH v7 0/4] " Markus Probst via B4 Relay
2026-04-29 18:21 ` [PATCH v7 3/4] " Markus Probst via B4 Relay
2026-05-05 1:18 ` Claude review: " Claude Code Review Bot
2026-05-05 1:18 ` Claude Code Review Bot
2026-04-27 18:05 [PATCH v6 0/4] " Markus Probst via B4 Relay
2026-04-27 18:05 ` [PATCH v6 3/4] " Markus Probst via B4 Relay
2026-04-28 4:14 ` Claude review: " Claude Code Review Bot
2026-04-28 4:14 ` Claude Code Review Bot
2026-04-20 20:07 [PATCH v5 0/4] " Markus Probst
2026-04-20 20:07 ` [PATCH v5 3/4] " Markus Probst
2026-04-22 23:21 ` Claude review: " Claude Code Review Bot
2026-04-22 23:21 ` Claude Code Review Bot
2026-04-11 15:10 [PATCH v4 0/4] " Markus Probst via B4 Relay
2026-04-11 15:10 ` [PATCH v4 3/4] " Markus Probst via B4 Relay
2026-04-11 22:55 ` Claude review: " Claude Code Review Bot
2026-04-11 22:55 ` Claude Code Review Bot
2026-03-13 18:12 [PATCH v3 0/4] " Markus Probst
2026-03-13 18:12 ` [PATCH v3 3/4] " Markus Probst
2026-03-16 2:17 ` Claude review: " Claude Code Review Bot
2026-03-16 2:17 ` Claude Code Review Bot
2026-03-06 19:35 [PATCH v2 0/4] " Markus Probst
2026-03-08 22:21 ` Claude review: " Claude Code Review Bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=review-patch1-20260603-rust_serdev-v12-1-3400ffb88b12@posteo.de \
--to=claude-review@example.com \
--cc=dri-devel-reviews@example.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox