Commit fabef825 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Drop struct_mutex around frontbuffer flushes

Since the frontbuffer has self-contained locking, it does not require us
to hold the BKL struct_mutex as we send invalidate and flush messages.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170215105919.7347-3-chris@chris-wilson.co.ukReviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 24dbf51a
...@@ -45,6 +45,14 @@ ...@@ -45,6 +45,14 @@
#include <drm/i915_drm.h> #include <drm/i915_drm.h>
#include "i915_drv.h" #include "i915_drv.h"
static void intel_fbdev_invalidate(struct intel_fbdev *ifbdev)
{
struct drm_i915_gem_object *obj = ifbdev->fb->obj;
unsigned int origin = ifbdev->vma->fence ? ORIGIN_GTT : ORIGIN_CPU;
intel_fb_obj_invalidate(obj, origin);
}
static int intel_fbdev_set_par(struct fb_info *info) static int intel_fbdev_set_par(struct fb_info *info)
{ {
struct drm_fb_helper *fb_helper = info->par; struct drm_fb_helper *fb_helper = info->par;
...@@ -53,12 +61,8 @@ static int intel_fbdev_set_par(struct fb_info *info) ...@@ -53,12 +61,8 @@ static int intel_fbdev_set_par(struct fb_info *info)
int ret; int ret;
ret = drm_fb_helper_set_par(info); ret = drm_fb_helper_set_par(info);
if (ret == 0)
if (ret == 0) { intel_fbdev_invalidate(ifbdev);
mutex_lock(&fb_helper->dev->struct_mutex);
intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
mutex_unlock(&fb_helper->dev->struct_mutex);
}
return ret; return ret;
} }
...@@ -71,12 +75,8 @@ static int intel_fbdev_blank(int blank, struct fb_info *info) ...@@ -71,12 +75,8 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
int ret; int ret;
ret = drm_fb_helper_blank(blank, info); ret = drm_fb_helper_blank(blank, info);
if (ret == 0)
if (ret == 0) { intel_fbdev_invalidate(ifbdev);
mutex_lock(&fb_helper->dev->struct_mutex);
intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
mutex_unlock(&fb_helper->dev->struct_mutex);
}
return ret; return ret;
} }
...@@ -87,15 +87,11 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var, ...@@ -87,15 +87,11 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
struct drm_fb_helper *fb_helper = info->par; struct drm_fb_helper *fb_helper = info->par;
struct intel_fbdev *ifbdev = struct intel_fbdev *ifbdev =
container_of(fb_helper, struct intel_fbdev, helper); container_of(fb_helper, struct intel_fbdev, helper);
int ret; int ret;
ret = drm_fb_helper_pan_display(var, info);
if (ret == 0) { ret = drm_fb_helper_pan_display(var, info);
mutex_lock(&fb_helper->dev->struct_mutex); if (ret == 0)
intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT); intel_fbdev_invalidate(ifbdev);
mutex_unlock(&fb_helper->dev->struct_mutex);
}
return ret; return ret;
} }
...@@ -838,11 +834,6 @@ void intel_fbdev_restore_mode(struct drm_device *dev) ...@@ -838,11 +834,6 @@ void intel_fbdev_restore_mode(struct drm_device *dev)
if (!ifbdev->fb) if (!ifbdev->fb)
return; return;
if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper)) { if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper) == 0)
DRM_DEBUG("failed to restore crtc mode\n"); intel_fbdev_invalidate(ifbdev);
} else {
mutex_lock(&dev->struct_mutex);
intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
mutex_unlock(&dev->struct_mutex);
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment