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
> 

Reply via email to