[PATCH 02/27] drm/etnaviv: split obj locks in different classes depending on the obj type

Christian Gmeiner christian.gmeiner at gmail.com
Mon Dec 11 07:48:26 UTC 2017


2017-12-01 11:35 GMT+01:00 Lucas Stach <l.stach at pengutronix.de>:
> Userptr, prime and shmem buffer objects have different lock ordering
> requirements. This is mostly due to the fact that we don't allow to mmap
> userptr buffers, so we won't ever end up in our fault handler for those,
> so some of the code pathes are never called with the mmap_sem held.
>
> To avoid lockdep false positives, split them up into different lock classes.
>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gem.c       | 7 +++++++
>  drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 3 +++
>  2 files changed, 10 insertions(+)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> index daee3f1196df..e3582507963d 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> @@ -24,6 +24,9 @@
>  #include "etnaviv_gpu.h"
>  #include "etnaviv_mmu.h"
>
> +static struct lock_class_key etnaviv_shm_lock_class;
> +static struct lock_class_key etnaviv_userptr_lock_class;
> +
>  static void etnaviv_gem_scatter_map(struct etnaviv_gem_object *etnaviv_obj)
>  {
>         struct drm_device *dev = etnaviv_obj->base.dev;
> @@ -653,6 +656,8 @@ static struct drm_gem_object *__etnaviv_gem_new(struct drm_device *dev,
>         if (ret)
>                 goto fail;
>
> +       lockdep_set_class(&to_etnaviv_bo(obj)->lock, &etnaviv_shm_lock_class);
> +
>         ret = drm_gem_object_init(dev, obj, size);
>         if (ret == 0) {
>                 struct address_space *mapping;
> @@ -897,6 +902,8 @@ int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file,
>         if (ret)
>                 return ret;
>
> +       lockdep_set_class(&etnaviv_obj->lock, &etnaviv_userptr_lock_class);
> +
>         etnaviv_obj->userptr.ptr = ptr;
>         etnaviv_obj->userptr.task = current;
>         etnaviv_obj->userptr.ro = !(flags & ETNA_USERPTR_WRITE);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> index ae884723e9b1..ea87bf87b187 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> @@ -19,6 +19,7 @@
>  #include "etnaviv_drv.h"
>  #include "etnaviv_gem.h"
>
> +static struct lock_class_key etnaviv_prime_lock_class;
>
>  struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj)
>  {
> @@ -125,6 +126,8 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
>         if (ret < 0)
>                 return ERR_PTR(ret);
>
> +       lockdep_set_class(&etnaviv_obj->lock, &etnaviv_prime_lock_class);
> +
>         npages = size / PAGE_SIZE;
>
>         etnaviv_obj->sgt = sgt;
> --
> 2.11.0
>



-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info


More information about the dri-devel mailing list