Commit c471748d authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Daniel Vetter
Browse files

drm/i915: Move HAS_STRUCT_PAGE to obj->flags



We want to remove the changing of ops structure for attaching
phys pages, so we need to kill off HAS_STRUCT_PAGE from ops->flags,
and put it in the bo.

This will remove a potential race of dereferencing the wrong obj->ops
without ww mutex held.

Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
[danvet: apply with wiggle]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210323155059.628690-8-maarten.lankhorst@linux.intel.com
parent aaee716e
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -258,7 +258,7 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
	}
	}


	drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
	drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
	i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class);
	i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class, 0);
	obj->base.import_attach = attach;
	obj->base.import_attach = attach;
	obj->base.resv = dma_buf->resv;
	obj->base.resv = dma_buf->resv;


+3 −3
Original line number Original line Diff line number Diff line
@@ -138,8 +138,7 @@ static void i915_gem_object_put_pages_internal(struct drm_i915_gem_object *obj,


static const struct drm_i915_gem_object_ops i915_gem_object_internal_ops = {
static const struct drm_i915_gem_object_ops i915_gem_object_internal_ops = {
	.name = "i915_gem_object_internal",
	.name = "i915_gem_object_internal",
	.flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE |
	.flags = I915_GEM_OBJECT_IS_SHRINKABLE,
		 I915_GEM_OBJECT_IS_SHRINKABLE,
	.get_pages = i915_gem_object_get_pages_internal,
	.get_pages = i915_gem_object_get_pages_internal,
	.put_pages = i915_gem_object_put_pages_internal,
	.put_pages = i915_gem_object_put_pages_internal,
};
};
@@ -178,7 +177,8 @@ i915_gem_object_create_internal(struct drm_i915_private *i915,
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);


	drm_gem_private_object_init(&i915->drm, &obj->base, size);
	drm_gem_private_object_init(&i915->drm, &obj->base, size);
	i915_gem_object_init(obj, &i915_gem_object_internal_ops, &lock_class);
	i915_gem_object_init(obj, &i915_gem_object_internal_ops, &lock_class,
			     I915_BO_ALLOC_STRUCT_PAGE);


	/*
	/*
	 * Mark the object as volatile, such that the pages are marked as
	 * Mark the object as volatile, such that the pages are marked as
+2 −2
Original line number Original line Diff line number Diff line
@@ -40,13 +40,13 @@ int __i915_gem_lmem_object_init(struct intel_memory_region *mem,
	struct drm_i915_private *i915 = mem->i915;
	struct drm_i915_private *i915 = mem->i915;


	drm_gem_private_object_init(&i915->drm, &obj->base, size);
	drm_gem_private_object_init(&i915->drm, &obj->base, size);
	i915_gem_object_init(obj, &i915_gem_lmem_obj_ops, &lock_class);
	i915_gem_object_init(obj, &i915_gem_lmem_obj_ops, &lock_class, flags);


	obj->read_domains = I915_GEM_DOMAIN_WC | I915_GEM_DOMAIN_GTT;
	obj->read_domains = I915_GEM_DOMAIN_WC | I915_GEM_DOMAIN_GTT;


	i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);
	i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);


	i915_gem_object_init_memory_region(obj, mem, flags);
	i915_gem_object_init_memory_region(obj, mem);


	return 0;
	return 0;
}
}
+3 −4
Original line number Original line Diff line number Diff line
@@ -251,7 +251,7 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
		goto out;
		goto out;


	iomap = -1;
	iomap = -1;
	if (!i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_STRUCT_PAGE)) {
	if (!i915_gem_object_has_struct_page(obj)) {
		iomap = obj->mm.region->iomap.base;
		iomap = obj->mm.region->iomap.base;
		iomap -= obj->mm.region->region.start;
		iomap -= obj->mm.region->region.start;
	}
	}
@@ -653,9 +653,8 @@ __assign_mmap_offset(struct drm_file *file,
	}
	}


	if (mmap_type != I915_MMAP_TYPE_GTT &&
	if (mmap_type != I915_MMAP_TYPE_GTT &&
	    !i915_gem_object_type_has(obj,
	    !i915_gem_object_has_struct_page(obj) &&
				      I915_GEM_OBJECT_HAS_STRUCT_PAGE |
	    !i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM)) {
				      I915_GEM_OBJECT_HAS_IOMEM)) {
		err = -ENODEV;
		err = -ENODEV;
		goto out;
		goto out;
	}
	}
+3 −1
Original line number Original line Diff line number Diff line
@@ -60,7 +60,7 @@ void i915_gem_object_free(struct drm_i915_gem_object *obj)


void i915_gem_object_init(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 lock_class_key *key, unsigned flags)
{
{
	__mutex_init(&obj->mm.lock, ops->name ?: "obj->mm.lock", key);
	__mutex_init(&obj->mm.lock, ops->name ?: "obj->mm.lock", key);


@@ -78,6 +78,8 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
	init_rcu_head(&obj->rcu);
	init_rcu_head(&obj->rcu);


	obj->ops = ops;
	obj->ops = ops;
	GEM_BUG_ON(flags & ~I915_BO_ALLOC_FLAGS);
	obj->flags = flags;


	obj->mm.madv = I915_MADV_WILLNEED;
	obj->mm.madv = I915_MADV_WILLNEED;
	INIT_RADIX_TREE(&obj->mm.get_page.radix, GFP_KERNEL | __GFP_NOWARN);
	INIT_RADIX_TREE(&obj->mm.get_page.radix, GFP_KERNEL | __GFP_NOWARN);
Loading