Re: [PATCH] rust: drm: gem: clean up GEM state in init failure case

From: Onur Özkan

Date: Thu Apr 23 2026 - 13:16:01 EST


On Thu, 23 Apr 2026 21:36:52 +0900
Eliot Courtney <ecourtney@xxxxxxxxxx> wrote:

> Currently, if `drm_gem_object_init` fails, the object is freed without
> any cleanup. Perform the cleanup in that case.
>
> Signed-off-by: Eliot Courtney <ecourtney@xxxxxxxxxx>
> ---
> I looked at `drm_gem_shmem_init` for an example, and it seems like the
> correct cleanup here is to do `drm_gem_private_object_fini` if
> `drm_gem_object_init` fails. Other C drivers do different things, but
> looking at the implementation of `drm_gem_object_init`, this looks like
> the only thing we need to clean up.
> ---
> rust/kernel/drm/gem/mod.rs | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/rust/kernel/drm/gem/mod.rs b/rust/kernel/drm/gem/mod.rs
> index 75acda7ba500..7b6a085ace27 100644
> --- a/rust/kernel/drm/gem/mod.rs
> +++ b/rust/kernel/drm/gem/mod.rs
> @@ -278,7 +278,14 @@ pub fn new(dev: &drm::Device<T::Driver>, size: usize, args: T::Args) -> Result<A
> unsafe { (*obj.as_raw()).funcs = &Self::OBJECT_FUNCS };
>
> // SAFETY: The arguments are all valid per the type invariants.
> - to_result(unsafe { bindings::drm_gem_object_init(dev.as_raw(), obj.obj.get(), size) })?;
> + if let Err(err) =
> + to_result(unsafe { bindings::drm_gem_object_init(dev.as_raw(), obj.obj.get(), size) })
> + {
> + // SAFETY: `drm_gem_object_init()` initializes the private GEM object state before
> + // failing, so `drm_gem_private_object_fini()` is the matching cleanup.
> + unsafe { bindings::drm_gem_private_object_fini(obj.obj.get()) };
> + return Err(err);
> + }

I can confirm that this matches the usage on the C side. I think the API could
be improved to avoid relying on developers remembering this pattern. I don't
expect that to happen in this patch, just saying it :).

Reviewed-by: Onur Özkan <work@xxxxxxxxxxxxx>

>
> // SAFETY: We will never move out of `Self` as `ARef<Self>` is always treated as pinned.
> let ptr = KBox::into_raw(unsafe { Pin::into_inner_unchecked(obj) });
>
> ---
> base-commit: a7a080bb4236ebe577b6776d940d1717912ff6dd
> change-id: 20260423-fix-gem-1-6c68b9fa0972
>
> Best regards,
> --
> Eliot Courtney <ecourtney@xxxxxxxxxx>
>