On Thu, Oct 16, 2025 at 05:08:14PM -0400, Lyude Paul wrote:
> Currently in order to implement AlwaysRefCounted for gem objects, we use a
> blanket implementation:
>
> unsafe impl<T: IntoGEMObject> AlwaysRefCounted for T { … }
>
> While this technically works, it comes with the rather unfortunate downside
> that attempting to create a similar blanket implementation in any other
> kernel crate will now fail in a rather confusing way.
>
> Using an example from the (not yet upstream) rust DRM KMS bindings, if we
> were to add:
>
> unsafe impl<T: RcModeObject> AlwaysRefCounted for T { … }
>
> Then the moment that both blanket implementations are present in the same
> kernel tree, compilation fails with the following:
>
> error[E0119]: conflicting implementations of trait
> `types::AlwaysRefCounted`
> --> rust/kernel/drm/kms.rs:504:1
> |
> 504 | unsafe impl<T: RcModeObject> AlwaysRefCounted for T {
> | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting
> implementation
> |
> ::: rust/kernel/drm/gem/mod.rs:97:1
> |
> 97 | unsafe impl<T: IntoGEMObject> AlwaysRefCounted for T {
> | ---------------------------------------------------- first
> implementation here
>
> So, revert these changes for now. The proper fix for this is to introduce a
> macro for copy/pasting the same implementation of AlwaysRefCounted around.
>
> This reverts commit 38cb08c3fcd3f3b1d0225dcec8ae50fab5751549.
>
> Signed-off-by: Lyude Paul <[email protected]>
>
> ---
> V2:
> * Rewrite the commit message to explain a bit more why we don't want a
> blanket implementation for this.
>
> Signed-off-by: Lyude Paul <[email protected]>
Reviewed-by: Alice Ryhl <[email protected]>