Now that we have internal clients, rather than faking a whole drm_i915_file_private just for tracking RPS boosts, create a new struct intel_rps_client and pass it along when waiting. Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/i915_debugfs.c | 12 ++++++++---- drivers/gpu/drm/i915/i915_drv.h | 13 +++++++------ drivers/gpu/drm/i915/i915_gem.c | 24 +++++++++++++++--------- drivers/gpu/drm/i915/intel_drv.h | 2 +- drivers/gpu/drm/i915/intel_pm.c | 14 +++++++------- 5 files changed, 38 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 07742562c2a7..cc9ed6bdf155 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -2307,12 +2307,16 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) 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"); + file_priv->rps.boosts, + list_empty(&file_priv->rps.link) ? "" : ", active"); rcu_read_unlock(); } - seq_printf(m, "Semaphore boosts: %d\n", dev_priv->rps.semaphores.rps_boosts); - seq_printf(m, "MMIO flip boosts: %d\n", dev_priv->rps.mmioflips.rps_boosts); + seq_printf(m, "Semaphore boosts: %d%s\n", + dev_priv->rps.semaphores.boosts, + list_empty(&dev_priv->rps.semaphores.link) ? "" : ", active"); + seq_printf(m, "MMIO flip boosts: %d%s\n", + dev_priv->rps.mmioflips.boosts, + list_empty(&dev_priv->rps.mmioflips.link) ? "" : ", active"); seq_printf(m, "Kernel boosts: %d\n", dev_priv->rps.boosts); mutex_unlock(&dev_priv->rps.hw_lock); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7dd908962e12..4a73afd62c34 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -282,10 +282,12 @@ struct drm_i915_file_private { } mm; struct idr context_idr; - struct list_head rps_boost; - struct intel_engine_cs *bsd_ring; + struct intel_rps_client { + struct list_head link; + unsigned boosts; + } rps; - unsigned rps_boosts; + struct intel_engine_cs *bsd_ring; }; enum intel_dpll_id { @@ -1070,8 +1072,7 @@ struct intel_gen6_power_mgmt { struct list_head clients; unsigned boosts; - struct drm_i915_file_private semaphores; - struct drm_i915_file_private mmioflips; + struct intel_rps_client semaphores, mmioflips; /* manual wa residency calculations */ struct intel_rps_ei up_ei, down_ei; @@ -2822,7 +2823,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, unsigned reset_counter, bool interruptible, s64 *timeout, - struct drm_i915_file_private *file_priv); + struct intel_rps_client *rps); int __must_check i915_wait_request(struct drm_i915_gem_request *req); int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); int __must_check diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 90c33912ffd5..43ac75834e61 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1223,7 +1223,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, unsigned reset_counter, bool interruptible, s64 *timeout, - struct drm_i915_file_private *file_priv) + struct intel_rps_client *rps) { struct intel_engine_cs *ring = i915_gem_request_get_ring(req); struct drm_device *dev = ring->dev; @@ -1246,8 +1246,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) - gen6_rps_boost(dev_priv, file_priv); + if (INTEL_INFO(dev_priv)->gen >= 6) + gen6_rps_boost(dev_priv, rps); /* Record current time in case interrupted by signal, or wedged */ trace_i915_gem_request_wait_begin(req); @@ -1495,7 +1495,7 @@ i915_gem_object_retire_request(struct drm_i915_gem_object *obj, */ static __must_check int i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj, - struct drm_i915_file_private *file_priv, + struct intel_rps_client *rps, bool readonly) { struct drm_device *dev = obj->base.dev; @@ -1547,7 +1547,7 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj, mutex_unlock(&dev->struct_mutex); for (i = 0; ret == 0 && i < n; i++) ret = __i915_wait_request(requests[i], reset_counter, true, - NULL, file_priv); + NULL, rps); mutex_lock(&dev->struct_mutex); err: @@ -1560,6 +1560,12 @@ err: return ret; } +static struct intel_rps_client *to_rps_client(struct drm_file *file) +{ + struct drm_i915_file_private *fpriv = file->driver_priv; + return &fpriv->rps; +} + /** * Called when user space prepares to use an object with the CPU, either * through the mmap ioctl's mapping or a GTT mapping. @@ -1602,7 +1608,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, * to catch cases where we are gazumped. */ ret = i915_gem_object_wait_rendering__nonblocking(obj, - file->driver_priv, + to_rps_client(file), !write_domain); if (ret) goto unref; @@ -5167,9 +5173,9 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file) } spin_unlock(&file_priv->mm.lock); - if (!list_empty(&file_priv->rps_boost)) { + if (!list_empty(&file_priv->rps.link)) { mutex_lock(&to_i915(dev)->rps.hw_lock); - list_del(&file_priv->rps_boost); + list_del(&file_priv->rps.link); mutex_unlock(&to_i915(dev)->rps.hw_lock); } } @@ -5188,7 +5194,7 @@ int i915_gem_open(struct drm_device *dev, struct drm_file *file) file->driver_priv = file_priv; file_priv->dev_priv = dev->dev_private; file_priv->file = file; - INIT_LIST_HEAD(&file_priv->rps_boost); + INIT_LIST_HEAD(&file_priv->rps.link); spin_lock_init(&file_priv->mm.lock); INIT_LIST_HEAD(&file_priv->mm.request_list); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index cc37ba1e98fb..9eb0a911343a 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1361,7 +1361,7 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv); void gen6_rps_reset_ei(struct drm_i915_private *dev_priv); void gen6_rps_idle(struct drm_i915_private *dev_priv); void gen6_rps_boost(struct drm_i915_private *dev_priv, - struct drm_i915_file_private *file_priv); + struct intel_rps_client *rps); void intel_queue_rps_boost_for_request(struct drm_device *dev, struct drm_i915_gem_request *rq); void ilk_wm_get_hw_state(struct drm_device *dev); diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 16fb303c08cf..dcc52f928650 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -4122,7 +4122,7 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) } void gen6_rps_boost(struct drm_i915_private *dev_priv, - struct drm_i915_file_private *file_priv) + struct intel_rps_client *rps) { u32 val; @@ -4131,13 +4131,13 @@ void gen6_rps_boost(struct drm_i915_private *dev_priv, if (dev_priv->rps.enabled && dev_priv->mm.busy && dev_priv->rps.cur_freq < val && - (file_priv == NULL || list_empty(&file_priv->rps_boost))) { + (rps == NULL || list_empty(&rps->link))) { intel_set_rps(dev_priv->dev, val); dev_priv->rps.last_adj = 0; - if (file_priv != NULL) { - list_add(&file_priv->rps_boost, &dev_priv->rps.clients); - file_priv->rps_boosts++; + if (rps != NULL) { + list_add(&rps->link, &dev_priv->rps.clients); + rps->boosts++; } else dev_priv->rps.boosts++; } @@ -6861,8 +6861,8 @@ void intel_pm_setup(struct drm_device *dev) INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, intel_gen6_powersave_work); INIT_LIST_HEAD(&dev_priv->rps.clients); - INIT_LIST_HEAD(&dev_priv->rps.semaphores.rps_boost); - INIT_LIST_HEAD(&dev_priv->rps.mmioflips.rps_boost); + INIT_LIST_HEAD(&dev_priv->rps.semaphores.link); + INIT_LIST_HEAD(&dev_priv->rps.mmioflips.link); dev_priv->pm.suspended = false; } -- 2.1.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx