[PATCH 40/40] rps-double-boost-nospin
Chris Wilson
chris at chris-wilson.co.uk
Thu Jan 4 14:35:40 UTC 2018
---
drivers/gpu/drm/i915/i915_debugfs.c | 3 +--
drivers/gpu/drm/i915/i915_drv.h | 2 +-
drivers/gpu/drm/i915/i915_gem_request.c | 2 +-
drivers/gpu/drm/i915/i915_irq.c | 2 +-
drivers/gpu/drm/i915/intel_gt_pm.c | 18 +++++++++++-------
drivers/gpu/drm/i915/intel_pm.c | 2 --
6 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index fdb2c71888c1..5989c6ab86a5 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2162,8 +2162,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
seq_printf(m, "GPU busy? %s [%d requests]\n",
yesno(dev_priv->gt.awake), dev_priv->gt.active_requests);
seq_printf(m, "CPU waiting? %d\n", count_irq_waiters(dev_priv));
- seq_printf(m, "Boosts outstanding? %d\n",
- atomic_read(&rps->num_waiters));
+ seq_printf(m, "Boosts outstanding? %d\n", READ_ONCE(rps->num_waiters));
seq_printf(m, "Frequency requested %d\n",
intel_gpu_freq(dev_priv, rps->cur_freq));
seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n",
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d235b0bfb89a..f61e55d4ffec 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -932,7 +932,7 @@ struct intel_rps {
enum { LOW_POWER, BETWEEN, HIGH_POWER } power;
bool enabled;
- atomic_t num_waiters;
+ unsigned int num_waiters;
atomic_t boosts;
/* manual wa residency calculations */
diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index fe4ce873501b..e7291019a573 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -441,7 +441,7 @@ static void i915_gem_request_retire(struct drm_i915_gem_request *request)
spin_lock_irq(&request->lock);
if (request->waitboost)
- atomic_dec(&request->i915->gt_pm.rps.num_waiters);
+ request->i915->gt_pm.rps.num_waiters--;
if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &request->fence.flags))
dma_fence_signal_locked(&request->fence);
if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags))
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index ea290f102784..a59ecd550d73 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1192,7 +1192,7 @@ static void gen6_pm_rps_work(struct work_struct *work)
spin_lock_irq(&dev_priv->irq_lock);
if (rps->interrupts_enabled) {
pm_iir = fetch_and_zero(&rps->pm_iir);
- client_boost = atomic_read(&rps->num_waiters);
+ client_boost = READ_ONCE(rps->num_waiters);
}
spin_unlock_irq(&dev_priv->irq_lock);
diff --git a/drivers/gpu/drm/i915/intel_gt_pm.c b/drivers/gpu/drm/i915/intel_gt_pm.c
index 088ed443dfc7..7a328896de82 100644
--- a/drivers/gpu/drm/i915/intel_gt_pm.c
+++ b/drivers/gpu/drm/i915/intel_gt_pm.c
@@ -478,7 +478,6 @@ void gen6_rps_boost(struct drm_i915_gem_request *rq,
struct intel_rps_client *rps_client)
{
struct intel_rps *rps = &rq->i915->gt_pm.rps;
- unsigned long flags;
bool boost;
/* This is intentionally racy! We peek at the state here, then
@@ -487,14 +486,19 @@ void gen6_rps_boost(struct drm_i915_gem_request *rq,
if (!rps->enabled)
return;
+ if (rq->waitboost)
+ return;
+
boost = false;
- spin_lock_irqsave(&rq->lock, flags);
- if (!rq->waitboost && !i915_gem_request_completed(rq)) {
- atomic_inc(&rps->num_waiters);
- rq->waitboost = true;
- boost = true;
+ if (!cmpxchg(&rq->waitboost, false, true)) {
+ unsigned long flags;
+
+ /* Serialize with i915_gem_request_retire() */
+ spin_lock_irqsave(&rq->lock, flags);
+ if (!i915_gem_request_completed(rq))
+ boost = !rps->num_waiters++;
+ spin_unlock_irqrestore(&rq->lock, flags);
}
- spin_unlock_irqrestore(&rq->lock, flags);
if (!boost)
return;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 5d88b164acfc..d9c2f7fbd402 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7034,8 +7034,6 @@ void intel_pm_setup(struct drm_i915_private *dev_priv)
{
mutex_init(&dev_priv->pcu_lock);
- atomic_set(&dev_priv->gt_pm.rps.num_waiters, 0);
-
dev_priv->runtime_pm.suspended = false;
atomic_set(&dev_priv->runtime_pm.wakeref_count, 0);
}
--
2.15.1
More information about the Intel-gfx-trybot
mailing list