mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 07:36:44 +07:00
drm/i915: Convert RPS tracking to a intel_rps_client struct
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@chris-wilson.co.uk> [danvet: s/rq/req/] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
bcafc4e38b
commit
2e1b873072
@ -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);
|
||||
|
@ -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 {
|
||||
@ -1086,8 +1088,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;
|
||||
@ -2856,7 +2857,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
|
||||
|
@ -1221,7 +1221,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;
|
||||
@ -1244,8 +1244,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);
|
||||
@ -1493,7 +1493,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;
|
||||
@ -1545,7 +1545,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:
|
||||
@ -1558,6 +1558,12 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
|
||||
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.
|
||||
@ -1600,7 +1606,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;
|
||||
@ -5216,9 +5222,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);
|
||||
}
|
||||
}
|
||||
@ -5237,7 +5243,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);
|
||||
|
@ -1365,7 +1365,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 *req);
|
||||
void ilk_wm_get_hw_state(struct drm_device *dev);
|
||||
|
@ -4150,7 +4150,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;
|
||||
|
||||
@ -4159,13 +4159,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++;
|
||||
}
|
||||
@ -6884,8 +6884,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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user