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@xxxxxxxxxxxxxxxxxx> --- 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx