aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-01-08 06:02:57 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-01-31 05:50:09 -0500
commit725a5b54028916cd2511a251c5b5b13d1715addc (patch)
treeab805f845785da85b8e6e80b073cd9b92573e4c6
parentf82855d342b6c8483c56e6d2e200a71731509a39 (diff)
drm/i915: Only run idle processing from i915_gem_retire_requests_worker
When adding the fb idle detection to mark-inactive, it was forgotten that userspace can drive the processing of retire-requests. We assumed that it would be principally driven by the retire requests worker, running once every second whilst active and so we would get the deferred timer for free. Instead we spend too many CPU cycles reclocking the LVDS preventing real work from being done. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reported-and-tested-by: Alexander Lam <lambchop468@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58843 Cc: stable@vger.kernel.org Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c3
-rw-r--r--drivers/gpu/drm/i915/intel_display.c12
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h3
3 files changed, 4 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 801f77ece72e..d7461771be2d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1899,9 +1899,6 @@ i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
1899 BUG_ON(obj->base.write_domain & ~I915_GEM_GPU_DOMAINS); 1899 BUG_ON(obj->base.write_domain & ~I915_GEM_GPU_DOMAINS);
1900 BUG_ON(!obj->active); 1900 BUG_ON(!obj->active);
1901 1901
1902 if (obj->pin_count) /* are we a framebuffer? */
1903 intel_mark_fb_idle(obj);
1904
1905 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list); 1902 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
1906 1903
1907 list_del_init(&obj->ring_list); 1904 list_del_init(&obj->ring_list);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 56c51ddf54ec..0d45487040d2 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6725,11 +6725,6 @@ void intel_mark_busy(struct drm_device *dev)
6725 6725
6726void intel_mark_idle(struct drm_device *dev) 6726void intel_mark_idle(struct drm_device *dev)
6727{ 6727{
6728}
6729
6730void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
6731{
6732 struct drm_device *dev = obj->base.dev;
6733 struct drm_crtc *crtc; 6728 struct drm_crtc *crtc;
6734 6729
6735 if (!i915_powersave) 6730 if (!i915_powersave)
@@ -6739,12 +6734,11 @@ void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
6739 if (!crtc->fb) 6734 if (!crtc->fb)
6740 continue; 6735 continue;
6741 6736
6742 if (to_intel_framebuffer(crtc->fb)->obj == obj) 6737 intel_decrease_pllclock(crtc);
6743 intel_increase_pllclock(crtc);
6744 } 6738 }
6745} 6739}
6746 6740
6747void intel_mark_fb_idle(struct drm_i915_gem_object *obj) 6741void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
6748{ 6742{
6749 struct drm_device *dev = obj->base.dev; 6743 struct drm_device *dev = obj->base.dev;
6750 struct drm_crtc *crtc; 6744 struct drm_crtc *crtc;
@@ -6757,7 +6751,7 @@ void intel_mark_fb_idle(struct drm_i915_gem_object *obj)
6757 continue; 6751 continue;
6758 6752
6759 if (to_intel_framebuffer(crtc->fb)->obj == obj) 6753 if (to_intel_framebuffer(crtc->fb)->obj == obj)
6760 intel_decrease_pllclock(crtc); 6754 intel_increase_pllclock(crtc);
6761 } 6755 }
6762} 6756}
6763 6757
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index fcdfe42e434c..13afb37d8dec 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -452,9 +452,8 @@ extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
452extern void intel_dvo_init(struct drm_device *dev); 452extern void intel_dvo_init(struct drm_device *dev);
453extern void intel_tv_init(struct drm_device *dev); 453extern void intel_tv_init(struct drm_device *dev);
454extern void intel_mark_busy(struct drm_device *dev); 454extern void intel_mark_busy(struct drm_device *dev);
455extern void intel_mark_idle(struct drm_device *dev);
456extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj); 455extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj);
457extern void intel_mark_fb_idle(struct drm_i915_gem_object *obj); 456extern void intel_mark_idle(struct drm_device *dev);
458extern bool intel_lvds_init(struct drm_device *dev); 457extern bool intel_lvds_init(struct drm_device *dev);
459extern bool intel_is_dual_link_lvds(struct drm_device *dev); 458extern bool intel_is_dual_link_lvds(struct drm_device *dev);
460extern void intel_dp_init(struct drm_device *dev, int output_reg, 459extern void intel_dp_init(struct drm_device *dev, int output_reg,