[PATCH 13/13] drm/i915: Drop struct_mutex requirement for unpin_from_display_plane
Chris Wilson
chris at chris-wilson.co.uk
Tue Jun 12 14:04:29 UTC 2018
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_drv.h | 12 +++++++++++-
drivers/gpu/drm/i915/i915_gem.c | 17 ++++++++++-------
drivers/gpu/drm/i915/intel_display.c | 13 +++++--------
drivers/gpu/drm/i915/intel_fbdev.c | 5 +----
4 files changed, 27 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 6d182c9ab786..633b4df8d8c9 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3195,12 +3195,22 @@ int __must_check
i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write);
int __must_check
i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write);
+
struct i915_vma * __must_check
i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
u32 alignment,
const struct i915_ggtt_view *view,
unsigned int flags);
-void i915_gem_object_unpin_from_display_plane(struct i915_vma *vma);
+
+void __i915_gem_object_unpin_from_display_plane(struct i915_vma *vma);
+static inline void
+i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
+{
+ mutex_lock(&vma->vm->mutex);
+ __i915_gem_object_unpin_from_display_plane(vma);
+ mutex_unlock(&vma->vm->mutex);
+}
+
int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
int align);
int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index fad904e5693b..51dd87e5c30b 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1673,10 +1673,11 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)
{
- struct drm_i915_private *i915;
+ struct drm_i915_private *i915 = to_i915(obj->base.dev);
struct list_head *list;
struct i915_vma *vma;
+ lockdep_assert_held(&i915->ggtt.vm.mutex);
GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
for_each_ggtt_vma(vma, obj) {
@@ -1686,10 +1687,10 @@ static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)
if (!drm_mm_node_allocated(&vma->node))
continue;
+ lockdep_assert_held(vma->vm->mutex);
list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
}
- i915 = to_i915(obj->base.dev);
spin_lock(&i915->mm.obj_lock);
list = obj->bind_count ? &i915->mm.bound_list : &i915->mm.unbound_list;
list_move_tail(&obj->mm.link, list);
@@ -1774,10 +1775,12 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
else
err = i915_gem_object_set_to_cpu_domain(obj, write_domain);
+ mutex_unlock(&dev->struct_mutex);
+
/* And bump the LRU for this access */
+ mutex_lock(&to_i915(dev)->ggtt.vm.mutex);
i915_gem_object_bump_inactive_ggtt(obj);
-
- mutex_unlock(&dev->struct_mutex);
+ mutex_unlock(&to_i915(dev)->ggtt.vm.mutex);
if (write_domain != 0)
intel_fb_obj_invalidate(obj,
@@ -4257,9 +4260,9 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
}
void
-i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
+__i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
{
- lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
+ lockdep_assert_held(&vma->vm->mutex);
if (WARN_ON(vma->obj->pin_global == 0))
return;
@@ -4270,7 +4273,7 @@ i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
/* Bump the LRU to try and avoid premature eviction whilst flipping */
i915_gem_object_bump_inactive_ggtt(vma->obj);
- i915_vma_unpin(vma);
+ __i915_vma_unpin(vma);
}
/**
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 2c16c3a3cdea..93a8b5dbc179 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2173,11 +2173,12 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags)
{
- lockdep_assert_held(&vma->vm->i915->drm.struct_mutex);
-
+ mutex_lock(&vma->vm->mutex);
if (flags & PLANE_HAS_FENCE)
- i915_vma_unpin_fence(vma);
- i915_gem_object_unpin_from_display_plane(vma);
+ __i915_vma_unpin_fence(vma);
+ __i915_gem_object_unpin_from_display_plane(vma);
+ mutex_unlock(&vma->vm->mutex);
+
i915_vma_put(vma);
}
@@ -13056,12 +13057,8 @@ void
intel_cleanup_plane_fb(struct drm_plane *plane,
struct drm_plane_state *old_state)
{
- struct drm_i915_private *dev_priv = to_i915(plane->dev);
-
/* Should only be called after a successful intel_prepare_plane_fb()! */
- mutex_lock(&dev_priv->drm.struct_mutex);
intel_plane_unpin_fb(to_intel_plane_state(old_state));
- mutex_unlock(&dev_priv->drm.struct_mutex);
}
int
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index fb2f9fce34cd..0997c9f763ee 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -517,11 +517,8 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
drm_fb_helper_fini(&ifbdev->helper);
- if (ifbdev->vma) {
- mutex_lock(&ifbdev->helper.dev->struct_mutex);
+ if (ifbdev->vma)
intel_unpin_fb_vma(ifbdev->vma, ifbdev->vma_flags);
- mutex_unlock(&ifbdev->helper.dev->struct_mutex);
- }
if (ifbdev->fb)
drm_framebuffer_remove(&ifbdev->fb->base);
--
2.17.1
More information about the Intel-gfx-trybot
mailing list