[Intel-gfx] [PATCH igt] igt/gem_flink_race: Limit name subtest to 5s
Chris Wilson
chris at chris-wilson.co.uk
Wed Aug 30 10:13:23 UTC 2017
At present, we try to do 1,000,000 cycles, which may be a reasonable
estimate for detecting the race, takes 6 minutes in practice on bxt on a
good day (as it spends more time doing rpm suspend/resume than actual work,
and that accounts for more of the relative difference in performance
between bxt and big core than the difference in clocks+ipc).
An ideal solution would be to have a data-race detector in the kernel
combined with a short test to exercise the different paths. Lacking the
DRD, use a shorter test anyway. 5s is chosen simply on the basis that
the other race subtest is also run over a 5s interval.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
tests/gem_flink_race.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/tests/gem_flink_race.c b/tests/gem_flink_race.c
index 30e33f65..baee285f 100644
--- a/tests/gem_flink_race.c
+++ b/tests/gem_flink_race.c
@@ -49,8 +49,14 @@ IGT_TEST_DESCRIPTION("Check for flink/open vs. gem close races.");
volatile int pls_die = 0;
int fd;
+struct flink_name {
+ pthread_t thread;
+ unsigned long count;
+};
+
static void *thread_fn_flink_name(void *p)
{
+ struct flink_name *t = p;
struct drm_gem_open open_struct;
int ret;
@@ -65,6 +71,7 @@ static void *thread_fn_flink_name(void *p)
igt_assert(name == 1);
gem_close(fd, open_struct.handle);
+ t->count++;
} else
igt_assert(errno == ENOENT);
}
@@ -72,42 +79,50 @@ static void *thread_fn_flink_name(void *p)
return (void *)0;
}
-static void test_flink_name(void)
+static void test_flink_name(int timeout)
{
- pthread_t *threads;
+ struct flink_name *threads;
int r, i, num_threads;
+ unsigned long count;
+ char buf[256];
void *status;
+ int len;
num_threads = sysconf(_SC_NPROCESSORS_ONLN) - 1;
if (!num_threads)
num_threads = 1;
- threads = calloc(num_threads, sizeof(pthread_t));
+ threads = calloc(num_threads, sizeof(*threads));
fd = drm_open_driver(DRIVER_INTEL);
for (i = 0; i < num_threads; i++) {
- r = pthread_create(&threads[i], NULL,
- thread_fn_flink_name, NULL);
+ r = pthread_create(&threads[i].thread, NULL,
+ thread_fn_flink_name, &threads[i]);
igt_assert_eq(r, 0);
}
- for (i = 0; i < 1000000; i++) {
+ count = 0;
+ igt_until_timeout(timeout) {
uint32_t handle;
handle = gem_create(fd, 4096);
-
gem_flink(fd, handle);
-
gem_close(fd, handle);
+
+ count++;
}
pls_die = 1;
+ len = snprintf(buf, sizeof(buf), "Completed %lu cycles with [", count);
for (i = 0; i < num_threads; i++) {
- pthread_join(threads[i], &status);
+ pthread_join(threads[i].thread, &status);
igt_assert(status == 0);
+ len += snprintf(buf + len, sizeof(buf) - len, "%lu, ", threads[i].count);
}
+ snprintf(buf + len - 2, sizeof(buf) - len + 2, "] races");
+ igt_info("%s\n", buf);
close(fd);
}
@@ -186,7 +201,7 @@ igt_main
igt_skip_on_simulation();
igt_subtest("flink_name")
- test_flink_name();
+ test_flink_name(5);
igt_subtest("flink_close")
test_flink_close();
--
2.14.1
More information about the Intel-gfx
mailing list