[Intel-gfx] [PATCH 1/2] drm/i915: argument for deferring retirement

2012-01-24 Thread Ben Widawsky
Sometimes it may be the case when we idle the gpu or wait on something
we don't actually want to process the retiring list. This patch allows
callers to choose the behavior.

Signed-off-by: Ben Widawsky b...@bwidawsk.net
---
 drivers/gpu/drm/i915/i915_dma.c|2 +-
 drivers/gpu/drm/i915/i915_drv.h|8 +---
 drivers/gpu/drm/i915/i915_gem.c|   21 +++--
 drivers/gpu/drm/i915/i915_gem_evict.c  |2 +-
 drivers/gpu/drm/i915/i915_gem_execbuffer.c |2 +-
 drivers/gpu/drm/i915/i915_gem_gtt.c|2 +-
 6 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 8122738..1efc953 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -2131,7 +2131,7 @@ int i915_driver_unload(struct drm_device *dev)
unregister_shrinker(dev_priv-mm.inactive_shrinker);
 
mutex_lock(dev-struct_mutex);
-   ret = i915_gpu_idle(dev);
+   ret = i915_gpu_idle(dev, false);
if (ret)
DRM_ERROR(failed to idle hardware: %d\n, ret);
mutex_unlock(dev-struct_mutex);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f02a5f5..4fbe117 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1179,13 +1179,15 @@ void i915_gem_do_init(struct drm_device *dev,
  unsigned long start,
  unsigned long mappable_end,
  unsigned long end);
-int __must_check i915_gpu_idle(struct drm_device *dev);
+int __must_check i915_gpu_idle(struct drm_device *dev, bool defer_retirement);
 int __must_check i915_gem_idle(struct drm_device *dev);
 int __must_check i915_add_request(struct intel_ring_buffer *ring,
  struct drm_file *file,
  struct drm_i915_gem_request *request);
-int __must_check i915_wait_request(struct intel_ring_buffer *ring,
-  uint32_t seqno);
+int __must_check i915_gem_wait_request(struct intel_ring_buffer *ring,
+  uint32_t seqno,
+  bool defer_retirement);
+#define i915_wait_request(ring, seqno) i915_gem_wait_request(ring, seqno, 
false)
 int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
 int __must_check
 i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index eb98a7f..ad16de9 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1942,8 +1942,9 @@ i915_gem_retire_work_handler(struct work_struct *work)
  * request and object lists appropriately for that event.
  */
 int
-i915_wait_request(struct intel_ring_buffer *ring,
- uint32_t seqno)
+i915_gem_wait_request(struct intel_ring_buffer *ring,
+ uint32_t seqno,
+ bool defer_retirement)
 {
drm_i915_private_t *dev_priv = ring-dev-dev_private;
u32 ier;
@@ -2027,7 +2028,7 @@ i915_wait_request(struct intel_ring_buffer *ring,
 * buffer to have made it to the inactive list, and we would need
 * a separate wait queue to handle that.
 */
-   if (ret == 0)
+   if (ret == 0  !defer_retirement)
i915_gem_retire_requests_ring(ring);
 
return ret;
@@ -2172,7 +2173,7 @@ i915_gem_flush_ring(struct intel_ring_buffer *ring,
return 0;
 }
 
-static int i915_ring_idle(struct intel_ring_buffer *ring)
+static int i915_ring_idle(struct intel_ring_buffer *ring, bool 
defer_retirement)
 {
int ret;
 
@@ -2186,18 +2187,18 @@ static int i915_ring_idle(struct intel_ring_buffer 
*ring)
return ret;
}
 
-   return i915_wait_request(ring, i915_gem_next_request_seqno(ring));
+   return i915_gem_wait_request(ring, i915_gem_next_request_seqno(ring),
+defer_retirement);
 }
 
-int
-i915_gpu_idle(struct drm_device *dev)
+int i915_gpu_idle(struct drm_device *dev, bool defer_retirement)
 {
drm_i915_private_t *dev_priv = dev-dev_private;
int ret, i;
 
/* Flush everything onto the inactive list. */
for (i = 0; i  I915_NUM_RINGS; i++) {
-   ret = i915_ring_idle(dev_priv-ring[i]);
+   ret = i915_ring_idle(dev_priv-ring[i], defer_retirement);
if (ret)
return ret;
}
@@ -3710,7 +3711,7 @@ i915_gem_idle(struct drm_device *dev)
return 0;
}
 
-   ret = i915_gpu_idle(dev);
+   ret = i915_gpu_idle(dev, false);
if (ret) {
mutex_unlock(dev-struct_mutex);
return ret;
@@ -4201,7 +4202,7 @@ rescan:
 * This has a dramatic impact to reduce the number of
 * OOM-killer events whilst running 

Re: [Intel-gfx] [PATCH 1/2] drm/i915: argument for deferring retirement

2012-01-24 Thread Keith Packard
On Tue, 24 Jan 2012 14:42:02 -0800, Ben Widawsky b...@bwidawsk.net wrote:
 Sometimes it may be the case when we idle the gpu or wait on something
 we don't actually want to process the retiring list. This patch allows
 callers to choose the behavior.

bikeshed
!defer_retirement sounds like a double-negative to me, might be better
to have the parameter called 'do_retire' and change usage to match?
/bikeshed

In any case, this looks easy to understand to me.

Reviewed-by: Keith Packard kei...@keithp.com

-- 
keith.pack...@intel.com


pgp1vnLeujYEI.pgp
Description: PGP signature
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 1/2] drm/i915: argument for deferring retirement

2012-01-24 Thread Eugeni Dodonov
On Tue, Jan 24, 2012 at 20:42, Ben Widawsky b...@bwidawsk.net wrote:

 Sometimes it may be the case when we idle the gpu or wait on something
 we don't actually want to process the retiring list. This patch allows
 callers to choose the behavior.

 Signed-off-by: Ben Widawsky b...@bwidawsk.net


Reviewed-by: Eugeni Dodonov eugeni.dodo...@intel.com

(I agree with Keith comments though - defer retirement could be renamed to
do_retire or force_retire or similar..).

-- 
Eugeni Dodonov
http://eugeni.dodonov.net/
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx