summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-04-21 15:22:36 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2020-04-21 16:24:34 +0100
commitcf9ba27840c26f649a90bb04db5b455d47810292 (patch)
tree5333ed5a9ea73c02c020028bca990ea4cd05f687
parent4ea6b1c456273c6da43a503c55f9eaec2da331cf (diff)
drm/i915/selftests: Disable C-states when measuring RPS frequency response
Let's isolate the impact of cpu frequency selection on determing the GPU throughput in response to selection of RPS frequencies. For real systems, we do have to be concerned with the impact of integrating c-states, p-states and rp-states, but for the sake of proving whether or not RPS works, one baby step at a time. For the record, as one would hope, it does not seem to impact on the measured performance, but we do it anyway to reduce the number of variables. Later, we can extend the testing to encourage the the cpu/pkg to try and sleep while the GPU is busy. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200421142236.8614-1-chris@chris-wilson.co.uk Link: https://patchwork.freedesktop.org/patch/msgid/20200421142236.8614-1-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/gt/selftest_rps.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gt/selftest_rps.c b/drivers/gpu/drm/i915/gt/selftest_rps.c
index 395265121e43..e2afc2003caa 100644
--- a/drivers/gpu/drm/i915/gt/selftest_rps.c
+++ b/drivers/gpu/drm/i915/gt/selftest_rps.c
@@ -3,6 +3,7 @@
* Copyright © 2020 Intel Corporation
*/
+#include <linux/pm_qos.h>
#include <linux/sort.h>
#include "intel_engine_pm.h"
@@ -14,6 +15,9 @@
#include "selftests/igt_spinner.h"
#include "selftests/librapl.h"
+/* Try to isolate the impact of cstates from determing frequency response */
+#define CPU_LATENCY 0 /* -1 to disable pm_qos, 0 to disable cstates */
+
static void dummy_rps_work(struct work_struct *wrk)
{
}
@@ -406,6 +410,7 @@ int live_rps_frequency_cs(void *arg)
struct intel_gt *gt = arg;
struct intel_rps *rps = &gt->rps;
struct intel_engine_cs *engine;
+ struct pm_qos_request qos;
enum intel_engine_id id;
int err = 0;
@@ -421,6 +426,9 @@ int live_rps_frequency_cs(void *arg)
if (INTEL_GEN(gt->i915) < 8) /* for CS simplicity */
return 0;
+ if (CPU_LATENCY >= 0)
+ cpu_latency_qos_add_request(&qos, CPU_LATENCY);
+
intel_gt_pm_wait_for_idle(gt);
saved_work = rps->work.func;
rps->work.func = dummy_rps_work;
@@ -527,6 +535,9 @@ err_vma:
intel_gt_pm_wait_for_idle(gt);
rps->work.func = saved_work;
+ if (CPU_LATENCY >= 0)
+ cpu_latency_qos_remove_request(&qos);
+
return err;
}
@@ -536,6 +547,7 @@ int live_rps_frequency_srm(void *arg)
struct intel_gt *gt = arg;
struct intel_rps *rps = &gt->rps;
struct intel_engine_cs *engine;
+ struct pm_qos_request qos;
enum intel_engine_id id;
int err = 0;
@@ -551,6 +563,9 @@ int live_rps_frequency_srm(void *arg)
if (INTEL_GEN(gt->i915) < 8) /* for CS simplicity */
return 0;
+ if (CPU_LATENCY >= 0)
+ cpu_latency_qos_add_request(&qos, CPU_LATENCY);
+
intel_gt_pm_wait_for_idle(gt);
saved_work = rps->work.func;
rps->work.func = dummy_rps_work;
@@ -656,6 +671,9 @@ err_vma:
intel_gt_pm_wait_for_idle(gt);
rps->work.func = saved_work;
+ if (CPU_LATENCY >= 0)
+ cpu_latency_qos_remove_request(&qos);
+
return err;
}