summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-04-17 13:11:37 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2020-12-13 12:01:31 +0000
commit8157500b9e3beb53013cf7c5043b57439033a7d4 (patch)
tree5d41e92024ba8ae43f66b8f81497377ffea5598d
parent751aa68cb7b53f0a70a14200739b7dd0363eadf0 (diff)
i915/gem_exec_balancer: Kick tasklets harder
Tasklet scheduling can unfortunately be quite predicated. Where we are only caring about workload distribution and not initial execution latency (see kick_kthreads), make that kick more precise. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--lib/igt_debugfs.h7
-rw-r--r--tests/i915/gem_exec_balancer.c28
2 files changed, 24 insertions, 11 deletions
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index 08d8d044..6acf7027 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -184,6 +184,13 @@ void igt_require_hpd_storm_ctl(int fd);
*/
#define DROP_RCU 0x200
/**
+ * DROP_TASKLETS:
+ *
+ * Flushes the softirq tasklets on each CPU, such as used by the execution
+ * threads.
+ */
+#define DROP_TASKLETS 0x400
+/**
* DROP_ALL:
*
* All of the above DROP_ flags combined.
diff --git a/tests/i915/gem_exec_balancer.c b/tests/i915/gem_exec_balancer.c
index 54577c1e..571b28c4 100644
--- a/tests/i915/gem_exec_balancer.c
+++ b/tests/i915/gem_exec_balancer.c
@@ -28,6 +28,7 @@
#include "i915/gem.h"
#include "i915/gem_ring.h"
#include "igt.h"
+#include "igt_debugfs.h"
#include "igt_gt.h"
#include "igt_perf.h"
#include "sw_sync.h"
@@ -412,17 +413,20 @@ static void invalid_bonds(int i915)
gem_context_destroy(i915, p.ctx_id);
}
-static void kick_kthreads(void)
+static void kick_kthreads(int i915)
{
- usleep(20 * 1000); /* 20ms should be enough for ksoftirqd! */
+ if (igt_drop_caches_has(i915, DROP_TASKLETS))
+ igt_drop_caches_set(i915, DROP_TASKLETS);
+ else
+ usleep(20 * 1000); /* 20ms should be enough for ksoftirqd! */
}
-static double measure_load(int pmu, int period_us)
+static double measure_load(int i915, int pmu, int period_us)
{
uint64_t data[2];
uint64_t d_t, d_v;
- kick_kthreads();
+ kick_kthreads(i915);
igt_assert_eq(read(pmu, data, sizeof(data)), sizeof(data));
d_v = -data[0];
@@ -437,13 +441,14 @@ static double measure_load(int pmu, int period_us)
return d_v / (double)d_t;
}
-static double measure_min_load(int pmu, unsigned int num, int period_us)
+static double
+measure_min_load(int i915, int pmu, unsigned int num, int period_us)
{
uint64_t data[2 + num];
uint64_t d_t, d_v[num];
uint64_t min = -1, max = 0;
- kick_kthreads();
+ kick_kthreads(i915);
igt_assert_eq(read(pmu, data, sizeof(data)), sizeof(data));
for (unsigned int n = 0; n < num; n++)
@@ -471,12 +476,13 @@ static double measure_min_load(int pmu, unsigned int num, int period_us)
return min / (double)d_t;
}
-static void measure_all_load(int pmu, double *v, unsigned int num, int period_us)
+static void
+measure_all_load(int i915, int pmu, double *v, unsigned int num, int period_us)
{
uint64_t data[2 + num];
uint64_t d_t, d_v[num];
- kick_kthreads();
+ kick_kthreads(i915);
igt_assert_eq(read(pmu, data, sizeof(data)), sizeof(data));
for (unsigned int n = 0; n < num; n++)
@@ -534,7 +540,7 @@ static void check_individual_engine(int i915,
ci[idx].engine_instance));
spin = igt_spin_new(i915, .ctx = ctx, .engine = idx + 1);
- load = measure_load(pmu, 10000);
+ load = measure_load(i915, pmu, 10000);
igt_spin_free(i915, spin);
close(pmu);
@@ -684,7 +690,7 @@ static void bonded(int i915, unsigned int flags)
igt_spin_free(i915, plug);
}
- measure_all_load(pmu[0], v, limit + 1, 10000);
+ measure_all_load(i915, pmu[0], v, limit + 1, 10000);
igt_spin_free(i915, spin);
igt_assert_f(v[bond] > 0.90,
@@ -2079,7 +2085,7 @@ static void full(int i915, unsigned int flags)
close(fence);
}
- load = measure_min_load(pmu[0], count, 10000);
+ load = measure_min_load(i915, pmu[0], count, 10000);
igt_spin_free(i915, spin);
close(pmu[0]);