From: Mike Lothian <mike@fireburn.co.uk>
To: dri-devel@lists.freedesktop.org
Cc: "Mike Lothian" <mike@fireburn.co.uk>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Danilo Krummrich" <dakr@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Tamir Duberstein" <tamird@kernel.org>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Onur Özkan" <work@onurozkan.dev>,
"Lyude Paul" <lyude@redhat.com>,
rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3 2/23] rust: drm: kms: tie mode-object references to their owners
Date: Wed, 26 Aug 2026 17:31:33 +0100 [thread overview]
Message-ID: <20260826163359.4998-3-mike@fireburn.co.uk> (raw)
In-Reply-To: <20260826163359.4998-1-mike@fireburn.co.uk>
The plane and encoder constructors accepted a caller-selected output
lifetime longer than the unregistered KMS device borrow.
RawPlaneState::crtc() had the same issue relative to the state borrow.
This allowed safe callers to manufacture dangling references.
Return references with the input/owner lifetime instead. Remove the
unused second lifetime from the CRTC constructor at the same time.
Fixes: 4b14e6e6259b ("rust: drm/kms: Add drm_plane bindings")
Fixes: c07f528ca38e ("rust: drm/kms: Add drm_encoder bindings")
Fixes: 8ba1abe0de4b ("rust: drm/kms: Add RawPlaneState::crtc()")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Mike Lothian <mike@fireburn.co.uk>
---
rust/kernel/drm/kms/crtc.rs | 2 +-
rust/kernel/drm/kms/encoder.rs | 24 +++++++++++++++++--
rust/kernel/drm/kms/plane.rs | 42 +++++++++++++++++++++++++++++++---
3 files changed, 62 insertions(+), 6 deletions(-)
diff --git a/rust/kernel/drm/kms/crtc.rs b/rust/kernel/drm/kms/crtc.rs
index b1c68838205e..683d9ee4ec25 100644
--- a/rust/kernel/drm/kms/crtc.rs
+++ b/rust/kernel/drm/kms/crtc.rs
@@ -302,7 +302,7 @@ impl<T: DriverCrtc> UnregisteredCrtc<T> {
/// construct new [`UnregisteredCrtc`] objects.
///
/// [`KmsDriver::create_objects`]: kernel::drm::kms::KmsDriver::create_objects
- pub fn new<'a, 'b: 'a, PrimaryData, CursorData>(
+ pub fn new<'a, PrimaryData, CursorData>(
dev: &'a UnregisteredKmsDevice<'a, T::Driver>,
primary: &'a UnregisteredPlane<PrimaryData>,
cursor: Option<&'a UnregisteredPlane<CursorData>>,
diff --git a/rust/kernel/drm/kms/encoder.rs b/rust/kernel/drm/kms/encoder.rs
index aa6f9fbaa5f1..f90d139cdb04 100644
--- a/rust/kernel/drm/kms/encoder.rs
+++ b/rust/kernel/drm/kms/encoder.rs
@@ -273,15 +273,35 @@ impl<T: DriverEncoder> UnregisteredEncoder<T> {
/// A driver may use this from their [`KmsDriver::create_objects`] callback in order to
/// construct new [`UnregisteredEncoder`] objects.
///
+ /// The returned encoder cannot outlive the device borrow:
+ ///
+ /// ```ignore,compile_fail
+ /// use kernel::{drm::kms::{encoder::{DriverEncoder, Type, UnregisteredEncoder},
+ /// UnregisteredKmsDevice},
+ /// error::Result,
+ /// str::CStr};
+ ///
+ /// fn reject_leaking_signature<T: DriverEncoder>() {
+ /// let _: for<'a> fn(
+ /// &'a UnregisteredKmsDevice<'a, T::Driver>,
+ /// Type,
+ /// u32,
+ /// u32,
+ /// Option<&CStr>,
+ /// T::Args,
+ /// ) -> Result<&'static UnregisteredEncoder<T>> = UnregisteredEncoder::<T>::new;
+ /// }
+ /// ```
+ ///
/// [`KmsDriver::create_objects`]: kernel::drm::kms::KmsDriver::create_objects
- pub fn new<'a, 'b: 'a>(
+ pub fn new<'a>(
dev: &'a UnregisteredKmsDevice<'a, T::Driver>,
type_: Type,
possible_crtcs: u32,
possible_clones: u32,
name: Option<&CStr>,
args: T::Args,
- ) -> Result<&'b Self> {
+ ) -> Result<&'a Self> {
let this: Pin<KBox<Encoder<T>>> = KBox::try_pin_init(
try_pin_init!(Encoder {
encoder: Opaque::new(bindings::drm_encoder {
diff --git a/rust/kernel/drm/kms/plane.rs b/rust/kernel/drm/kms/plane.rs
index 0c549dece483..f52f9c872de3 100644
--- a/rust/kernel/drm/kms/plane.rs
+++ b/rust/kernel/drm/kms/plane.rs
@@ -255,8 +255,29 @@ impl<T: DriverPlane> UnregisteredPlane<T> {
/// A driver may use this from their [`KmsDriver::create_objects`] callback in order to
/// construct new [`UnregisteredPlane`] objects.
///
+ /// The returned plane cannot outlive the device borrow:
+ ///
+ /// ```ignore,compile_fail
+ /// use kernel::{drm::kms::{plane::{DriverPlane, Type, UnregisteredPlane},
+ /// UnregisteredKmsDevice},
+ /// error::Result,
+ /// str::CStr};
+ ///
+ /// fn reject_leaking_signature<T: DriverPlane>() {
+ /// let _: for<'a> fn(
+ /// &'a UnregisteredKmsDevice<'a, T::Driver>,
+ /// u32,
+ /// &[u32],
+ /// Option<&[u64]>,
+ /// Type,
+ /// Option<&CStr>,
+ /// T::Args,
+ /// ) -> Result<&'static UnregisteredPlane<T>> = UnregisteredPlane::<T>::new;
+ /// }
+ /// ```
+ ///
/// [`KmsDriver::create_objects`]: kernel::drm::kms::KmsDriver::create_objects
- pub fn new<'a, 'b: 'a>(
+ pub fn new<'a>(
dev: &'a UnregisteredKmsDevice<'a, T::Driver>,
possible_crtcs: u32,
formats: &[u32],
@@ -264,7 +285,7 @@ pub fn new<'a, 'b: 'a>(
type_: Type,
name: Option<&CStr>,
args: T::Args,
- ) -> Result<&'b Self> {
+ ) -> Result<&'a Self> {
let this: Pin<KBox<Plane<T>>> = KBox::try_pin_init(
try_pin_init!(Plane {
plane: Opaque::new(bindings::drm_plane {
@@ -597,7 +618,22 @@ fn plane(&self) -> &Self::Plane {
}
/// Return the current [`OpaqueCrtc`] assigned to this plane, if there is one.
- fn crtc<'a, 'b: 'a, D>(&'a self) -> Option<&'b OpaqueCrtc<D>>
+ ///
+ /// The returned CRTC reference cannot outlive the plane-state borrow:
+ ///
+ /// ```ignore,compile_fail
+ /// use kernel::drm::kms::{crtc::OpaqueCrtc, plane::RawPlaneState, KmsDriver, ModeObject};
+ ///
+ /// fn reject_leaking_signature<S, D>()
+ /// where
+ /// S: RawPlaneState,
+ /// S::Plane: ModeObject<Driver = D>,
+ /// D: KmsDriver,
+ /// {
+ /// let _: for<'a> fn(&'a S) -> Option<&'static OpaqueCrtc<D>> = S::crtc::<D>;
+ /// }
+ /// ```
+ fn crtc<D>(&self) -> Option<&OpaqueCrtc<D>>
where
Self::Plane: ModeObject<Driver = D>,
D: KmsDriver,
next prev parent reply other threads:[~2026-08-26 16:34 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 16:31 [PATCH v3 0/23] rust: drm: KMS abstractions for a Rust display driver Mike Lothian
2026-08-26 16:31 ` [PATCH v3 1/23] rust: drm: kms: adapt Lyude's KMS series to current DRM APIs Mike Lothian
2026-08-26 16:31 ` Mike Lothian [this message]
2026-08-26 16:31 ` [PATCH v3 3/23] rust: drm: kms: constrain connector encoder attachment Mike Lothian
2026-08-26 16:31 ` [PATCH v3 4/23] rust: drm: reject cross-device GEM handle creation Mike Lothian
2026-08-26 16:31 ` [PATCH v3 5/23] rust: drm: kms: add common state and connector helpers Mike Lothian
2026-08-26 16:31 ` [PATCH v3 6/23] rust: drm: expose HDCP 2.2 message identifiers Mike Lothian
2026-08-26 16:31 ` [PATCH v3 7/23] rust: drm: kms: add typed color and rotation properties Mike Lothian
2026-08-26 16:31 ` [PATCH v3 8/23] rust: drm: kms: add connector detect() and mode_valid() hooks Mike Lothian
2026-08-26 16:31 ` [PATCH v3 9/23] rust: drm: kms: add plane damage-clip accessors Mike Lothian
2026-08-26 16:31 ` [PATCH v3 10/23] rust: drm: framebuffer: add validated shmem scanout views Mike Lothian
2026-08-26 16:31 ` [PATCH v3 11/23] rust: drm: kms: expose checked plane geometry Mike Lothian
2026-08-26 16:31 ` [PATCH v3 12/23] rust: drm: kms: add owned CRTC and vblank references Mike Lothian
2026-08-26 16:31 ` [PATCH v3 13/23] rust: drm: kms: plane: add FB_DAMAGE_CLIPS property support Mike Lothian
2026-08-26 16:31 ` [PATCH v3 14/23] rust: drm: add a safe constructor for owned registration data Mike Lothian
2026-08-26 16:31 ` [PATCH v3 15/23] rust: drm: pin the owner while DRM files remain open Mike Lothian
2026-08-26 16:31 ` [PATCH v3 16/23] rust: drm: kms: add the plane blend-mode property Mike Lothian
2026-08-26 16:31 ` [PATCH v3 17/23] rust: drm: add an owned display mode constructor Mike Lothian
2026-08-26 16:31 ` [PATCH v3 18/23] rust: drm: expose mode flags and CTA VIC matching Mike Lothian
2026-08-26 16:31 ` [PATCH v3 19/23] rust: drm: expose CRTC mode changes Mike Lothian
2026-08-26 16:31 ` [PATCH v3 20/23] rust: drm: kms: add synthesized CVT connector modes Mike Lothian
2026-08-26 16:31 ` [PATCH v3 21/23] rust: drm: kms: read a connector's colorimetry and HDR metadata Mike Lothian
2026-08-26 16:31 ` [PATCH v3 22/23] rust: drm: kms: walk the CRTCs an atomic commit carries Mike Lothian
2026-08-26 16:31 ` [PATCH v3 23/23] rust: drm: kms: expose a connector's requested link depth Mike Lothian
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=20260826163359.4998-3-mike@fireburn.co.uk \
--to=mike@fireburn.co.uk \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=lyude@redhat.com \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=tamird@kernel.org \
--cc=tmgross@umich.edu \
--cc=work@onurozkan.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox