On Thu, Sep 03, 2026 at 03:28:06PM +0200, Christian König wrote:
> Now that all users have migrated to dma_resv_alloc(), inline the
> initialization code directly into dma_resv_alloc() and remove the
> dma_resv_init() function entirely.
> 
> Additionally, remove the 'allocated' flag from struct dma_resv since
> all dma_resv objects are now dynamically allocated. This simplifies
> the reference counting logic - dma_resv_release() now always frees
> the object unconditionally.
> 
> The last remaining use of dma_resv_init() in dma_resv_lockdep() has
> been converted to use dma_resv_alloc() instead.
> 
> Signed-off-by: Christian König <[email protected]>

Reviewed-by: Matthew Brost <[email protected]>

> Assisted-by: Claude:Sonnet 4
> ---
>  drivers/dma-buf/dma-resv.c | 43 +++++++++++++++-----------------------
>  include/linux/dma-resv.h   | 10 ---------
>  2 files changed, 17 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
> index 5ae5a4b40ae6..4a421b08cd98 100644
> --- a/drivers/dma-buf/dma-resv.c
> +++ b/drivers/dma-buf/dma-resv.c
> @@ -132,26 +132,13 @@ static void dma_resv_list_free(struct dma_resv_list 
> *list)
>       kfree_rcu(list, rcu);
>  }
>  
> -/**
> - * dma_resv_init - initialize a reservation object
> - * @obj: the reservation object
> - */
> -void dma_resv_init(struct dma_resv *obj)
> -{
> -     kref_init(&obj->refcount);
> -     obj->allocated = false;
> -     ww_mutex_init(&obj->lock, &reservation_ww_class);
> -
> -     RCU_INIT_POINTER(obj->fences, NULL);
> -}
> -EXPORT_SYMBOL(dma_resv_init);
> -
>  /*
>   * dma_resv_release - release function for kref
>   * @kref: the kref inside the dma_resv object
>   *
>   * This is called when the last reference to a dma_resv object is released.
> - * Cleans up the object and frees it if it was allocated by dma_resv_alloc().
> + * All dma_resv objects are now dynamically allocated, so this always frees
> + * the object after cleanup.
>   */
>  static void dma_resv_release(struct kref *kref)
>  {
> @@ -163,10 +150,7 @@ static void dma_resv_release(struct kref *kref)
>        */
>       dma_resv_list_free(rcu_dereference_protected(obj->fences, true));
>       ww_mutex_destroy(&obj->lock);
> -
> -     /* TODO: Only as temporary workaround till dma_fence_init() is removed 
> */
> -     if (obj->allocated)
> -             kfree(obj);
> +     kfree(obj);
>  }
>  
>  /**
> @@ -187,8 +171,9 @@ struct dma_resv *dma_resv_alloc(void)
>       if (!obj)
>               return NULL;
>  
> -     dma_resv_init(obj);
> -     obj->allocated = true;
> +     kref_init(&obj->refcount);
> +     ww_mutex_init(&obj->lock, &reservation_ww_class);
> +     RCU_INIT_POINTER(obj->fences, NULL);
>  
>       return obj;
>  }
> @@ -844,23 +829,28 @@ static int __init dma_resv_lockdep(void)
>  {
>       struct mm_struct *mm = mm_alloc();
>       struct ww_acquire_ctx ctx;
> -     struct dma_resv obj;
> +     struct dma_resv *obj;
>       struct address_space mapping;
>       int ret;
>  
>       if (!mm)
>               return -ENOMEM;
>  
> -     dma_resv_init(&obj);
> +     obj = dma_resv_alloc();
> +     if (!obj) {
> +             mmput(mm);
> +             return -ENOMEM;
> +     }
> +
>       address_space_init_once(&mapping);
>  
>       mmap_read_lock(mm);
>       ww_acquire_init(&ctx, &reservation_ww_class);
> -     ret = dma_resv_lock(&obj, &ctx);
> +     ret = dma_resv_lock(obj, &ctx);
>       if (ret) {
>               /* Only EDEADLK from the error injection is possible here */
>               WARN_ON(ret != -EDEADLK);
> -             dma_resv_lock_slow(&obj, &ctx);
> +             dma_resv_lock_slow(obj, &ctx);
>       }
>       fs_reclaim_acquire(GFP_KERNEL);
>       /* for unmap_mapping_range on trylocked buffer objects in shrinkers */
> @@ -874,10 +864,11 @@ static int __init dma_resv_lockdep(void)
>       __dma_fence_might_wait();
>  #endif
>       fs_reclaim_release(GFP_KERNEL);
> -     ww_mutex_unlock(&obj.lock);
> +     ww_mutex_unlock(&obj->lock);
>       ww_acquire_fini(&ctx);
>       mmap_read_unlock(mm);
>  
> +     dma_resv_put(obj);
>       mmput(mm);
>  
>       return 0;
> diff --git a/include/linux/dma-resv.h b/include/linux/dma-resv.h
> index 4d12519df34e..cf689d3d4ba6 100644
> --- a/include/linux/dma-resv.h
> +++ b/include/linux/dma-resv.h
> @@ -162,15 +162,6 @@ struct dma_resv {
>        */
>       struct kref refcount;
>  
> -     /**
> -      * @allocated:
> -      *
> -      * True if this object was allocated by dma_resv_alloc(), false if
> -      * embedded in another structure. Used to determine whether to free
> -      * the object memory in the release function.
> -      */
> -     bool allocated;
> -
>       /**
>        * @lock:
>        *
> @@ -482,7 +473,6 @@ static inline void dma_resv_unlock(struct dma_resv *obj)
>       ww_mutex_unlock(&obj->lock);
>  }
>  
> -void dma_resv_init(struct dma_resv *obj);
>  struct dma_resv *dma_resv_alloc(void);
>  struct dma_resv *dma_resv_get(struct dma_resv *obj);
>  void dma_resv_put(struct dma_resv *obj);
> -- 
> 2.43.0
> 

Reply via email to