[Intel-gfx] [PATCH i-g-t 01/11] tests/perf: make stream_fd a global variable
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Fri Aug 4 11:20:30 UTC 2017
When debugging unstable tests on new platforms we currently we don't
cleanup everything well in between different tests. Since only a
single OA stream fd can be opened at a time, having the stream_fd as a
global variable helps us cleanup the state between tests.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
tests/perf.c | 121 ++++++++++++++++++++++++++++++++---------------------------
1 file changed, 65 insertions(+), 56 deletions(-)
diff --git a/tests/perf.c b/tests/perf.c
index f0ec26dd..26581ce4 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -276,6 +276,7 @@ static bool hsw_undefined_a_counters[45] = {
static bool gen8_undefined_a_counters[45];
static int drm_fd = -1;
+static int stream_fd = -1;
static uint32_t devid;
static int card = -1;
static int n_eus;
@@ -297,10 +298,22 @@ static uint32_t (*read_report_ticks)(uint32_t *report,
static void (*sanity_check_reports)(uint32_t *oa_report0, uint32_t *oa_report1,
enum drm_i915_oa_format format);
+static void
+__perf_close(int fd)
+{
+ close(fd);
+ stream_fd = -1;
+}
+
static int
__perf_open(int fd, struct drm_i915_perf_open_param *param)
{
- int ret = igt_ioctl(fd, DRM_IOCTL_I915_PERF_OPEN, param);
+ int ret;
+
+ if (stream_fd >= 0)
+ __perf_close(stream_fd);
+
+ ret = igt_ioctl(fd, DRM_IOCTL_I915_PERF_OPEN, param);
igt_assert(ret >= 0);
errno = 0;
@@ -951,14 +964,12 @@ test_system_wide_paranoid(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd;
-
write_u64_file("/proc/sys/dev/i915/perf_stream_paranoid", 0);
igt_drop_root();
stream_fd = __perf_open(drm_fd, ¶m);
- close(stream_fd);
+ __perf_close(stream_fd);
}
igt_waitchildren();
@@ -1006,7 +1017,6 @@ test_invalid_oa_metric_set_id(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd;
do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_OPEN, ¶m, EINVAL);
@@ -1016,7 +1026,7 @@ test_invalid_oa_metric_set_id(void)
/* Check that we aren't just seeing false positives... */
properties[ARRAY_SIZE(properties) - 1] = test_metric_set_id;
stream_fd = __perf_open(drm_fd, ¶m);
- close(stream_fd);
+ __perf_close(stream_fd);
/* There's no valid default OA metric set ID... */
param.num_properties--;
@@ -1041,7 +1051,6 @@ test_invalid_oa_format_id(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd;
do_ioctl_err(drm_fd, DRM_IOCTL_I915_PERF_OPEN, ¶m, EINVAL);
@@ -1051,7 +1060,7 @@ test_invalid_oa_format_id(void)
/* Check that we aren't just seeing false positives... */
properties[ARRAY_SIZE(properties) - 1] = test_oa_format;
stream_fd = __perf_open(drm_fd, ¶m);
- close(stream_fd);
+ __perf_close(stream_fd);
/* There's no valid default OA format... */
param.num_properties--;
@@ -1079,8 +1088,7 @@ test_missing_sample_flags(void)
}
static void
-read_2_oa_reports(int stream_fd,
- int format_id,
+read_2_oa_reports(int format_id,
int exponent,
uint32_t *oa_report0,
uint32_t *oa_report1,
@@ -1214,12 +1222,13 @@ open_and_read_2_oa_reports(int format_id,
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
- read_2_oa_reports(stream_fd, format_id, exponent,
+ stream_fd = __perf_open(drm_fd, ¶m);
+
+ read_2_oa_reports(format_id, exponent,
oa_report0, oa_report1, timer_only);
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -1519,9 +1528,10 @@ test_invalid_oa_exponent(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
- close(stream_fd);
+ stream_fd = __perf_open(drm_fd, ¶m);
+
+ __perf_close(stream_fd);
for (int i = 32; i < 65; i++) {
properties[7] = i;
@@ -1571,12 +1581,10 @@ test_low_oa_exponent_permissions(void)
properties[7] = ok_exponent;
igt_fork(child, 1) {
- int stream_fd;
-
igt_drop_root();
stream_fd = __perf_open(drm_fd, ¶m);
- close(stream_fd);
+ __perf_close(stream_fd);
}
igt_waitchildren();
@@ -1625,7 +1633,6 @@ test_per_context_mode_unprivileged(void)
igt_fork(child, 1) {
drm_intel_context *context;
drm_intel_bufmgr *bufmgr;
- int stream_fd;
uint32_t ctx_id = 0xffffffff; /* invalid id */
int ret;
@@ -1643,7 +1650,7 @@ test_per_context_mode_unprivileged(void)
properties[1] = ctx_id;
stream_fd = __perf_open(drm_fd, ¶m);
- close(stream_fd);
+ __perf_close(stream_fd);
drm_intel_gem_context_destroy(context);
drm_intel_bufmgr_destroy(bufmgr);
@@ -1706,7 +1713,6 @@ test_blocking(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
uint8_t buf[1024 * 1024];
struct tms start_times;
struct tms end_times;
@@ -1731,6 +1737,8 @@ test_blocking(void)
int64_t start;
int n = 0;
+ stream_fd = __perf_open(drm_fd, ¶m);
+
times(&start_times);
igt_debug("tick length = %dns, test duration = %"PRIu64"ns, min iter. = %d, max iter. = %d\n",
@@ -1828,7 +1836,7 @@ test_blocking(void)
igt_assert(kernel_ns <= (test_duration_ns / 100ull));
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -1857,7 +1865,6 @@ test_polling(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
uint8_t buf[1024 * 1024];
struct tms start_times;
struct tms end_times;
@@ -1881,6 +1888,8 @@ test_polling(void)
int64_t start;
int n = 0;
+ stream_fd = __perf_open(drm_fd, ¶m);
+
times(&start_times);
igt_debug("tick length = %dns, test duration = %"PRIu64"ns, min iter. = %d, max iter. = %d\n",
@@ -2009,7 +2018,7 @@ test_polling(void)
igt_assert(kernel_ns <= (test_duration_ns / 100ull));
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -2032,7 +2041,6 @@ test_buffer_fill(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
int buf_size = 65536 * (256 + sizeof(struct drm_i915_perf_record_header));
uint8_t *buf = malloc(buf_size);
size_t oa_buf_size = 16 * 1024 * 1024;
@@ -2042,6 +2050,8 @@ test_buffer_fill(void)
igt_assert(fill_duration < 1000000000);
+ stream_fd = __perf_open(drm_fd, ¶m);
+
for (int i = 0; i < 5; i++) {
struct drm_i915_perf_record_header *header;
bool overflow_seen;
@@ -2092,7 +2102,7 @@ test_buffer_fill(void)
free(buf);
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -2116,7 +2126,6 @@ test_enable_disable(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
int buf_size = 65536 * (256 + sizeof(struct drm_i915_perf_record_header));
uint8_t *buf = malloc(buf_size);
size_t oa_buf_size = 16 * 1024 * 1024;
@@ -2124,6 +2133,7 @@ test_enable_disable(void)
int n_full_oa_reports = oa_buf_size / report_size;
uint64_t fill_duration = n_full_oa_reports * oa_period;
+ stream_fd = __perf_open(drm_fd, ¶m);
for (int i = 0; i < 5; i++) {
int len;
@@ -2169,7 +2179,7 @@ test_enable_disable(void)
free(buf);
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -2196,7 +2206,6 @@ test_short_reads(void)
uint8_t *pages = mmap(NULL, page_size * 2,
PROT_READ|PROT_WRITE, MAP_PRIVATE, zero_fd, 0);
struct drm_i915_perf_record_header *header;
- int stream_fd;
int ret;
igt_assert_neq(zero_fd, -1);
@@ -2253,7 +2262,7 @@ test_short_reads(void)
igt_assert_eq(ret, -1);
igt_assert_eq(errno, ENOSPC);
- close(stream_fd);
+ __perf_close(stream_fd);
munmap(pages, page_size * 2);
}
@@ -2278,14 +2287,16 @@ test_non_sampling_read_error(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
+ int ret;
uint8_t buf[1024];
- int ret = read(stream_fd, buf, sizeof(buf));
+ stream_fd = __perf_open(drm_fd, ¶m);
+
+ ret = read(stream_fd, buf, sizeof(buf));
igt_assert_eq(ret, -1);
igt_assert_eq(errno, EIO);
- close(stream_fd);
+ __perf_close(stream_fd);
}
/* Check that attempts to read from a stream while it is disable will return
@@ -2312,25 +2323,24 @@ test_disabled_read_error(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
uint32_t oa_report0[64];
uint32_t oa_report1[64];
uint32_t buf[128] = { 0 };
int ret;
+ stream_fd = __perf_open(drm_fd, ¶m);
ret = read(stream_fd, buf, sizeof(buf));
igt_assert_eq(ret, -1);
igt_assert_eq(errno, EIO);
- close(stream_fd);
+ __perf_close(stream_fd);
param.flags &= ~I915_PERF_FLAG_DISABLED;
stream_fd = __perf_open(drm_fd, ¶m);
- read_2_oa_reports(stream_fd,
- test_oa_format,
+ read_2_oa_reports(test_oa_format,
oa_exponent,
oa_report0,
oa_report1,
@@ -2344,14 +2354,13 @@ test_disabled_read_error(void)
do_ioctl(stream_fd, I915_PERF_IOCTL_ENABLE, 0);
- read_2_oa_reports(stream_fd,
- test_oa_format,
+ read_2_oa_reports(test_oa_format,
oa_exponent,
oa_report0,
oa_report1,
false); /* not just timer reports */
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -2400,7 +2409,6 @@ test_mi_rpc(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
drm_intel_bufmgr *bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
drm_intel_context *context;
struct intel_batchbuffer *batch;
@@ -2408,6 +2416,8 @@ test_mi_rpc(void)
uint32_t *report32;
int ret;
+ stream_fd = __perf_open(drm_fd, ¶m);
+
drm_intel_bufmgr_gem_enable_reuse(bufmgr);
context = drm_intel_gem_context_create(bufmgr);
@@ -2445,7 +2455,7 @@ test_mi_rpc(void)
intel_batchbuffer_free(batch);
drm_intel_gem_context_destroy(context);
drm_intel_bufmgr_destroy(bufmgr);
- close(stream_fd);
+ __perf_close(stream_fd);
}
static void
@@ -2536,7 +2546,6 @@ hsw_test_single_ctx_counters(void)
igt_fork(child, 1) {
drm_intel_bufmgr *bufmgr;
drm_intel_context *context0, *context1;
- int stream_fd;
struct intel_batchbuffer *batch;
struct igt_buf src, dst;
drm_intel_bo *bo;
@@ -2715,7 +2724,7 @@ hsw_test_single_ctx_counters(void)
drm_intel_gem_context_destroy(context0);
drm_intel_gem_context_destroy(context1);
drm_intel_bufmgr_destroy(bufmgr);
- close(stream_fd);
+ __perf_close(stream_fd);
}
igt_waitchildren();
@@ -2738,10 +2747,12 @@ test_rc6_disable(void)
.num_properties = sizeof(properties) / 16,
.properties_ptr = to_user_pointer(properties),
};
- int stream_fd = __perf_open(drm_fd, ¶m);
- uint64_t n_events_start = read_debugfs_u64_record(drm_fd, "i915_drpc_info",
- "RC6 residency since boot");
- uint64_t n_events_end;
+ uint64_t n_events_start, n_events_end;
+
+ stream_fd = __perf_open(drm_fd, ¶m);
+
+ n_events_start = read_debugfs_u64_record(drm_fd, "i915_drpc_info",
+ "RC6 residency since boot");
nanosleep(&(struct timespec){ .tv_sec = 0, .tv_nsec = 500000000 }, NULL);
@@ -2750,12 +2761,12 @@ test_rc6_disable(void)
igt_assert_eq(n_events_end - n_events_start, 0);
- close(stream_fd);
+ __perf_close(stream_fd);
n_events_start = read_debugfs_u64_record(drm_fd, "i915_drpc_info",
"RC6 residency since boot");
- nanosleep(&(struct timespec){ .tv_sec = 0, .tv_nsec = 500000000 }, NULL);
+ nanosleep(&(struct timespec){ .tv_sec = 1, .tv_nsec = 0 }, NULL);
n_events_end = read_debugfs_u64_record(drm_fd, "i915_drpc_info",
"RC6 residency since boot");
@@ -2893,7 +2904,7 @@ test_create_destroy_userspace_config(void)
const char *uuid = "01234567-0123-0123-0123-0123456789ab";
uint32_t mux_regs[] = { 0x9888 /* NOA_WRITE */, 0x0 };
uint32_t flex_regs[100];
- int i, stream_fd;
+ int i;
uint64_t config_id;
uint64_t properties[] = {
DRM_I915_PERF_PROP_OA_METRICS_SET, 0, /* Filled later */
@@ -2956,7 +2967,7 @@ test_create_destroy_userspace_config(void)
/* Read the config to verify shouldn't raise any issue. */
config_id = i915_perf_add_config(drm_fd, &config);
- close(stream_fd);
+ __perf_close(stream_fd);
i915_perf_remove_config(drm_fd, config_id);
}
@@ -3126,7 +3137,6 @@ test_i915_ref_count(void)
.properties_ptr = to_user_pointer(properties),
};
unsigned baseline, ref_count0, ref_count1;
- int stream_fd;
uint32_t oa_report0[64];
uint32_t oa_report1[64];
@@ -3166,14 +3176,13 @@ test_i915_ref_count(void)
igt_assert(ref_count0 > baseline);
- read_2_oa_reports(stream_fd,
- test_oa_format,
+ read_2_oa_reports(test_oa_format,
oa_exp_1_millisec,
oa_report0,
oa_report1,
false); /* not just timer reports */
- close(stream_fd);
+ __perf_close(stream_fd);
ref_count0 = read_i915_module_ref();
igt_debug("ref count after closing i915 perf stream fd = %u\n", ref_count0);
igt_assert_eq(ref_count0, baseline);
--
2.13.3
More information about the Intel-gfx
mailing list