Re: [Intel-gfx] [PATCH 7/7] drm/i915: Deminish contribution of wait-boosting from clients

2015-03-18 Thread Deepak S



On Friday 06 March 2015 08:36 PM, Chris Wilson wrote:

With boosting for missed pageflips, we have a much stronger indication
of when we need to (temporarily) boost GPU frequency to ensure smooth
delivery of frames. So now only allow each client to perform one RPS boost
in each period of GPU activity due to stalling on results.

Signed-off-by: Chris Wilson ch...@chris-wilson.co.uk
---
  drivers/gpu/drm/i915/i915_debugfs.c | 39 +
  drivers/gpu/drm/i915/i915_drv.h |  9 ++---
  drivers/gpu/drm/i915/i915_gem.c | 35 -
  drivers/gpu/drm/i915/intel_drv.h|  3 ++-
  drivers/gpu/drm/i915/intel_pm.c | 18 ++---
  5 files changed, 70 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index cc83cc0ff823..9366eaa50dba 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2245,6 +2245,44 @@ static int i915_ppgtt_info(struct seq_file *m, void 
*data)
return 0;
  }
  
+static int i915_rps_boost_info(struct seq_file *m, void *data)

+{
+   struct drm_info_node *node = m-private;
+   struct drm_device *dev = node-minor-dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   struct drm_file *file;
+   int ret;
+
+   ret = mutex_lock_interruptible(dev-struct_mutex);
+   if (ret)
+   return ret;
+
+   ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
+   if (ret)
+   goto unlock;
+
+   list_for_each_entry_reverse(file, dev-filelist, lhead) {
+   struct drm_i915_file_private *file_priv = file-driver_priv;
+   struct task_struct *task;
+
+   rcu_read_lock();
+   task = pid_task(file-pid, PIDTYPE_PID);
+   seq_printf(m, %s [%d]: %d boosts%s\n,
+  task ? task-comm : unknown,
+  task ? task-pid : -1,
+  file_priv-rps_boosts,
+  list_empty(file_priv-rps_boost) ?  : , active);
+   rcu_read_unlock();
+   }
+   seq_printf(m, Kernel boosts: %d\n, dev_priv-rps.boosts);
+
+   mutex_unlock(dev_priv-rps.hw_lock);
+unlock:
+   mutex_unlock(dev-struct_mutex);
+
+   return ret;
+}
+
  static int i915_llc(struct seq_file *m, void *data)
  {
struct drm_info_node *node = m-private;
@@ -4680,6 +4718,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
{i915_ddb_info, i915_ddb_info, 0},
{i915_sseu_status, i915_sseu_status, 0},
{i915_drrs_status, i915_drrs_status, 0},
+   {i915_rps_boost_info, i915_rps_boost_info, 0},
  };
  #define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
  
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h

index bfa6e11f802e..b207d2cec9dc 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1036,6 +1036,8 @@ struct intel_gen6_power_mgmt {
  
  	bool enabled;

struct delayed_work delayed_resume_work;
+   struct list_head clients;
+   unsigned boosts;
  
  	/* manual wa residency calculations */

struct intel_rps_ei up_ei, down_ei;
@@ -2137,12 +2139,13 @@ struct drm_i915_file_private {
struct {
spinlock_t lock;
struct list_head request_list;
-   struct delayed_work idle_work;
} mm;
struct idr context_idr;
  
-	atomic_t rps_wait_boost;

-   struct  intel_engine_cs *bsd_ring;
+   struct list_head rps_boost;
+   struct intel_engine_cs *bsd_ring;
+
+   unsigned rps_boosts;
  };
  
  /*

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index b266b31690e4..a0c35f80836c 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1191,14 +1191,6 @@ static bool missed_irq(struct drm_i915_private *dev_priv,
return test_bit(ring-id, dev_priv-gpu_error.missed_irq_rings);
  }
  
-static bool can_wait_boost(struct drm_i915_file_private *file_priv)

-{
-   if (file_priv == NULL)
-   return true;
-
-   return !atomic_xchg(file_priv-rps_wait_boost, true);
-}
-
  /**
   * __i915_wait_request - wait until execution of request has finished
   * @req: duh!
@@ -1240,13 +1232,8 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
timeout_expire = timeout ?
jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0;
  
-	if (INTEL_INFO(dev)-gen = 6  ring-id == RCS  can_wait_boost(file_priv)) {

-   gen6_rps_boost(dev_priv);
-   if (file_priv)
-   mod_delayed_work(dev_priv-wq,
-file_priv-mm.idle_work,
-msecs_to_jiffies(100));
-   }
+   if (ring-id == RCS  INTEL_INFO(dev)-gen = 6)
+   

[Intel-gfx] [PATCH 7/7] drm/i915: Deminish contribution of wait-boosting from clients

2015-03-06 Thread Chris Wilson
With boosting for missed pageflips, we have a much stronger indication
of when we need to (temporarily) boost GPU frequency to ensure smooth
delivery of frames. So now only allow each client to perform one RPS boost
in each period of GPU activity due to stalling on results.

Signed-off-by: Chris Wilson ch...@chris-wilson.co.uk
---
 drivers/gpu/drm/i915/i915_debugfs.c | 39 +
 drivers/gpu/drm/i915/i915_drv.h |  9 ++---
 drivers/gpu/drm/i915/i915_gem.c | 35 -
 drivers/gpu/drm/i915/intel_drv.h|  3 ++-
 drivers/gpu/drm/i915/intel_pm.c | 18 ++---
 5 files changed, 70 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index cc83cc0ff823..9366eaa50dba 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2245,6 +2245,44 @@ static int i915_ppgtt_info(struct seq_file *m, void 
*data)
return 0;
 }
 
+static int i915_rps_boost_info(struct seq_file *m, void *data)
+{
+   struct drm_info_node *node = m-private;
+   struct drm_device *dev = node-minor-dev;
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   struct drm_file *file;
+   int ret;
+
+   ret = mutex_lock_interruptible(dev-struct_mutex);
+   if (ret)
+   return ret;
+
+   ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
+   if (ret)
+   goto unlock;
+
+   list_for_each_entry_reverse(file, dev-filelist, lhead) {
+   struct drm_i915_file_private *file_priv = file-driver_priv;
+   struct task_struct *task;
+
+   rcu_read_lock();
+   task = pid_task(file-pid, PIDTYPE_PID);
+   seq_printf(m, %s [%d]: %d boosts%s\n,
+  task ? task-comm : unknown,
+  task ? task-pid : -1,
+  file_priv-rps_boosts,
+  list_empty(file_priv-rps_boost) ?  : , active);
+   rcu_read_unlock();
+   }
+   seq_printf(m, Kernel boosts: %d\n, dev_priv-rps.boosts);
+
+   mutex_unlock(dev_priv-rps.hw_lock);
+unlock:
+   mutex_unlock(dev-struct_mutex);
+
+   return ret;
+}
+
 static int i915_llc(struct seq_file *m, void *data)
 {
struct drm_info_node *node = m-private;
@@ -4680,6 +4718,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
{i915_ddb_info, i915_ddb_info, 0},
{i915_sseu_status, i915_sseu_status, 0},
{i915_drrs_status, i915_drrs_status, 0},
+   {i915_rps_boost_info, i915_rps_boost_info, 0},
 };
 #define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
 
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index bfa6e11f802e..b207d2cec9dc 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1036,6 +1036,8 @@ struct intel_gen6_power_mgmt {
 
bool enabled;
struct delayed_work delayed_resume_work;
+   struct list_head clients;
+   unsigned boosts;
 
/* manual wa residency calculations */
struct intel_rps_ei up_ei, down_ei;
@@ -2137,12 +2139,13 @@ struct drm_i915_file_private {
struct {
spinlock_t lock;
struct list_head request_list;
-   struct delayed_work idle_work;
} mm;
struct idr context_idr;
 
-   atomic_t rps_wait_boost;
-   struct  intel_engine_cs *bsd_ring;
+   struct list_head rps_boost;
+   struct intel_engine_cs *bsd_ring;
+
+   unsigned rps_boosts;
 };
 
 /*
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index b266b31690e4..a0c35f80836c 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1191,14 +1191,6 @@ static bool missed_irq(struct drm_i915_private *dev_priv,
return test_bit(ring-id, dev_priv-gpu_error.missed_irq_rings);
 }
 
-static bool can_wait_boost(struct drm_i915_file_private *file_priv)
-{
-   if (file_priv == NULL)
-   return true;
-
-   return !atomic_xchg(file_priv-rps_wait_boost, true);
-}
-
 /**
  * __i915_wait_request - wait until execution of request has finished
  * @req: duh!
@@ -1240,13 +1232,8 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
timeout_expire = timeout ?
jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0;
 
-   if (INTEL_INFO(dev)-gen = 6  ring-id == RCS  
can_wait_boost(file_priv)) {
-   gen6_rps_boost(dev_priv);
-   if (file_priv)
-   mod_delayed_work(dev_priv-wq,
-file_priv-mm.idle_work,
-msecs_to_jiffies(100));
-   }
+   if (ring-id == RCS  INTEL_INFO(dev)-gen = 6)
+   gen6_rps_boost(dev_priv, file_priv);
 
if (!irq_test_in_progress  

Re: [Intel-gfx] [PATCH 7/7] drm/i915: Deminish contribution of wait-boosting from clients

2015-03-06 Thread shuang . he
Tested-By: PRC QA PRTS (Patch Regression Test System Contact: 
shuang...@intel.com)
Task id: 5906
-Summary-
Platform  Delta  drm-intel-nightly  Series Applied
PNV -6  275/275  269/275
ILK  307/307  307/307
SNB  284/284  284/284
IVB  375/375  375/375
BYT -92  294/294  202/294
HSW -2  385/385  383/385
BDW -1  314/314  313/314
-Detailed-
Platform  Testdrm-intel-nightly  Series 
Applied
*PNV  igt_gem_fence_thrash_bo-write-verify-none  PASS(2)  FAIL(1)PASS(1)
*PNV  igt_gem_fence_thrash_bo-write-verify-x  PASS(2)  FAIL(1)PASS(1)
*PNV  igt_gem_fence_thrash_bo-write-verify-y  PASS(2)  FAIL(1)PASS(1)
 PNV  igt_gem_userptr_blits_minor-normal-sync  DMESG_WARN(2)PASS(1)  
DMESG_WARN(1)PASS(1)
 PNV  igt_gen3_render_tiledx_blits  FAIL(1)PASS(4)  FAIL(1)PASS(1)
 PNV  igt_gen3_render_tiledy_blits  FAIL(1)PASS(2)  FAIL(1)PASS(1)
*BYT  igt_drm_read_empty-block  PASS(2)  DMESG_WARN(1)
*BYT  igt_drm_vma_limiter  PASS(2)  DMESG_WARN(1)
*BYT  igt_drm_vma_limiter_cpu  PASS(2)  DMESG_WARN(1)
*BYT  igt_drm_vma_limiter_gtt  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_ctx_basic  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_double_irq_loop  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_dummy_reloc_loop_blt  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_dummy_reloc_loop_bsd  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_dummy_reloc_loop_mixed  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_dummy_reloc_loop_mixed_multi_fd  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fd_exhaustion  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fenced_exec_thrash_2-spare-fences  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fenced_exec_thrash_no-spare-fences  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fenced_exec_thrash_no-spare-fences-interruptible  PASS(2) 
 DMESG_WARN(1)
*BYT  igt_gem_fenced_exec_thrash_too-many-fences  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fence_thrash_bo-copy  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fence_thrash_bo-write-verify-none  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fence_thrash_bo-write-verify-x  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_fence_thrash_bo-write-verify-y  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_flink_race_flink_close  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_gtt_speed  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_largeobject  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_copy  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_fault-concurrent  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_short  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_write  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_write-gtt  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_write-gtt-no-prefault  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_gtt_write-no-prefault  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_mmap_offset_exhaustion  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_persistent_relocs_forked  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_persistent_relocs_forked-faulting-reloc  PASS(2)  
DMESG_WARN(1)
*BYT  igt_gem_persistent_relocs_forked-interruptible  PASS(2)  
DMESG_WARN(1)
*BYT  igt_gem_persistent_relocs_forked-interruptible-faulting-reloc  
PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pread_display  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pread_normal  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pread_snoop  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pread_uncached  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pwrite_display  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pwrite_normal  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pwrite_snoop  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_pwrite_uncached  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_reg_read  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_reloc_vs_gpu_forked-faulting-reloc-thrashing  PASS(2)  
DMESG_WARN(1)
*BYT  igt_gem_reloc_vs_gpu_forked-interruptible-faulting-reloc-thrash-inactive  
PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_reloc_vs_gpu_forked-interruptible-faulting-reloc-thrashing  
PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_set_tiling_vs_gtt  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_threaded_access_tiled  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_tiled_partial_pwrite_pread_reads  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_tiled_partial_pwrite_pread_writes  PASS(2)  DMESG_WARN(1)
*BYT  igt_gem_tiled_partial_pwrite_pread_writes-after-reads  PASS(2)