[PATCH 2/2] now
Chris Wilson
chris at chris-wilson.co.uk
Wed Jun 17 12:49:59 UTC 2020
---
drivers/gpu/drm/i915/gt/intel_engine.h | 10 +++++++++-
drivers/gpu/drm/i915/gt/intel_engine_cs.c | 12 +++++++-----
drivers/gpu/drm/i915/gt/selftest_engine_pm.c | 17 +++++++----------
3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h b/drivers/gpu/drm/i915/gt/intel_engine.h
index 791897f8d847..0f2b8613286b 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine.h
@@ -334,7 +334,15 @@ void intel_engine_dump(struct intel_engine_cs *engine,
struct drm_printer *m,
const char *header, ...);
-ktime_t intel_engine_get_busy_time(struct intel_engine_cs *engine);
+ktime_t __intel_engine_get_busy_time(struct intel_engine_cs *engine,
+ ktime_t *now);
+
+static inline ktime_t intel_engine_get_busy_time(struct intel_engine_cs *engine)
+{
+ ktime_t dummy;
+
+ return __intel_engine_get_busy_time(engine, &dummy);
+}
struct i915_request *
intel_engine_find_active_request(struct intel_engine_cs *engine);
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 045179c65c44..916018909a9e 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -1595,7 +1595,7 @@ void intel_engine_dump(struct intel_engine_cs *engine,
intel_engine_print_breadcrumbs(engine, m);
}
-static ktime_t __intel_engine_get_busy_time(struct intel_engine_cs *engine)
+static ktime_t __get_busy_time(struct intel_engine_cs *engine, ktime_t *now)
{
ktime_t total = engine->stats.total;
@@ -1603,9 +1603,9 @@ static ktime_t __intel_engine_get_busy_time(struct intel_engine_cs *engine)
* If the engine is executing something at the moment
* add it to the total.
*/
+ *now = ktime_get();
if (atomic_read(&engine->stats.active))
- total = ktime_add(total,
- ktime_sub(ktime_get(), engine->stats.start));
+ total = ktime_add(total, ktime_sub(*now, engine->stats.start));
return total;
}
@@ -1613,17 +1613,19 @@ static ktime_t __intel_engine_get_busy_time(struct intel_engine_cs *engine)
/**
* intel_engine_get_busy_time() - Return current accumulated engine busyness
* @engine: engine to report on
+ * @now: monotonic timestamp of sampling
*
* Returns accumulated time @engine was busy since engine stats were enabled.
*/
-ktime_t intel_engine_get_busy_time(struct intel_engine_cs *engine)
+ktime_t __intel_engine_get_busy_time(struct intel_engine_cs *engine,
+ ktime_t *now)
{
unsigned int seq;
ktime_t total;
do {
seq = read_seqbegin(&engine->stats.lock);
- total = __intel_engine_get_busy_time(engine);
+ total = __get_busy_time(engine, now);
} while (read_seqretry(&engine->stats.lock, seq));
return total;
diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_pm.c b/drivers/gpu/drm/i915/gt/selftest_engine_pm.c
index dd54dcb5cca2..9ad9c8b55e4a 100644
--- a/drivers/gpu/drm/i915/gt/selftest_engine_pm.c
+++ b/drivers/gpu/drm/i915/gt/selftest_engine_pm.c
@@ -29,8 +29,8 @@ static int live_engine_busy_stats(void *arg)
GEM_BUG_ON(intel_gt_pm_is_awake(gt));
for_each_engine(engine, gt, id) {
struct i915_request *rq;
- ktime_t de;
- u64 dt;
+ ktime_t de, dt;
+ ktime_t t[2];
if (!intel_engine_supports_stats(engine))
continue;
@@ -47,11 +47,9 @@ static int live_engine_busy_stats(void *arg)
ENGINE_TRACE(engine, "measuring idle time\n");
preempt_disable();
- dt = ktime_to_ns(ktime_get());
- de = intel_engine_get_busy_time(engine);
+ de = __intel_engine_get_busy_time(engine, &t[0]);
udelay(100);
- de = ktime_sub(intel_engine_get_busy_time(engine), de);
- dt = ktime_to_ns(ktime_get()) - dt;
+ de = ktime_sub(__intel_engine_get_busy_time(engine, &t[1]), de);
preempt_enable();
if (de < 0 || de > 10) {
pr_err("%s: reported %lldns [%d%%] busyness while sleeping [for %lldns]\n",
@@ -80,12 +78,11 @@ static int live_engine_busy_stats(void *arg)
ENGINE_TRACE(engine, "measuring busy time\n");
preempt_disable();
- dt = ktime_to_ns(ktime_get());
- de = intel_engine_get_busy_time(engine);
+ de = __intel_engine_get_busy_time(engine, &t[0]);
udelay(100);
- de = ktime_sub(intel_engine_get_busy_time(engine), de);
- dt = ktime_to_ns(ktime_get()) - dt;
+ de = ktime_sub(__intel_engine_get_busy_time(engine, &t[1]), de);
preempt_enable();
+ dt = ktime_sub(t[1], t[0]);
if (100 * de < 95 * dt || 95 * de > 100 * dt) {
pr_err("%s: reported %lldns [%d%%] busyness while spinning [for %lldns]\n",
engine->name,
--
2.20.1
More information about the Intel-gfx-trybot
mailing list