Re: [Intel-gfx] [PATCH 7/7] drm/i915: Deminish contribution of wait-boosting from clients
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
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
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)