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 >
