On Fri, Dec 05, 2025 at 03:09:10PM +0000, Tvrtko Ursulin wrote: > IDR is deprecated and syncobj looks pretty trivial to convert so lets > just do it. > > Signed-off-by: Tvrtko Ursulin <[email protected]> > Cc: [email protected]
Nice cleanup. LGTM: Reviewed-by: Matthew Brost <[email protected]> > --- > drivers/gpu/drm/drm_syncobj.c | 65 +++++++++++------------------------ > include/drm/drm_file.h | 7 ++-- > 2 files changed, 23 insertions(+), 49 deletions(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index 0de70c8fbb99..06bb5c6c3f60 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -258,14 +258,14 @@ struct drm_syncobj *drm_syncobj_find(struct drm_file > *file_private, > { > struct drm_syncobj *syncobj; > > - spin_lock(&file_private->syncobj_table_lock); > + xa_lock(&file_private->syncobj_xa); > > /* Check if we currently have a reference on the object */ > - syncobj = idr_find(&file_private->syncobj_idr, handle); > + syncobj = xa_load(&file_private->syncobj_xa, handle); > if (syncobj) > drm_syncobj_get(syncobj); > > - spin_unlock(&file_private->syncobj_table_lock); > + xa_unlock(&file_private->syncobj_xa); > > return syncobj; > } > @@ -606,23 +606,15 @@ int drm_syncobj_get_handle(struct drm_file > *file_private, > { > int ret; > > - /* take a reference to put in the idr */ > + /* take a reference to put in the xarray */ > drm_syncobj_get(syncobj); > > - idr_preload(GFP_KERNEL); > - spin_lock(&file_private->syncobj_table_lock); > - ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT); > - spin_unlock(&file_private->syncobj_table_lock); > - > - idr_preload_end(); > - > - if (ret < 0) { > + ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b, > + GFP_NOWAIT); > + if (ret) > drm_syncobj_put(syncobj); > - return ret; > - } > > - *handle = ret; > - return 0; > + return ret; > } > EXPORT_SYMBOL(drm_syncobj_get_handle); > > @@ -646,10 +638,7 @@ static int drm_syncobj_destroy(struct drm_file > *file_private, > { > struct drm_syncobj *syncobj; > > - spin_lock(&file_private->syncobj_table_lock); > - syncobj = idr_remove(&file_private->syncobj_idr, handle); > - spin_unlock(&file_private->syncobj_table_lock); > - > + syncobj = xa_erase(&file_private->syncobj_xa, handle); > if (!syncobj) > return -EINVAL; > > @@ -730,20 +719,13 @@ static int drm_syncobj_fd_to_handle(struct drm_file > *file_private, > if (fd_file(f)->f_op != &drm_syncobj_file_fops) > return -EINVAL; > > - /* take a reference to put in the idr */ > + /* take a reference to put in the xarray */ > syncobj = fd_file(f)->private_data; > drm_syncobj_get(syncobj); > > - idr_preload(GFP_KERNEL); > - spin_lock(&file_private->syncobj_table_lock); > - ret = idr_alloc(&file_private->syncobj_idr, syncobj, 1, 0, GFP_NOWAIT); > - spin_unlock(&file_private->syncobj_table_lock); > - idr_preload_end(); > - > - if (ret > 0) { > - *handle = ret; > - ret = 0; > - } else > + ret = xa_alloc(&file_private->syncobj_xa, handle, syncobj, xa_limit_32b, > + GFP_NOWAIT); > + if (ret) > drm_syncobj_put(syncobj); > > return ret; > @@ -822,17 +804,7 @@ static int drm_syncobj_export_sync_file(struct drm_file > *file_private, > void > drm_syncobj_open(struct drm_file *file_private) > { > - idr_init_base(&file_private->syncobj_idr, 1); > - spin_lock_init(&file_private->syncobj_table_lock); > -} > - > -static int > -drm_syncobj_release_handle(int id, void *ptr, void *data) > -{ > - struct drm_syncobj *syncobj = ptr; > - > - drm_syncobj_put(syncobj); > - return 0; > + xa_init_flags(&file_private->syncobj_xa, XA_FLAGS_ALLOC1); > } > > /** > @@ -846,9 +818,12 @@ drm_syncobj_release_handle(int id, void *ptr, void *data) > void > drm_syncobj_release(struct drm_file *file_private) > { > - idr_for_each(&file_private->syncobj_idr, > - &drm_syncobj_release_handle, file_private); > - idr_destroy(&file_private->syncobj_idr); > + struct drm_syncobj *syncobj; > + unsigned long handle; > + > + xa_for_each(&file_private->syncobj_xa, handle, syncobj) > + drm_syncobj_put(syncobj); > + xa_destroy(&file_private->syncobj_xa); > } > > int > diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h > index 04cad0c61513..99c71ec3ad44 100644 > --- a/include/drm/drm_file.h > +++ b/include/drm/drm_file.h > @@ -34,6 +34,7 @@ > #include <linux/types.h> > #include <linux/completion.h> > #include <linux/idr.h> > +#include <linux/xarray.h> > > #include <uapi/drm/drm.h> > > @@ -320,10 +321,8 @@ struct drm_file { > /** @table_lock: Protects @object_idr. */ > spinlock_t table_lock; > > - /** @syncobj_idr: Mapping of sync object handles to object pointers. */ > - struct idr syncobj_idr; > - /** @syncobj_table_lock: Protects @syncobj_idr. */ > - spinlock_t syncobj_table_lock; > + /** @syncobj_xa: Mapping of sync object handles to object pointers. */ > + struct xarray syncobj_xa; > > /** @filp: Pointer to the core file structure. */ > struct file *filp; > -- > 2.51.1 >
