diff mbox

drm/i915: Only run idle processing from i915_gem_retire_requests_worker

Message ID 1357642977-8629-1-git-send-email-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson Jan. 8, 2013, 11:02 a.m. UTC
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
---
 drivers/gpu/drm/i915/i915_gem.c      |    3 ---
 drivers/gpu/drm/i915/intel_display.c |   12 +++---------
 drivers/gpu/drm/i915/intel_drv.h     |    3 +--
 3 files changed, 4 insertions(+), 14 deletions(-)

Comments

Chris Wilson Jan. 28, 2013, 11:02 a.m. UTC | #1
On Tue, Jan 08, 2013 at 11:02:57AM +0000, Chris Wilson wrote:
> 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

Poke.
-Chris
Rodrigo Vivi Jan. 30, 2013, 5:32 p.m. UTC | #2
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>


On Mon, Jan 28, 2013 at 9:02 AM, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> On Tue, Jan 08, 2013 at 11:02:57AM +0000, Chris Wilson wrote:
>> 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
>
> Poke.
> -Chris
>
> --
> Chris Wilson, Intel Open Source Technology Centre
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter Jan. 30, 2013, 5:45 p.m. UTC | #3
On Wed, Jan 30, 2013 at 03:32:33PM -0200, Rodrigo Vivi wrote:
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
> 
> 
> On Mon, Jan 28, 2013 at 9:02 AM, Chris Wilson <chris@chris-wilson.co.uk> wrote:
> > On Tue, Jan 08, 2013 at 11:02:57AM +0000, Chris Wilson wrote:
> >> 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
> >
> > Poke.

Queued for -next, thanks for the patch.
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 5791ecd..6d8cfa0 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1911,9 +1911,6 @@  i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
 	BUG_ON(obj->base.write_domain & ~I915_GEM_GPU_DOMAINS);
 	BUG_ON(!obj->active);
 
-	if (obj->pin_count) /* are we a framebuffer? */
-		intel_mark_fb_idle(obj);
-
 	list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
 	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 a9fb046..4ffe214 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6993,11 +6993,6 @@  void intel_mark_busy(struct drm_device *dev)
 
 void intel_mark_idle(struct drm_device *dev)
 {
-}
-
-void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
-{
-	struct drm_device *dev = obj->base.dev;
 	struct drm_crtc *crtc;
 
 	if (!i915_powersave)
@@ -7007,12 +7002,11 @@  void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
 		if (!crtc->fb)
 			continue;
 
-		if (to_intel_framebuffer(crtc->fb)->obj == obj)
-			intel_increase_pllclock(crtc);
+		intel_decrease_pllclock(crtc);
 	}
 }
 
-void intel_mark_fb_idle(struct drm_i915_gem_object *obj)
+void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
 {
 	struct drm_device *dev = obj->base.dev;
 	struct drm_crtc *crtc;
@@ -7025,7 +7019,7 @@  void intel_mark_fb_idle(struct drm_i915_gem_object *obj)
 			continue;
 
 		if (to_intel_framebuffer(crtc->fb)->obj == obj)
-			intel_decrease_pllclock(crtc);
+			intel_increase_pllclock(crtc);
 	}
 }
 
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 8a1bd4a..ac92720 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -439,9 +439,8 @@  extern bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg,
 extern void intel_dvo_init(struct drm_device *dev);
 extern void intel_tv_init(struct drm_device *dev);
 extern void intel_mark_busy(struct drm_device *dev);
-extern void intel_mark_idle(struct drm_device *dev);
 extern void intel_mark_fb_busy(struct drm_i915_gem_object *obj);
-extern void intel_mark_fb_idle(struct drm_i915_gem_object *obj);
+extern void intel_mark_idle(struct drm_device *dev);
 extern bool intel_lvds_init(struct drm_device *dev);
 extern void intel_dp_init(struct drm_device *dev, int output_reg,
 			  enum port port);