2017-12-01 11:35 GMT+01:00 Lucas Stach <l.stach@xxxxxxxxxxxxxx>: > 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@xxxxxxxxxxxxxx> Reviewed-by: Christian Gmeiner <christian.gmeiner@xxxxxxxxx> > --- > 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel