drm/i915/gem: Distinguish each object type
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 22 Oct 2019 14:45:01 +0000 (15:45 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 22 Oct 2019 15:23:32 +0000 (16:23 +0100)
Separate each object class into a separate lock type to avoid lockdep
cross-contamination between paths (i.e. userptr!).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191022144501.26486-1-chris@chris-wilson.co.uk
12 files changed:
drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
drivers/gpu/drm/i915/gem/i915_gem_internal.c
drivers/gpu/drm/i915/gem/i915_gem_object.c
drivers/gpu/drm/i915/gem/i915_gem_object.h
drivers/gpu/drm/i915/gem/i915_gem_shmem.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
drivers/gpu/drm/i915/gem/i915_gem_userptr.c
drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
drivers/gpu/drm/i915/gem/selftests/huge_pages.c
drivers/gpu/drm/i915/gvt/dmabuf.c
drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
drivers/gpu/drm/i915/selftests/mock_region.c

index 96ce95c8ac5a4f9078261fe978e80c774924411f..eaea49d08eb5a35d373e040e9bc09947cf5fa928 100644 (file)
@@ -256,6 +256,7 @@ static const struct drm_i915_gem_object_ops i915_gem_object_dmabuf_ops = {
 struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
                                             struct dma_buf *dma_buf)
 {
+       static struct lock_class_key lock_class;
        struct dma_buf_attachment *attach;
        struct drm_i915_gem_object *obj;
        int ret;
@@ -287,7 +288,7 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
        }
 
        drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
-       i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops);
+       i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class);
        obj->base.import_attach = attach;
        obj->base.resv = dma_buf->resv;
 
index 5ae694c24df4a225d60b0f21b0cd2a8723c5715a..9cfb0e41ff06d1562837b2aec9552d73537c93cd 100644 (file)
@@ -164,6 +164,7 @@ struct drm_i915_gem_object *
 i915_gem_object_create_internal(struct drm_i915_private *i915,
                                phys_addr_t size)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_gem_object *obj;
        unsigned int cache_level;
 
@@ -178,7 +179,7 @@ i915_gem_object_create_internal(struct drm_i915_private *i915,
                return ERR_PTR(-ENOMEM);
 
        drm_gem_private_object_init(&i915->drm, &obj->base, size);
-       i915_gem_object_init(obj, &i915_gem_object_internal_ops);
+       i915_gem_object_init(obj, &i915_gem_object_internal_ops, &lock_class);
 
        /*
         * Mark the object as volatile, such that the pages are marked as
index dbf9be9a79f477d30180ad0c96b3d66420dd9607..a50296cce0d88efb56a07b349ff56b88f7b689ba 100644 (file)
@@ -47,9 +47,10 @@ void i915_gem_object_free(struct drm_i915_gem_object *obj)
 }
 
 void i915_gem_object_init(struct drm_i915_gem_object *obj,
-                         const struct drm_i915_gem_object_ops *ops)
+                         const struct drm_i915_gem_object_ops *ops,
+                         struct lock_class_key *key)
 {
-       mutex_init(&obj->mm.lock);
+       __mutex_init(&obj->mm.lock, "obj->mm.lock", key);
 
        spin_lock_init(&obj->vma.lock);
        INIT_LIST_HEAD(&obj->vma.list);
index 85921796851f92afc6c23ba0a7eca39690b15682..aead7e6725f9d68c3bd7afadd12b2849e7c8464e 100644 (file)
@@ -23,7 +23,8 @@ struct drm_i915_gem_object *i915_gem_object_alloc(void);
 void i915_gem_object_free(struct drm_i915_gem_object *obj);
 
 void i915_gem_object_init(struct drm_i915_gem_object *obj,
-                         const struct drm_i915_gem_object_ops *ops);
+                         const struct drm_i915_gem_object_ops *ops,
+                         struct lock_class_key *key);
 struct drm_i915_gem_object *
 i915_gem_object_create_shmem(struct drm_i915_private *i915,
                             resource_size_t size);
index be68b76e13b3417af2ff155f850b00a227648f24..4d69c3fc3439e9c8abe7b9a69779ed8eef16a6a8 100644 (file)
@@ -465,6 +465,7 @@ create_shmem(struct intel_memory_region *mem,
             resource_size_t size,
             unsigned int flags)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_private *i915 = mem->i915;
        struct drm_i915_gem_object *obj;
        struct address_space *mapping;
@@ -491,7 +492,7 @@ create_shmem(struct intel_memory_region *mem,
        mapping_set_gfp_mask(mapping, mask);
        GEM_BUG_ON(!(mapping_gfp_mask(mapping) & __GFP_RECLAIM));
 
-       i915_gem_object_init(obj, &i915_gem_shmem_ops);
+       i915_gem_object_init(obj, &i915_gem_shmem_ops, &lock_class);
 
        obj->write_domain = I915_GEM_DOMAIN_CPU;
        obj->read_domains = I915_GEM_DOMAIN_CPU;
index 57cd8bc2657c008d5514218952fae8fd6e0a4912..a2d49c04e6a4ac8a4d3192d7efaaee8bef7f2da8 100644 (file)
@@ -556,6 +556,7 @@ __i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
                                struct drm_mm_node *stolen,
                                struct intel_memory_region *mem)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_gem_object *obj;
        unsigned int cache_level;
        int err = -ENOMEM;
@@ -565,7 +566,7 @@ __i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
                goto err;
 
        drm_gem_private_object_init(&dev_priv->drm, &obj->base, stolen->size);
-       i915_gem_object_init(obj, &i915_gem_object_stolen_ops);
+       i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class);
 
        obj->stolen = stolen;
        obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
index 4f970474013f85455938ae22a269fcdc2c85bf9c..1e045c3370444021de0dd88b94e99cf009bc2145 100644 (file)
@@ -725,6 +725,7 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
                       void *data,
                       struct drm_file *file)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_i915_gem_userptr *args = data;
        struct drm_i915_gem_object *obj;
@@ -769,7 +770,7 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
                return -ENOMEM;
 
        drm_gem_private_object_init(dev, &obj->base, args->user_size);
-       i915_gem_object_init(obj, &i915_gem_userptr_ops);
+       i915_gem_object_init(obj, &i915_gem_userptr_ops, &lock_class);
        obj->read_domains = I915_GEM_DOMAIN_CPU;
        obj->write_domain = I915_GEM_DOMAIN_CPU;
        i915_gem_object_set_cache_coherency(obj, I915_CACHE_LLC);
index 3c5d17b2b6709ee3d398e681c8232bc9d9193706..892d12db6c496178cda607a9f849832c159f2cd2 100644 (file)
@@ -96,6 +96,7 @@ huge_gem_object(struct drm_i915_private *i915,
                phys_addr_t phys_size,
                dma_addr_t dma_size)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_gem_object *obj;
        unsigned int cache_level;
 
@@ -111,7 +112,7 @@ huge_gem_object(struct drm_i915_private *i915,
                return ERR_PTR(-ENOMEM);
 
        drm_gem_private_object_init(&i915->drm, &obj->base, dma_size);
-       i915_gem_object_init(obj, &huge_ops);
+       i915_gem_object_init(obj, &huge_ops, &lock_class);
 
        obj->read_domains = I915_GEM_DOMAIN_CPU;
        obj->write_domain = I915_GEM_DOMAIN_CPU;
index f27772f6779ae0656ddd7e7c9eb8adf5f7b396dc..dac8344507c116909817cd0cf7e4abc1a9de6514 100644 (file)
@@ -149,6 +149,7 @@ huge_pages_object(struct drm_i915_private *i915,
                  u64 size,
                  unsigned int page_mask)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_gem_object *obj;
 
        GEM_BUG_ON(!size);
@@ -165,7 +166,7 @@ huge_pages_object(struct drm_i915_private *i915,
                return ERR_PTR(-ENOMEM);
 
        drm_gem_private_object_init(&i915->drm, &obj->base, size);
-       i915_gem_object_init(obj, &huge_page_ops);
+       i915_gem_object_init(obj, &huge_page_ops, &lock_class);
 
        i915_gem_object_set_volatile(obj);
 
@@ -295,6 +296,7 @@ static const struct drm_i915_gem_object_ops fake_ops_single = {
 static struct drm_i915_gem_object *
 fake_huge_pages_object(struct drm_i915_private *i915, u64 size, bool single)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_gem_object *obj;
 
        GEM_BUG_ON(!size);
@@ -313,9 +315,9 @@ fake_huge_pages_object(struct drm_i915_private *i915, u64 size, bool single)
        drm_gem_private_object_init(&i915->drm, &obj->base, size);
 
        if (single)
-               i915_gem_object_init(obj, &fake_ops_single);
+               i915_gem_object_init(obj, &fake_ops_single, &lock_class);
        else
-               i915_gem_object_init(obj, &fake_ops);
+               i915_gem_object_init(obj, &fake_ops, &lock_class);
 
        i915_gem_object_set_volatile(obj);
 
index 13044c027f272ba02d5c4a370d204287bd317d73..a816aef6142b605bffaffcdae4390c0c8df716c1 100644 (file)
@@ -152,6 +152,7 @@ static const struct drm_i915_gem_object_ops intel_vgpu_gem_ops = {
 static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev,
                struct intel_vgpu_fb_info *info)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_i915_gem_object *obj;
 
@@ -161,7 +162,7 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev,
 
        drm_gem_private_object_init(dev, &obj->base,
                roundup(info->size, PAGE_SIZE));
-       i915_gem_object_init(obj, &intel_vgpu_gem_ops);
+       i915_gem_object_init(obj, &intel_vgpu_gem_ops, &lock_class);
 
        obj->read_domains = I915_GEM_DOMAIN_GTT;
        obj->write_domain = 0;
index ebe735df65044ad9c495213740a509b8db84cec5..a1cb072e4a1b25130d8f4610af96bb921f34d2bf 100644 (file)
@@ -104,6 +104,7 @@ static const struct drm_i915_gem_object_ops fake_ops = {
 static struct drm_i915_gem_object *
 fake_dma_object(struct drm_i915_private *i915, u64 size)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_gem_object *obj;
 
        GEM_BUG_ON(!size);
@@ -117,7 +118,7 @@ fake_dma_object(struct drm_i915_private *i915, u64 size)
                goto err;
 
        drm_gem_private_object_init(&i915->drm, &obj->base, size);
-       i915_gem_object_init(obj, &fake_ops);
+       i915_gem_object_init(obj, &fake_ops, &lock_class);
 
        i915_gem_object_set_volatile(obj);
 
index 7b0c99ddc2d538b3609cc16f146a2bcdbe26180b..b2ad41c27e67644db8c8ca20ac69c4eda991f45a 100644 (file)
@@ -19,6 +19,7 @@ mock_object_create(struct intel_memory_region *mem,
                   resource_size_t size,
                   unsigned int flags)
 {
+       static struct lock_class_key lock_class;
        struct drm_i915_private *i915 = mem->i915;
        struct drm_i915_gem_object *obj;
 
@@ -30,7 +31,7 @@ mock_object_create(struct intel_memory_region *mem,
                return ERR_PTR(-ENOMEM);
 
        drm_gem_private_object_init(&i915->drm, &obj->base, size);
-       i915_gem_object_init(obj, &mock_region_obj_ops);
+       i915_gem_object_init(obj, &mock_region_obj_ops, &lock_class);
 
        obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;