[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 etnaviv
mailing list