From: sashiko-bot@kernel.org
To: clicedvly768 <harepro29@gmail.com>
Cc: linux-input@vger.kernel.org, dmitry.torokhov@gmail.com,
ojeda@kernel.org, gary@garyguo.net
Subject: Re: [PATCH v3 2/2] rust: serio: add serio bus abstractions and port Gravis Stinger driver
Date: Fri, 06 Nov 2026 21:28:01 +0000 [thread overview]
Message-ID: <sashiko-outbox-202296@kernel.org> (raw)
In-Reply-To: <20261106211034.401918-3-harepro29@gmail.com>
Thank you for your contribution! Sashiko AI review found 5 potential
issues to consider:
- [High] Input: joystick - unintended removal of analog.o and db9.o from
Makefile
- [High] rust: serio: concurrent borrow_mut() and data race between
start() and interrupt()
- [Medium] rust: serio: non-existent bindings::irqreturn::IRQ_* paths in
interrupt_callback()
- [Low] rust: serio: non-vertical import style in serio.rs and
stinger_rust.rs
- [Low] rust: serio: missing #[inline] on Registration::drop() and
Driver defaults
--
commit 26aa0ef3bea4ec16308e3ef9c8b5857b4bc682ad
Author: clicedvly768 <harepro29@gmail.com>
rust: serio: add serio bus abstractions and port Gravis Stinger driver
This commit adds Rust abstractions for the serio bus subsystem and ports
the Gravis Stinger serial gamepad driver to Rust.
> diff --git a/drivers/input/joystick/Makefile b/drivers/input/joystick/Makefile
> index 9976f596a9208..31e23236ff91a 100644
> --- a/drivers/input/joystick/Makefile
> +++ b/drivers/input/joystick/Makefile
> @@ -10,9 +10,7 @@ obj-$(CONFIG_JOYSTICK_ADC) += adc-joystick.o
> obj-$(CONFIG_JOYSTICK_ADI) += adi.o
> obj-$(CONFIG_JOYSTICK_AMIGA) += amijoy.o
> obj-$(CONFIG_JOYSTICK_AS5011) += as5011.o
> -obj-$(CONFIG_JOYSTICK_ANALOG) += analog.o
> obj-$(CONFIG_JOYSTICK_COBRA) += cobra.o
> -obj-$(CONFIG_JOYSTICK_DB9) += db9.o
> obj-$(CONFIG_JOYSTICK_FSIA6B) += fsia6b.o
[Severity: High]
Were the build rules for analog.o and db9.o removed by mistake? Dropping
these lines causes builds with CONFIG_JOYSTICK_ANALOG or
CONFIG_JOYSTICK_DB9 enabled to stop compiling both drivers.
[ ... ]
> diff --git a/rust/kernel/serio.rs b/rust/kernel/serio.rs
> new file mode 100644
> index 0000000000000..bd3fae462bb53
> --- /dev/null
> +++ b/rust/kernel/serio.rs
> @@ -0,0 +1,301 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +//! Serio (Serial I/O) bus abstractions for safe Rust drivers.
> +//!
> +//! Provides a safe Rust interface for serio devices and drivers in the Linux kernel,
> +//! supporting input devices such as serial gamepads (e.g. Gravis Stinger), mice, and keyboards.
> +
> +use crate::{
> + bindings, device,
> + device_id::{IdTable as GenericIdTable, RawDeviceId},
> + error::{to_result, Result},
> + ffi::{c_int, c_uchar, c_uint},
> + prelude::*,
> + types::{ForeignOwnable, Opaque},
> + ThisModule,
> +};
> +use core::{marker::PhantomData, pin::Pin};
[Severity: Low]
This isn't a bug, but the imports here and in
drivers/input/joystick/stinger_rust.rs group multiple items on a single
line instead of using the kernel Rust vertical import style with one item
per line and a trailing // comment.
[ ... ]
> + // 3. Open serio port.
> + // SAFETY: `serio` and `drv` are valid non-null pointers provided by the kernel.
> + let ret = unsafe { bindings::serio_open(serio, drv) };
> + if ret != 0 {
> + // SAFETY: Clean up drvdata if open failed.
> + unsafe {
> + bindings::serio_set_drvdata(serio, core::ptr::null_mut());
> + let data = <T::Data as ForeignOwnable>::from_foreign(raw_data);
> + T::disconnect(data);
> + }
> + return ret;
> + }
> +
> + // 4. Start driver and publish devices now that port is open and interrupts are active.
> + // SAFETY: `raw_data` was created via `into_foreign()` above and remains valid.
> + let mut borrowed = unsafe { <T::Data as ForeignOwnable>::borrow_mut(raw_data) };
> + if let Err(e) = T::start(&mut borrowed) {
> + // SAFETY: Close port and clean up on start failure.
> + unsafe {
> + bindings::serio_close(serio);
> + bindings::serio_set_drvdata(serio, core::ptr::null_mut());
> + let data = <T::Data as ForeignOwnable>::from_foreign(raw_data);
> + T::disconnect(data);
> + }
> + return e.to_errno();
> + }
> +
> + 0
> + }
> +
> + /// # Safety
> + ///
> + /// Must only be invoked by the serio subsystem during an interrupt on a connected port.
> + /// `serio` must be a valid pointer.
> + unsafe extern "C" fn interrupt_callback(
> + serio: *mut bindings::serio,
> + data: c_uchar,
> + flags: c_uint,
> + ) -> bindings::irqreturn_t {
> + // SAFETY: `serio` is valid.
> + let raw = unsafe { bindings::serio_get_drvdata(serio) };
> + if raw.is_null() {
> + return bindings::irqreturn::IRQ_NONE;
> + }
> +
> + // SAFETY: `raw` was created via `into_foreign()` in `connect_callback`.
> + let mut borrowed = unsafe { <T::Data as ForeignOwnable>::borrow_mut(raw) };
> + let ret = T::interrupt(&mut borrowed, data, flags);
[Severity: High]
Can Registration::interrupt_callback() and Registration::connect_callback()
call ForeignOwnable::borrow_mut() on raw_data at the same time?
Once bindings::serio_open() returns in connect_callback(), port interrupts
are enabled while connect_callback() runs T::start(&mut borrowed) in
process context without holding serio->lock:
CPU0 CPU1 (<hardirq>)
Registration::connect_callback()
bindings::serio_open(serio, drv)
ForeignOwnable::borrow_mut(raw_data)
StingerDriver::start(&mut borrowed)
alloc.register()
Registration::interrupt_callback()
ForeignOwnable::borrow_mut(raw)
StingerDriver::interrupt()
stinger.process_packet()
self.input.as_ref()
stinger.input = Some(...) <-- aliasing &mut / data race
This creates two concurrent mutable references to Stinger (undefined
behavior in Rust) and races the unsynchronized write to stinger.input in
StingerDriver::start() against reads of self.input in
Stinger::process_packet(), allowing a torn read of RegisteredDevice.
In addition, on the T::start() error path,
ForeignOwnable::from_foreign(raw_data) is called while borrowed is still
in scope, violating the ForeignOwnable::borrow_mut() safety requirement
that all borrows end before from_foreign() is called.
> + match ret {
> + IrqReturn::None => bindings::irqreturn::IRQ_NONE,
> + IrqReturn::Handled => bindings::irqreturn::IRQ_HANDLED,
> + }
> + }
[Severity: Medium]
Does bindings::irqreturn::IRQ_NONE compile when CONFIG_SERIO=y is enabled?
Bindgen generates bindings::irqreturn as a type alias for c_uint and
emits top-level constants bindings::irqreturn_IRQ_NONE and
bindings::irqreturn_IRQ_HANDLED (as used in rust/kernel/irq/request.rs),
so referencing associated constants on bindings::irqreturn fails to
build.
[ ... ]
> +impl<T: Driver> Drop for Registration<T> {
> + fn drop(&mut self) {
> + // SAFETY: Unregister driver with kernel. `self.drv` is valid and registered.
> + unsafe {
> + bindings::serio_unregister_driver(self.drv.get());
> + }
> + }
> +}
[Severity: Low]
Should Registration::drop() and the default methods Driver::start() and
Driver::disconnect() be marked #[inline]? In the kernel crate, small
functions and functions that forward directly to a C binding call are
annotated with #[inline].
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261106211034.401918-1-harepro29@gmail.com?part=2
prev parent reply other threads:[~2026-11-06 21:28 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 21:10 [PATCH v3 0/2] rust: input: add input/serio abstractions and port Gravis Stinger driver clicedvly768
2026-11-06 21:10 ` [PATCH v3 1/2] rust: input: add input device abstractions clicedvly768
2026-11-06 21:20 ` sashiko-bot
2026-11-06 21:10 ` [PATCH v3 2/2] rust: serio: add serio bus abstractions and port Gravis Stinger driver clicedvly768
2026-11-06 21:28 ` sashiko-bot [this message]
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=sashiko-outbox-202296@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=gary@garyguo.net \
--cc=harepro29@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.