On 8/31/26 20:33, Alex Deucher wrote:
> From: Mukul Joshi <[email protected]>
> 
> Add an optional callback for driver-specific cleanup when the GEM
> handle of an object is freed. This will be used by AMDGPU to enable
> freeing of memory exported to other nodes in a UALink pod once all
> user mode references are gone.
> 
> The callback is called outside the object_name_lock and before
> releasing the reference count on the GEM object

This showed up in -next yesterday and afaics broke build on arm64 and
x86_64 for me with the following error from rust:

"""
>> error[E0063]: missing field `handle_free` in initializer of 
>> `drm_gem_object_funcs`
>>    --> rust/kernel/drm/gem/mod.rs:265:58
>>     |
>> 265 |     const OBJECT_FUNCS: bindings::drm_gem_object_funcs = 
>> bindings::drm_gem_object_funcs {
>>     |                                                          
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `handle_free`
>> 
>> error: aborting due to 1 previous error
>> 
>> For more information about this error, try `rustc --explain E0063`.
>> make[2]: *** [rust/Makefile:799: rust/kernel.o] Error 1
>> make[1]: *** 
>> [/builddir/build/BUILD/kernel-7.3.0-build/kernel-next-20260904/linux-7.3.0-0.0.next.20260904.221.vanilla.fc43.aarch64/Makefile:1442:
>>  prepare] Error 2
>> make: *** [Makefile:256: __sub-make] Error 2
"""
Full log:
https://download.copr.fedorainfracloud.org/results/@kernel-vanilla/next/fedora-43-aarch64/10951622-next-next-all/builder-live.log.gz

Reverting this change and 2/3 from this set fixed the problem for me.

Ciao, Thorsten
> Suggested-by: Christian König <[email protected]>
> Signed-off-by: Mukul Joshi <[email protected]>
> Reviewed-by: Felix Kuehling <[email protected]>
> Signed-off-by: Alex Deucher <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c |  9 +++++++++
>  drivers/gpu/drm/drm_gem.c               |  5 ++++-
>  include/drm/drm_gem.h                   | 11 +++++++++++
>  3 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index f754a4a3a1c22..0d579517c03ce 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -386,6 +386,14 @@ static int amdgpu_gem_object_mmap(struct drm_gem_object 
> *obj, struct vm_area_str
>       return drm_gem_ttm_mmap(obj, vma);
>  }
>  
> +static void amdgpu_gem_object_handle_free(struct drm_gem_object *gobj)
> +{
> +     struct amdgpu_bo *aobj = gem_to_amdgpu_bo(gobj);
> +
> +     amdgpu_ualink_revoke_exported_memory(aobj);
> +
> +}
> +
>  const struct drm_gem_object_funcs amdgpu_gem_object_funcs = {
>       .free = amdgpu_gem_object_free,
>       .open = amdgpu_gem_object_open,
> @@ -395,6 +403,7 @@ const struct drm_gem_object_funcs amdgpu_gem_object_funcs 
> = {
>       .vunmap = drm_gem_ttm_vunmap,
>       .mmap = amdgpu_gem_object_mmap,
>       .vm_ops = &amdgpu_gem_vm_ops,
> +     .handle_free = amdgpu_gem_object_handle_free
>  };
>  
>  static bool amdgpu_gem_are_domains_valid(u32 domains)
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index e3ed684ddcf29..6a86bd2a0343e 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -354,8 +354,11 @@ void drm_gem_object_handle_put_unlocked(struct 
> drm_gem_object *obj)
>       }
>       mutex_unlock(&dev->object_name_lock);
>  
> -     if (final)
> +     if (final) {
> +             if (obj->funcs->handle_free)
> +                     obj->funcs->handle_free(obj);
>               drm_gem_object_put(obj);
> +     }
>  }
>  
>  /*
> diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> index 8a704f6a65c15..95d8ae6f85df7 100644
> --- a/include/drm/drm_gem.h
> +++ b/include/drm/drm_gem.h
> @@ -227,6 +227,17 @@ struct drm_gem_object_funcs {
>        */
>       size_t (*rss)(struct drm_gem_object *obj);
>  
> +     /**
> +      * @handle_free:
> +      *
> +      * This callback is called when the GEM handle count goes down to 0.
> +      * It is currently used by AMDGPU driver to release their exported BO
> +      * handles.
> +      *
> +      * This callback is optional.
> +      */
> +     void (*handle_free)(struct drm_gem_object *obj);
> +
>       /**
>        * @vm_ops:
>        *

Reply via email to