[PATCH 02/34] drm: Convert aux_idr to XArray
Ville Syrjälä
ville.syrjala at linux.intel.com
Mon Feb 25 17:57:33 UTC 2019
On Thu, Feb 21, 2019 at 10:41:23AM -0800, Matthew Wilcox wrote:
> Signed-off-by: Matthew Wilcox <willy at infradead.org>
> ---
> drivers/gpu/drm/drm_dp_aux_dev.c | 41 +++++++++++++-------------------
> 1 file changed, 17 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c b/drivers/gpu/drm/drm_dp_aux_dev.c
> index 0e4f25d63fd2..393a32976900 100644
> --- a/drivers/gpu/drm/drm_dp_aux_dev.c
> +++ b/drivers/gpu/drm/drm_dp_aux_dev.c
> @@ -49,8 +49,7 @@ struct drm_dp_aux_dev {
>
> #define DRM_AUX_MINORS 256
> #define AUX_MAX_OFFSET (1 << 20)
> -static DEFINE_IDR(aux_idr);
> -static DEFINE_MUTEX(aux_idr_mutex);
> +static DEFINE_XARRAY_ALLOC(aux_xa);
> static struct class *drm_dp_aux_dev_class;
> static int drm_dev_major = -1;
>
> @@ -58,19 +57,21 @@ static struct drm_dp_aux_dev *drm_dp_aux_dev_get_by_minor(unsigned index)
> {
> struct drm_dp_aux_dev *aux_dev = NULL;
>
> - mutex_lock(&aux_idr_mutex);
> - aux_dev = idr_find(&aux_idr, index);
> + xa_lock(&aux_xa);
> + aux_dev = xa_load(&aux_xa, index);
> if (!kref_get_unless_zero(&aux_dev->refcount))
> aux_dev = NULL;
> - mutex_unlock(&aux_idr_mutex);
> + xa_unlock(&aux_xa);
>
> return aux_dev;
> }
>
> static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux)
> {
> + static u32 next;
Is there a particular reason for that being static?
> +
> struct drm_dp_aux_dev *aux_dev;
> - int index;
> + int err;
>
> aux_dev = kzalloc(sizeof(*aux_dev), GFP_KERNEL);
> if (!aux_dev)
> @@ -79,15 +80,12 @@ static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux)
> atomic_set(&aux_dev->usecount, 1);
> kref_init(&aux_dev->refcount);
>
> - mutex_lock(&aux_idr_mutex);
> - index = idr_alloc_cyclic(&aux_idr, aux_dev, 0, DRM_AUX_MINORS,
> - GFP_KERNEL);
> - mutex_unlock(&aux_idr_mutex);
> - if (index < 0) {
> + err = xa_alloc_cyclic(&aux_xa, &aux_dev->index, aux_dev,
> + XA_LIMIT(0, DRM_AUX_MINORS), &next, GFP_KERNEL);
> + if (err < 0) {
> kfree(aux_dev);
> - return ERR_PTR(index);
> + return ERR_PTR(err);
> }
> - aux_dev->index = index;
>
> return aux_dev;
> }
> @@ -246,22 +244,19 @@ static const struct file_operations auxdev_fops = {
>
> static struct drm_dp_aux_dev *drm_dp_aux_dev_get_by_aux(struct drm_dp_aux *aux)
> {
> - struct drm_dp_aux_dev *iter, *aux_dev = NULL;
> - int id;
> + struct drm_dp_aux_dev *aux_dev;
> + unsigned long id;
>
> /* don't increase kref count here because this function should only be
> * used by drm_dp_aux_unregister_devnode. Thus, it will always have at
> * least one reference - the one that drm_dp_aux_register_devnode
> * created
> */
> - mutex_lock(&aux_idr_mutex);
> - idr_for_each_entry(&aux_idr, iter, id) {
> - if (iter->aux == aux) {
> - aux_dev = iter;
> + xa_for_each(&aux_xa, id, aux_dev) {
> + if (aux_dev->aux == aux)
> break;
> - }
> }
> - mutex_unlock(&aux_idr_mutex);
> +
> return aux_dev;
> }
>
> @@ -274,9 +269,7 @@ void drm_dp_aux_unregister_devnode(struct drm_dp_aux *aux)
> if (!aux_dev) /* attach must have failed */
> return;
>
> - mutex_lock(&aux_idr_mutex);
> - idr_remove(&aux_idr, aux_dev->index);
> - mutex_unlock(&aux_idr_mutex);
> + xa_erase(&aux_xa, aux_dev->index);
>
> atomic_dec(&aux_dev->usecount);
> wait_var_event(&aux_dev->usecount, !atomic_read(&aux_dev->usecount));
> --
> 2.20.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Ville Syrjälä
Intel
More information about the dri-devel
mailing list