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:
> *