Re: [Intel-gfx] [PATCH 33/43] drm/i915/bdw: Help out the ctx switch interrupt handler

2014-08-14 Thread Daniel Vetter
On Thu, Jul 24, 2014 at 05:04:41PM +0100, Thomas Daniel wrote:
 From: Oscar Mateo oscar.ma...@intel.com
 
 If we receive a storm of requests for the same context (see 
 gem_storedw_loop_*)
 we might end up iterating over too many elements in interrupt time, looking 
 for
 contexts to squash together. Instead, share the burden by giving more
 intelligence to the queue function. At most, the interrupt will iterate over
 three elements.
 
 Signed-off-by: Oscar Mateo oscar.ma...@intel.com

I'll continue merging after this patch tomorrow.
-Daniel

 ---
  drivers/gpu/drm/i915/intel_lrc.c |   26 ++
  1 file changed, 22 insertions(+), 4 deletions(-)
 
 diff --git a/drivers/gpu/drm/i915/intel_lrc.c 
 b/drivers/gpu/drm/i915/intel_lrc.c
 index 895dbfc..829b15d 100644
 --- a/drivers/gpu/drm/i915/intel_lrc.c
 +++ b/drivers/gpu/drm/i915/intel_lrc.c
 @@ -384,9 +384,10 @@ static int execlists_context_queue(struct 
 intel_engine_cs *ring,
  struct intel_context *to,
  u32 tail)
  {
 - struct intel_ctx_submit_request *req = NULL;
 + struct drm_i915_private *dev_priv = ring-dev-dev_private;
 + struct intel_ctx_submit_request *req = NULL, *cursor;
   unsigned long flags;
 - bool was_empty;
 + int num_elements = 0;
  
   req = kzalloc(sizeof(*req), GFP_KERNEL);
   if (req == NULL)
 @@ -400,9 +401,26 @@ static int execlists_context_queue(struct 
 intel_engine_cs *ring,
  
   spin_lock_irqsave(ring-execlist_lock, flags);
  
 - was_empty = list_empty(ring-execlist_queue);
 + list_for_each_entry(cursor, ring-execlist_queue, execlist_link)
 + if (++num_elements  2)
 + break;
 +
 + if (num_elements  2) {
 + struct intel_ctx_submit_request *tail_req;
 +
 + tail_req = list_last_entry(ring-execlist_queue,
 + struct intel_ctx_submit_request,
 + execlist_link);
 + if (to == tail_req-ctx) {
 + WARN(tail_req-elsp_submitted != 0,
 + More than 2 already-submitted reqs 
 queued\n);
 + list_del(tail_req-execlist_link);
 + queue_work(dev_priv-wq, tail_req-work);
 + }
 + }
 +
   list_add_tail(req-execlist_link, ring-execlist_queue);
 - if (was_empty)
 + if (num_elements == 0)
   execlists_context_unqueue(ring);
  
   spin_unlock_irqrestore(ring-execlist_lock, flags);
 -- 
 1.7.9.5
 
 ___
 Intel-gfx mailing list
 Intel-gfx@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 33/43] drm/i915/bdw: Help out the ctx switch interrupt handler

2014-07-24 Thread Thomas Daniel
From: Oscar Mateo oscar.ma...@intel.com

If we receive a storm of requests for the same context (see gem_storedw_loop_*)
we might end up iterating over too many elements in interrupt time, looking for
contexts to squash together. Instead, share the burden by giving more
intelligence to the queue function. At most, the interrupt will iterate over
three elements.

Signed-off-by: Oscar Mateo oscar.ma...@intel.com
---
 drivers/gpu/drm/i915/intel_lrc.c |   26 ++
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 895dbfc..829b15d 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -384,9 +384,10 @@ static int execlists_context_queue(struct intel_engine_cs 
*ring,
   struct intel_context *to,
   u32 tail)
 {
-   struct intel_ctx_submit_request *req = NULL;
+   struct drm_i915_private *dev_priv = ring-dev-dev_private;
+   struct intel_ctx_submit_request *req = NULL, *cursor;
unsigned long flags;
-   bool was_empty;
+   int num_elements = 0;
 
req = kzalloc(sizeof(*req), GFP_KERNEL);
if (req == NULL)
@@ -400,9 +401,26 @@ static int execlists_context_queue(struct intel_engine_cs 
*ring,
 
spin_lock_irqsave(ring-execlist_lock, flags);
 
-   was_empty = list_empty(ring-execlist_queue);
+   list_for_each_entry(cursor, ring-execlist_queue, execlist_link)
+   if (++num_elements  2)
+   break;
+
+   if (num_elements  2) {
+   struct intel_ctx_submit_request *tail_req;
+
+   tail_req = list_last_entry(ring-execlist_queue,
+   struct intel_ctx_submit_request,
+   execlist_link);
+   if (to == tail_req-ctx) {
+   WARN(tail_req-elsp_submitted != 0,
+   More than 2 already-submitted reqs 
queued\n);
+   list_del(tail_req-execlist_link);
+   queue_work(dev_priv-wq, tail_req-work);
+   }
+   }
+
list_add_tail(req-execlist_link, ring-execlist_queue);
-   if (was_empty)
+   if (num_elements == 0)
execlists_context_unqueue(ring);
 
spin_unlock_irqrestore(ring-execlist_lock, flags);
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx