* [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt
@ 2019-01-16 15:37 Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 1/4] bump headers Lionel Landwerlin
` (5 more replies)
0 siblings, 6 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-01-16 15:37 UTC (permalink / raw)
To: igt-dev; +Cc: matthew.auld
This series is testing the new OA interrupt support we would like to
add in the i915/perf driver.
Cheers,
Lionel Landwerlin (4):
bump headers
tests/perf: new tests for parameterized OA buffer polling
tests/perf: new tests for OA interrupt
tests/perf: add flush data ioctl test
include/drm-uapi/drm_fourcc.h | 23 ++
include/drm-uapi/drm_mode.h | 19 ++
include/drm-uapi/i915_drm.h | 35 +++
include/drm-uapi/msm_drm.h | 25 +-
include/drm-uapi/v3d_drm.h | 33 +++
tests/perf.c | 499 +++++++++++++++++++++++++++++++---
6 files changed, 592 insertions(+), 42 deletions(-)
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* [igt-dev] [PATCH i-g-t 1/4] bump headers
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
@ 2019-01-16 15:37 ` Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 2/4] tests/perf: new tests for parameterized OA buffer polling Lionel Landwerlin
` (4 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-01-16 15:37 UTC (permalink / raw)
To: igt-dev; +Cc: matthew.auld
---
include/drm-uapi/drm_fourcc.h | 23 +++++++++++++++++++++++
include/drm-uapi/drm_mode.h | 19 +++++++++++++++++++
include/drm-uapi/i915_drm.h | 35 +++++++++++++++++++++++++++++++++++
include/drm-uapi/msm_drm.h | 25 +++++++++++++++++++------
include/drm-uapi/v3d_drm.h | 33 +++++++++++++++++++++++++++++++++
5 files changed, 129 insertions(+), 6 deletions(-)
diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h
index 4ddf754b..9e90abaa 100644
--- a/include/drm-uapi/drm_fourcc.h
+++ b/include/drm-uapi/drm_fourcc.h
@@ -581,10 +581,18 @@ extern "C" {
* Indicates the superblock size(s) used for the AFBC buffer. The buffer
* size (in pixels) must be aligned to a multiple of the superblock size.
* Four lowest significant bits(LSBs) are reserved for block size.
+ *
+ * Where one superblock size is specified, it applies to all planes of the
+ * buffer (e.g. 16x16, 32x8). When multiple superblock sizes are specified,
+ * the first applies to the Luma plane and the second applies to the Chroma
+ * plane(s). e.g. (32x8_64x4 means 32x8 Luma, with 64x4 Chroma).
+ * Multiple superblock sizes are only valid for multi-plane YCbCr formats.
*/
#define AFBC_FORMAT_MOD_BLOCK_SIZE_MASK 0xf
#define AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 (1ULL)
#define AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 (2ULL)
+#define AFBC_FORMAT_MOD_BLOCK_SIZE_64x4 (3ULL)
+#define AFBC_FORMAT_MOD_BLOCK_SIZE_32x8_64x4 (4ULL)
/*
* AFBC lossless colorspace transform
@@ -644,6 +652,21 @@ extern "C" {
*/
#define AFBC_FORMAT_MOD_SC (1ULL << 9)
+/*
+ * AFBC double-buffer
+ *
+ * Indicates that the buffer is allocated in a layout safe for front-buffer
+ * rendering.
+ */
+#define AFBC_FORMAT_MOD_DB (1ULL << 10)
+
+/*
+ * AFBC buffer content hints
+ *
+ * Indicates that the buffer includes per-superblock content hints.
+ */
+#define AFBC_FORMAT_MOD_BCH (1ULL << 11)
+
#if defined(__cplusplus)
}
#endif
diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index d3e0fe31..a439c2e6 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -888,6 +888,25 @@ struct drm_mode_revoke_lease {
__u32 lessee_id;
};
+/**
+ * struct drm_mode_rect - Two dimensional rectangle.
+ * @x1: Horizontal starting coordinate (inclusive).
+ * @y1: Vertical starting coordinate (inclusive).
+ * @x2: Horizontal ending coordinate (exclusive).
+ * @y2: Vertical ending coordinate (exclusive).
+ *
+ * With drm subsystem using struct drm_rect to manage rectangular area this
+ * export it to user-space.
+ *
+ * Currently used by drm_mode_atomic blob property FB_DAMAGE_CLIPS.
+ */
+struct drm_mode_rect {
+ __s32 x1;
+ __s32 y1;
+ __s32 x2;
+ __s32 y2;
+};
+
#if defined(__cplusplus)
}
#endif
diff --git a/include/drm-uapi/i915_drm.h b/include/drm-uapi/i915_drm.h
index e39b26d4..6822d087 100644
--- a/include/drm-uapi/i915_drm.h
+++ b/include/drm-uapi/i915_drm.h
@@ -1540,6 +1540,22 @@ enum drm_i915_perf_property_id {
*/
DRM_I915_PERF_PROP_OA_EXPONENT,
+ /**
+ * Specifying this property sets up a hrtimer in nanoseconds at which
+ * the i915 driver will check the OA buffer for available data. A
+ * value of 0 means no hrtimer will be started. Values below 100
+ * microseconds are not allowed.
+ */
+ DRM_I915_PERF_PROP_POLL_OA_DELAY,
+
+ /**
+ * Specifying this property sets up the interrupt mechanism for the OA
+ * buffer in i915. This option in conjuction with a long polling delay
+ * for avaibility of OA data can reduce CPU load significantly if you
+ * do not care about OA data being read as soon as it's available.
+ */
+ DRM_I915_PERF_PROP_OA_ENABLE_INTERRUPT,
+
DRM_I915_PERF_PROP_MAX /* non-ABI */
};
@@ -1578,6 +1594,25 @@ struct drm_i915_perf_open_param {
*/
#define I915_PERF_IOCTL_DISABLE _IO('i', 0x1)
+/**
+ * Actively check the availability of data from a stream.
+ *
+ * A stream data availability can be driven by two types of events :
+ *
+ * - if enabled, the kernel's hrtimer checking the amount of available data
+ * in the OA buffer through head/tail registers.
+ *
+ * - if enabled, the OA unit's interrupt mechanism
+ *
+ * The kernel hrtimer incur a cost of running callback at fixed time
+ * intervals, while the OA interrupt might only happen rarely. In the
+ * situation where the application has disabled the kernel's hrtimer and only
+ * uses the OA interrupt to know about available data, the application can
+ * request an active check of the available OA data through this ioctl. This
+ * will make any data in the OA buffer available with either poll() or read().
+ */
+#define I915_PERF_IOCTL_FLUSH_DATA _IO('i', 0x2)
+
/**
* Common to all i915 perf records
*/
diff --git a/include/drm-uapi/msm_drm.h b/include/drm-uapi/msm_drm.h
index c06d0a5b..91a16b33 100644
--- a/include/drm-uapi/msm_drm.h
+++ b/include/drm-uapi/msm_drm.h
@@ -105,14 +105,24 @@ struct drm_msm_gem_new {
__u32 handle; /* out */
};
-#define MSM_INFO_IOVA 0x01
-
-#define MSM_INFO_FLAGS (MSM_INFO_IOVA)
+/* Get or set GEM buffer info. The requested value can be passed
+ * directly in 'value', or for data larger than 64b 'value' is a
+ * pointer to userspace buffer, with 'len' specifying the number of
+ * bytes copied into that buffer. For info returned by pointer,
+ * calling the GEM_INFO ioctl with null 'value' will return the
+ * required buffer size in 'len'
+ */
+#define MSM_INFO_GET_OFFSET 0x00 /* get mmap() offset, returned by value */
+#define MSM_INFO_GET_IOVA 0x01 /* get iova, returned by value */
+#define MSM_INFO_SET_NAME 0x02 /* set the debug name (by pointer) */
+#define MSM_INFO_GET_NAME 0x03 /* get debug name, returned by pointer */
struct drm_msm_gem_info {
__u32 handle; /* in */
- __u32 flags; /* in - combination of MSM_INFO_* flags */
- __u64 offset; /* out, mmap() offset or iova */
+ __u32 info; /* in - one of MSM_INFO_* */
+ __u64 value; /* in or out */
+ __u32 len; /* in or out */
+ __u32 pad;
};
#define MSM_PREP_READ 0x01
@@ -188,8 +198,11 @@ struct drm_msm_gem_submit_cmd {
*/
#define MSM_SUBMIT_BO_READ 0x0001
#define MSM_SUBMIT_BO_WRITE 0x0002
+#define MSM_SUBMIT_BO_DUMP 0x0004
-#define MSM_SUBMIT_BO_FLAGS (MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE)
+#define MSM_SUBMIT_BO_FLAGS (MSM_SUBMIT_BO_READ | \
+ MSM_SUBMIT_BO_WRITE | \
+ MSM_SUBMIT_BO_DUMP)
struct drm_msm_gem_submit_bo {
__u32 flags; /* in, mask of MSM_SUBMIT_BO_x */
diff --git a/include/drm-uapi/v3d_drm.h b/include/drm-uapi/v3d_drm.h
index b1e5de07..ea70669d 100644
--- a/include/drm-uapi/v3d_drm.h
+++ b/include/drm-uapi/v3d_drm.h
@@ -36,6 +36,7 @@ extern "C" {
#define DRM_V3D_MMAP_BO 0x03
#define DRM_V3D_GET_PARAM 0x04
#define DRM_V3D_GET_BO_OFFSET 0x05
+#define DRM_V3D_SUBMIT_TFU 0x06
#define DRM_IOCTL_V3D_SUBMIT_CL DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_CL, struct drm_v3d_submit_cl)
#define DRM_IOCTL_V3D_WAIT_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_WAIT_BO, struct drm_v3d_wait_bo)
@@ -43,6 +44,7 @@ extern "C" {
#define DRM_IOCTL_V3D_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_MMAP_BO, struct drm_v3d_mmap_bo)
#define DRM_IOCTL_V3D_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_GET_PARAM, struct drm_v3d_get_param)
#define DRM_IOCTL_V3D_GET_BO_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_GET_BO_OFFSET, struct drm_v3d_get_bo_offset)
+#define DRM_IOCTL_V3D_SUBMIT_TFU DRM_IOW(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_TFU, struct drm_v3d_submit_tfu)
/**
* struct drm_v3d_submit_cl - ioctl argument for submitting commands to the 3D
@@ -50,6 +52,14 @@ extern "C" {
*
* This asks the kernel to have the GPU execute an optional binner
* command list, and a render command list.
+ *
+ * The L1T, slice, L2C, L2T, and GCA caches will be flushed before
+ * each CL executes. The VCD cache should be flushed (if necessary)
+ * by the submitted CLs. The TLB writes are guaranteed to have been
+ * flushed by the time the render done IRQ happens, which is the
+ * trigger for out_sync. Any dirtying of cachelines by the job (only
+ * possible using TMU writes) must be flushed by the caller using the
+ * CL's cache flush commands.
*/
struct drm_v3d_submit_cl {
/* Pointer to the binner command list.
@@ -179,6 +189,7 @@ enum drm_v3d_param {
DRM_V3D_PARAM_V3D_CORE0_IDENT0,
DRM_V3D_PARAM_V3D_CORE0_IDENT1,
DRM_V3D_PARAM_V3D_CORE0_IDENT2,
+ DRM_V3D_PARAM_SUPPORTS_TFU,
};
struct drm_v3d_get_param {
@@ -197,6 +208,28 @@ struct drm_v3d_get_bo_offset {
__u32 offset;
};
+struct drm_v3d_submit_tfu {
+ __u32 icfg;
+ __u32 iia;
+ __u32 iis;
+ __u32 ica;
+ __u32 iua;
+ __u32 ioa;
+ __u32 ios;
+ __u32 coef[4];
+ /* First handle is the output BO, following are other inputs.
+ * 0 for unused.
+ */
+ __u32 bo_handles[4];
+ /* sync object to block on before running the TFU job. Each TFU
+ * job will execute in the order submitted to its FD. Synchronization
+ * against rendering jobs requires using sync objects.
+ */
+ __u32 in_sync;
+ /* Sync object to signal when the TFU job is done. */
+ __u32 out_sync;
+};
+
#if defined(__cplusplus)
}
#endif
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [igt-dev] [PATCH i-g-t 2/4] tests/perf: new tests for parameterized OA buffer polling
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 1/4] bump headers Lionel Landwerlin
@ 2019-01-16 15:37 ` Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt Lionel Landwerlin
` (3 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-01-16 15:37 UTC (permalink / raw)
To: igt-dev; +Cc: matthew.auld
2 new tests verifying that the OA buffer is properly checked at the
frequency specified by userspace.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
tests/perf.c | 147 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 111 insertions(+), 36 deletions(-)
diff --git a/tests/perf.c b/tests/perf.c
index 220c52ef..1a773455 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -210,6 +210,24 @@ get_oa_format(enum drm_i915_oa_format format)
return gen8_oa_formats[format];
}
+static char *
+pretty_print_oa_period(uint64_t oa_period_ns)
+{
+ static char result[100];
+ static const char *units[4] = { "ns", "us", "ms", "s" };
+ double val = oa_period_ns;
+ int iter = 0;
+
+ while (iter < (ARRAY_SIZE(units) - 1) &&
+ val >= 1000.0f) {
+ val /= 1000.0f;
+ iter++;
+ }
+
+ snprintf(result, sizeof(result), "%.3f%s", val, units[iter]);
+ return result;
+}
+
static void
__perf_close(int fd)
{
@@ -1993,15 +2011,9 @@ get_time(void)
* kernelspace.
*/
static void
-test_blocking(void)
+test_blocking(uint64_t requested_oa_period, bool set_kernel_hrtimer, uint64_t kernel_hrtimer)
{
- /* ~40 milliseconds
- *
- * Having a period somewhat > sysconf(_SC_CLK_TCK) helps to stop
- * scheduling (liable to kick in when we make blocking poll()s/reads)
- * from interfering with the test.
- */
- int oa_exponent = max_oa_exponent_for_period_lte(40000000);
+ int oa_exponent = max_oa_exponent_for_period_lte(requested_oa_period);
uint64_t oa_period = oa_exponent_to_ns(oa_exponent);
uint64_t properties[] = {
/* Include OA reports in samples */
@@ -2011,11 +2023,16 @@ test_blocking(void)
DRM_I915_PERF_PROP_OA_METRICS_SET, test_metric_set_id,
DRM_I915_PERF_PROP_OA_FORMAT, test_oa_format,
DRM_I915_PERF_PROP_OA_EXPONENT, oa_exponent,
+
+ /* Kernel configuration (optional) */
+ DRM_I915_PERF_PROP_POLL_OA_DELAY, kernel_hrtimer,
};
struct drm_i915_perf_open_param param = {
.flags = I915_PERF_FLAG_FD_CLOEXEC |
I915_PERF_FLAG_DISABLED,
- .num_properties = sizeof(properties) / 16,
+ .num_properties = (set_kernel_hrtimer ?
+ (ARRAY_SIZE(properties) / 2) :
+ ((ARRAY_SIZE(properties) / 2) - 1)),
.properties_ptr = to_user_pointer(properties),
};
uint8_t buf[1024 * 1024];
@@ -2037,7 +2054,7 @@ test_blocking(void)
* the knowledge that that the driver uses a 200Hz hrtimer (5ms period)
* to check for data and giving some time to read().
*/
- int min_iterations = (test_duration_ns / (oa_period + 6000000ull));
+ int min_iterations = (test_duration_ns / (oa_period + kernel_hrtimer + kernel_hrtimer / 5));
int64_t start, end;
int n = 0;
@@ -2047,9 +2064,10 @@ test_blocking(void)
times(&start_times);
igt_debug("tick length = %dns, test duration = %"PRIu64"ns, min iter. = %d,"
- " estimated max iter. = %d, oa_period = %"PRIu64"ns\n",
+ " estimated max iter. = %d, oa_period = %s\n",
(int)tick_ns, test_duration_ns,
- min_iterations, max_iterations, oa_period);
+ min_iterations, max_iterations,
+ pretty_print_oa_period(oa_period));
/* In the loop we perform blocking polls while the HW is sampling at
* ~25Hz, with the expectation that we spend most of our time blocked
@@ -2151,15 +2169,9 @@ test_blocking(void)
}
static void
-test_polling(void)
+test_polling(uint64_t requested_oa_period, bool set_kernel_hrtimer, uint64_t kernel_hrtimer)
{
- /* ~40 milliseconds
- *
- * Having a period somewhat > sysconf(_SC_CLK_TCK) helps to stop
- * scheduling (liable to kick in when we make blocking poll()s/reads)
- * from interfering with the test.
- */
- int oa_exponent = max_oa_exponent_for_period_lte(40000000);
+ int oa_exponent = max_oa_exponent_for_period_lte(requested_oa_period);
uint64_t oa_period = oa_exponent_to_ns(oa_exponent);
uint64_t properties[] = {
/* Include OA reports in samples */
@@ -2169,12 +2181,17 @@ test_polling(void)
DRM_I915_PERF_PROP_OA_METRICS_SET, test_metric_set_id,
DRM_I915_PERF_PROP_OA_FORMAT, test_oa_format,
DRM_I915_PERF_PROP_OA_EXPONENT, oa_exponent,
+
+ /* Kernel configuration (optional) */
+ DRM_I915_PERF_PROP_POLL_OA_DELAY, kernel_hrtimer,
};
struct drm_i915_perf_open_param param = {
.flags = I915_PERF_FLAG_FD_CLOEXEC |
I915_PERF_FLAG_DISABLED |
I915_PERF_FLAG_FD_NONBLOCK,
- .num_properties = sizeof(properties) / 16,
+ .num_properties = (set_kernel_hrtimer ?
+ (ARRAY_SIZE(properties) / 2) :
+ ((ARRAY_SIZE(properties) / 2) - 1)),
.properties_ptr = to_user_pointer(properties),
};
uint8_t buf[1024 * 1024];
@@ -2188,24 +2205,24 @@ test_polling(void)
int n_extra_iterations = 0;
/* It's a bit tricky to put a lower limit here, but we expect a
- * relatively low latency for seeing reports, while we don't currently
- * give any control over this in the api.
+ * relatively low latency for seeing reports.
*
- * We assume a maximum latency of 6 millisecond to deliver a POLLIN and
- * read() after a new sample is written (46ms per iteration) considering
- * the knowledge that that the driver uses a 200Hz hrtimer (5ms period)
- * to check for data and giving some time to read().
+ * We assume a maximum latency of kernel_hrtimer + some margin
+ * to deliver a POLLIN and read() after a new sample is
+ * written (40ms + hrtimer + margin per iteration) considering
+ * the knowledge that that the driver uses a 200Hz hrtimer
+ * (5ms period) to check for data and giving some time to
+ * read().
*/
- int min_iterations = (test_duration_ns / (oa_period + 6000000ull));
+ int min_iterations = (test_duration_ns / (oa_period + (kernel_hrtimer + kernel_hrtimer / 5)));
int64_t start, end;
int n = 0;
stream_fd = __perf_open(drm_fd, ¶m, true /* prevent_pm */);
- times(&start_times);
-
- igt_debug("tick length = %dns, test duration = %"PRIu64"ns, min iter. = %d, max iter. = %d\n",
- (int)tick_ns, test_duration_ns,
+ igt_debug("tick length = %dns, oa period = %s, "
+ "test duration = %"PRIu64"ns, min iter. = %d, max iter. = %d\n",
+ (int)tick_ns, pretty_print_oa_period(oa_period), test_duration_ns,
min_iterations, max_iterations);
/* In the loop we perform blocking polls while the HW is sampling at
@@ -4082,6 +4099,32 @@ test_sysctl_defaults(void)
igt_assert_eq(max_freq, 100000);
}
+static bool
+kernel_supports_open_option(int fd, uint64_t option, uint64_t value)
+{
+ uint64_t properties[] = {
+ /* Intentionally wrong handle */
+ DRM_I915_PERF_PROP_CTX_HANDLE, UINT64_MAX,
+
+ DRM_I915_PERF_PROP_SAMPLE_OA, true,
+ DRM_I915_PERF_PROP_OA_METRICS_SET, test_metric_set_id,
+ DRM_I915_PERF_PROP_OA_FORMAT, test_oa_format,
+ DRM_I915_PERF_PROP_OA_EXPONENT, max_oa_exponent_for_period_lte(5000),
+ option, value,
+ };
+ struct drm_i915_perf_open_param param = {
+ .flags = I915_PERF_FLAG_FD_CLOEXEC,
+ .num_properties = ARRAY_SIZE(properties) / 2,
+ .properties_ptr = to_user_pointer(properties),
+ };
+ int ret;
+
+ ret = igt_ioctl(fd, DRM_IOCTL_I915_PERF_OPEN, ¶m);
+ assert(ret == -1);
+
+ return errno == ENOENT;
+}
+
igt_main
{
igt_skip_on_simulation();
@@ -4165,11 +4208,43 @@ igt_main
igt_subtest("enable-disable")
test_enable_disable();
- igt_subtest("blocking")
- test_blocking();
+ igt_subtest("blocking") {
+ test_blocking(40 * 1000 * 1000 /* 40ms oa period */,
+ false /* set_kernel_hrtimer */,
+ 5 * 1000 * 1000 /* default 5ms/200Hz hrtimer */);
+ }
- igt_subtest("polling")
- test_polling();
+ igt_subtest("blocking-parameterized") {
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_POLL_OA_DELAY,
+ 40 * 1000 * 1000));
+
+ test_blocking(10 * 1000 * 1000 /* 10ms oa period */,
+ true /* set_kernel_hrtimer */,
+ 40 * 1000 * 1000 /* default 40ms hrtimer */);
+ test_blocking(500 * 1000 /* 500us oa period */,
+ true /* set_kernel_hrtimer */,
+ 500 * 1000 /* default 500us hrtimer */);
+ }
+
+ igt_subtest("polling") {
+ test_polling(40 * 1000 * 1000 /* 40ms oa period */,
+ false /* set_kernel_hrtimer */,
+ 5 * 1000 * 1000 /* default 5ms/200Hz hrtimer */);
+ }
+
+ igt_subtest("polling-parameterized") {
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_POLL_OA_DELAY,
+ 40 * 1000 * 1000));
+
+ test_polling(10 * 1000 * 1000 /* 10ms oa period */,
+ true /* set_kernel_hrtimer */,
+ 40 * 1000 * 1000 /* default 40ms hrtimer */);
+ test_polling(500 * 1000 /* 500us oa period */,
+ true /* set_kernel_hrtimer */,
+ 500 * 1000 /* default 500us hrtimer */);
+ }
igt_subtest("short-reads")
test_short_reads();
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 1/4] bump headers Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 2/4] tests/perf: new tests for parameterized OA buffer polling Lionel Landwerlin
@ 2019-01-16 15:37 ` Lionel Landwerlin
2019-01-16 23:30 ` Chris Wilson
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 4/4] tests/perf: add flush data ioctl test Lionel Landwerlin
` (2 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Lionel Landwerlin @ 2019-01-16 15:37 UTC (permalink / raw)
To: igt-dev; +Cc: matthew.auld
Those tests verify that the interrupt wakes up userspace waiting on
the perf stream either with poll() or with read().
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
tests/perf.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 218 insertions(+)
diff --git a/tests/perf.c b/tests/perf.c
index 1a773455..3effc34d 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -442,6 +442,20 @@ oa_exponent_to_ns(int exponent)
return 1000000000ULL * (2ULL << exponent) / timestamp_frequency;
}
+static int
+find_oa_exponent_for_buffer_fill_time(size_t oa_buf_size, size_t report_size, uint64_t fill_time_ns)
+{
+ size_t n_reports = oa_buf_size / report_size;
+
+ for (int e = 1; e < 32; e++) {
+ if (fill_time_ns < oa_exponent_to_ns(e) * n_reports)
+ return e;
+ }
+
+ igt_assert(!"reached");
+ return -1;
+}
+
static bool
oa_report_is_periodic(uint32_t oa_exponent, const uint32_t *report)
{
@@ -2354,6 +2368,111 @@ test_polling(uint64_t requested_oa_period, bool set_kernel_hrtimer, uint64_t ker
__perf_close(stream_fd);
}
+static void
+test_interrupt(uint64_t oa_exponent,
+ uint64_t kernel_oa_poll_delay,
+ bool use_interrupt,
+ bool expect_buffer_lost,
+ bool use_polling,
+ uint32_t expect_min_reports)
+{
+ uint64_t properties[] = {
+ /* Include OA reports in samples */
+ DRM_I915_PERF_PROP_SAMPLE_OA, true,
+
+ /* OA unit configuration */
+ DRM_I915_PERF_PROP_OA_METRICS_SET, test_metric_set_id,
+ DRM_I915_PERF_PROP_OA_FORMAT, test_oa_format,
+ DRM_I915_PERF_PROP_OA_EXPONENT, oa_exponent,
+ DRM_I915_PERF_PROP_OA_ENABLE_INTERRUPT, use_interrupt,
+
+ /* Kernel configuration */
+ DRM_I915_PERF_PROP_POLL_OA_DELAY, kernel_oa_poll_delay,
+ };
+ struct drm_i915_perf_open_param param = {
+ .flags = I915_PERF_FLAG_FD_CLOEXEC |
+ I915_PERF_FLAG_DISABLED |
+ (use_polling ? I915_PERF_FLAG_FD_NONBLOCK : 0),
+ .num_properties = ARRAY_SIZE(properties) / 2,
+ .properties_ptr = to_user_pointer(properties),
+ };
+ struct pollfd pollfd = { .events = POLLIN };
+ struct drm_i915_perf_record_header *header;
+ uint32_t n_reports = 0;
+ bool buffer_lost = false;
+ uint8_t *buf = malloc(MAX_OA_BUF_SIZE);
+ int ret;
+
+ stream_fd = __perf_open(drm_fd, ¶m, true /* prevent_pm */);
+ pollfd.fd = stream_fd;
+
+ igt_debug("OA period = %s, ",
+ pretty_print_oa_period(oa_exponent_to_ns(oa_exponent)));
+ igt_debug("OA poll delay = %s, use interrupt = %i, "
+ "expected min report = %u\n",
+ pretty_print_oa_period(kernel_oa_poll_delay),
+ use_interrupt, expect_min_reports);
+
+ do_ioctl(stream_fd, I915_PERF_IOCTL_ENABLE, 0);
+
+ if (use_polling) {
+ while ((ret = poll(&pollfd, 1, -1)) < 0 &&
+ errno == EINTR)
+ ;
+ igt_assert_eq(ret, 1);
+ igt_assert(pollfd.revents & POLLIN);
+ }
+
+ while ((ret = read(stream_fd, buf, MAX_OA_BUF_SIZE)) < 0 &&
+ errno == EINTR)
+ ;
+
+ if (ret < 0)
+ igt_debug("Unexpected error when reading after poll = %d\n", errno);
+ igt_assert_neq(ret, -1);
+
+ __perf_close(stream_fd);
+
+ /* For Haswell reports don't contain a well defined reason
+ * field we so assume all reports to be 'periodic'. For gen8+
+ * we want to to consider that the HW automatically writes some
+ * non periodic reports (e.g. on context switch) which might
+ * lead to more successful read()s than expected due to
+ * periodic sampling and we don't want these extra reads to
+ * cause the test to fail...
+ */
+ for (int offset = 0; offset < ret; offset += header->size) {
+ header = (void *)(buf + offset);
+
+ switch (header->type) {
+ case DRM_I915_PERF_RECORD_SAMPLE:
+ n_reports++;
+ break;
+ case DRM_I915_PERF_RECORD_OA_BUFFER_LOST:
+ buffer_lost = true;
+ break;
+ }
+ }
+
+ igt_debug("Got %i report(s)\n", n_reports);
+
+ igt_assert_eq(buffer_lost, expect_buffer_lost);
+
+ /*
+ * Leave a 5% error margin for 2 reasons :
+ *
+ * - the tail pointer race condition might remove a couple of
+ * reports because things have not yet landed in memory.
+ *
+ * - the OA unit sometimes drop a writing a report here and
+ * there, the algorithm is linked to pressure on memory
+ * controller but undocumented.
+ */
+ igt_assert_lte(expect_min_reports * 0.95, n_reports);
+
+ free(buf);
+}
+
static void
test_buffer_fill(void)
{
@@ -4227,6 +4346,56 @@ igt_main
500 * 1000 /* default 500us hrtimer */);
}
+ igt_subtest("blocking-with-interrupt") {
+ uint64_t target_fill_time = /* 1000ms */ 1000 * 1000 * 1000ul;
+ size_t report_size = get_oa_format(test_oa_format).size;
+ uint32_t max_reports = MAX_OA_BUF_SIZE / report_size;
+ int oa_exponent =
+ find_oa_exponent_for_buffer_fill_time(MAX_OA_BUF_SIZE,
+ report_size, target_fill_time);
+ uint64_t fill_time = oa_exponent_to_ns(oa_exponent) *
+ (MAX_OA_BUF_SIZE / report_size);
+
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_POLL_OA_DELAY,
+ target_fill_time));
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_OA_ENABLE_INTERRUPT,
+ true));
+
+ /*
+ * We should be waken up by the HR timer but too late,
+ * so we'll loose reports.
+ */
+ test_interrupt(oa_exponent,
+ fill_time + fill_time / 2,
+ false /* interrupt */, true /* loss */, false /* use_polling */,
+ 0);
+
+ /*
+ * We should get woken up by the HR timer and get the
+ * appropriate number of report.
+ */
+ test_interrupt(oa_exponent,
+ /* 500us */ 500 * 1000,
+ false /* interrupt */, false /* no loss */, false /* use_polling */,
+ (500 * 1000 * max_reports) / fill_time);
+
+
+ /* We should be waken up by the interrupt first. */
+ test_interrupt(oa_exponent,
+ 2 * fill_time,
+ true /* interrupt */, false /* no loss */, false /* use_polling */,
+ max_reports / 2);
+
+ /* We should be waken up by the HR timer first. */
+ test_interrupt(oa_exponent,
+ fill_time / 4,
+ true /* interrupt */, false /* no loss */, false /* use_polling */,
+ (fill_time / 4) * max_reports / fill_time);
+ }
+
+
igt_subtest("polling") {
test_polling(40 * 1000 * 1000 /* 40ms oa period */,
false /* set_kernel_hrtimer */,
@@ -4246,6 +4415,55 @@ igt_main
500 * 1000 /* default 500us hrtimer */);
}
+ igt_subtest("polling-with-interrupt") {
+ uint64_t target_fill_time = /* 1000ms */ 1000 * 1000 * 1000ul;
+ size_t report_size = get_oa_format(test_oa_format).size;
+ uint32_t max_reports = MAX_OA_BUF_SIZE / report_size;
+ int oa_exponent =
+ find_oa_exponent_for_buffer_fill_time(MAX_OA_BUF_SIZE,
+ report_size, target_fill_time);
+ uint64_t fill_time = oa_exponent_to_ns(oa_exponent) *
+ (MAX_OA_BUF_SIZE / report_size);
+
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_POLL_OA_DELAY,
+ target_fill_time));
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_OA_ENABLE_INTERRUPT,
+ true));
+
+ /*
+ * We should be waken up by the HR timer but too late,
+ * so we'll loose reports.
+ */
+ test_interrupt(oa_exponent,
+ fill_time + fill_time / 2,
+ false /* interrupt */, true /* loss */, true /* use_polling */,
+ 0);
+
+ /*
+ * We should get woken up by the HR timer and get the
+ * appropriate number of report.
+ */
+ test_interrupt(oa_exponent,
+ /* 500us */ 500 * 1000,
+ false /* interrupt */, false /* no loss */, true /* use_polling */,
+ (500 * 1000 * max_reports) / fill_time);
+
+
+ /* We should be waken up by the interrupt first. */
+ test_interrupt(oa_exponent,
+ 2 * fill_time,
+ true /* interrupt */, false /* no loss */, true /* use_polling */,
+ max_reports / 2);
+
+ /* We should be waken up by the HR timer first. */
+ test_interrupt(oa_exponent,
+ fill_time / 4,
+ true /* interrupt */, false /* no loss */, true /* use_polling */,
+ (fill_time / 4) * max_reports / fill_time);
+ }
+
igt_subtest("short-reads")
test_short_reads();
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [igt-dev] [PATCH i-g-t 4/4] tests/perf: add flush data ioctl test
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
` (2 preceding siblings ...)
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt Lionel Landwerlin
@ 2019-01-16 15:37 ` Lionel Landwerlin
2019-01-16 21:50 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/perf: Add new tests for enabling the OA interrupt Patchwork
2019-01-16 23:55 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
5 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-01-16 15:37 UTC (permalink / raw)
To: igt-dev; +Cc: matthew.auld
Ensure we have proper behavior for the new I915_PERF_IOCTL_FLUSH_DATA.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
tests/perf.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 134 insertions(+)
diff --git a/tests/perf.c b/tests/perf.c
index 3effc34d..2bf7e2c9 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -3724,6 +3724,129 @@ gen8_test_single_ctx_render_target_writes_a_counter(void)
} while (WEXITSTATUS(child_ret) == EAGAIN);
}
+/*
+ * Verifies that the I915_PERF_IOCTL_FLUSH_DATA ioctl forces the
+ * i915-perf driver to look at the available data in the OA buffer.
+ */
+static void
+test_flush_data(void)
+{
+ size_t report_size = get_oa_format(test_oa_format).size;
+ int oa_exponent =
+ find_oa_exponent_for_buffer_fill_time(MAX_OA_BUF_SIZE,
+ report_size,
+ 500 * 1000 * 1000 /* 500ms */);
+ uint64_t oa_period = oa_exponent_to_ns(oa_exponent);
+ size_t oa_buf_size = MAX_OA_BUF_SIZE;
+ int n_full_oa_reports = oa_buf_size / report_size;
+ uint64_t fill_duration = n_full_oa_reports * oa_period;
+ uint64_t properties[] = {
+ /* Include OA reports in samples */
+ DRM_I915_PERF_PROP_SAMPLE_OA, true,
+
+ /* OA unit configuration */
+ DRM_I915_PERF_PROP_OA_METRICS_SET, test_metric_set_id,
+ DRM_I915_PERF_PROP_OA_FORMAT, test_oa_format,
+ DRM_I915_PERF_PROP_OA_EXPONENT, oa_exponent,
+ DRM_I915_PERF_PROP_OA_ENABLE_INTERRUPT, true,
+
+ /* Kernel configuration */
+ DRM_I915_PERF_PROP_POLL_OA_DELAY, 0,
+ };
+ struct drm_i915_perf_open_param param = {
+ .flags = I915_PERF_FLAG_FD_CLOEXEC |
+ I915_PERF_FLAG_FD_NONBLOCK |
+ I915_PERF_FLAG_DISABLED,
+ .num_properties = ARRAY_SIZE(properties) / 2,
+ .properties_ptr = to_user_pointer(properties),
+ };
+ struct pollfd pollfd = { .events = POLLIN };
+ struct drm_i915_perf_record_header *header;
+ int buf_size = 65536 * (256 + sizeof(struct drm_i915_perf_record_header));
+ uint8_t *buf = malloc(buf_size);
+ uint32_t n_reports = 0, expected_reports, min_reports, max_reports;
+ int ret;
+
+ expected_reports = n_full_oa_reports / 5;
+ min_reports = expected_reports - expected_reports * 0.05;
+ max_reports = expected_reports + expected_reports * 0.05;
+
+ stream_fd = __perf_open(drm_fd, ¶m, false /* prevent_pm */);
+ pollfd.fd = stream_fd;
+
+ igt_debug("Fill duration for %s\n", pretty_print_oa_period(fill_duration));
+ igt_debug("Polling for %s\n", pretty_print_oa_period(fill_duration / 5));
+
+ do_ioctl(stream_fd, I915_PERF_IOCTL_ENABLE, 0);
+
+ /*
+ * Wait for a fifth the fill duration, no data should be
+ * available through poll()/read().
+ */
+ while ((ret = poll(&pollfd, 1, fill_duration / (5 * 1000 * 1000))) < 0 &&
+ errno == EINTR)
+ ;
+
+ igt_assert_eq(ret, 0);
+ igt_assert_eq(pollfd.revents, 0);
+
+ while ((ret = read(stream_fd, buf, MAX_OA_BUF_SIZE)) < 0 &&
+ errno == EINTR)
+ ;
+
+ igt_assert_eq(ret, -1);
+ igt_assert_eq(errno, EAGAIN);
+
+ /* Now force the driver to look at the head/tail pointers. */
+ ret = igt_ioctl(stream_fd, I915_PERF_IOCTL_FLUSH_DATA, 0);
+
+ /* Is this supported on this kernel? */
+ igt_skip_on(ret == -1 && errno == EINVAL);
+
+ /* Now poll() should report available data. */
+ while ((ret = poll(&pollfd, 1, 0)) < 0 &&
+ errno == EINTR)
+ ;
+
+ igt_assert_eq(ret, 1);
+ igt_assert(pollfd.revents & POLLIN);
+
+ /* And we should be able to read it. */
+ while ((ret = read(stream_fd, buf, MAX_OA_BUF_SIZE)) < 0 &&
+ errno == EINTR)
+ ;
+
+ igt_assert_lte(report_size, ret);
+
+ for (int offset = 0; offset < ret; offset += header->size) {
+ header = (void *)(buf + offset);
+
+ switch (header->type) {
+ case DRM_I915_PERF_RECORD_SAMPLE:
+ n_reports++;
+ break;
+ case DRM_I915_PERF_RECORD_OA_BUFFER_LOST:
+ igt_assert(!"unexpected overflow");
+ break;
+ }
+ }
+
+ igt_debug("Got %i report(s), expected range [%u, %u]\n",
+ n_reports, min_reports, max_reports);
+
+ /*
+ * Verify that we get about a third of the OA buffer full of
+ * report as we've waited for a third of the time it teakes to
+ * fill the buffer.
+ */
+ igt_assert_lte(n_reports, max_reports);
+ igt_assert_lte(min_reports, n_reports);
+
+ free(buf);
+
+ __perf_close(stream_fd);
+}
+
static unsigned long rc6_residency_ms(void)
{
return sysfs_read("power/rc6_residency_ms");
@@ -4464,6 +4587,17 @@ igt_main
(fill_time / 4) * max_reports / fill_time);
}
+ igt_subtest("flush-data") {
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_POLL_OA_DELAY,
+ 1000 * 1000 * 1000 /* 1 second */));
+ igt_require(kernel_supports_open_option(drm_fd,
+ DRM_I915_PERF_PROP_OA_ENABLE_INTERRUPT,
+ true));
+
+ test_flush_data();
+ }
+
igt_subtest("short-reads")
test_short_reads();
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for tests/perf: Add new tests for enabling the OA interrupt
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
` (3 preceding siblings ...)
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 4/4] tests/perf: add flush data ioctl test Lionel Landwerlin
@ 2019-01-16 21:50 ` Patchwork
2019-01-16 23:55 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
5 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2019-01-16 21:50 UTC (permalink / raw)
To: Lionel Landwerlin; +Cc: igt-dev
== Series Details ==
Series: tests/perf: Add new tests for enabling the OA interrupt
URL : https://patchwork.freedesktop.org/series/55310/
State : success
== Summary ==
CI Bug Log - changes from IGT_4776 -> IGTPW_2248
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://patchwork.freedesktop.org/api/1.0/series/55310/revisions/1/mbox/
Known issues
------------
Here are the changes found in IGTPW_2248 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@i915_module_load@reload:
- fi-kbl-7567u: PASS -> DMESG-WARN [fdo#105602] / [fdo#108529]
* igt@kms_chamelium@common-hpd-after-suspend:
- fi-kbl-7567u: PASS -> DMESG-FAIL [fdo#105079]
* igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
- fi-byt-clapper: PASS -> FAIL [fdo#103191] / [fdo#107362] +1
* igt@pm_rpm@module-reload:
- fi-kbl-7567u: NOTRUN -> DMESG-WARN [fdo#108529]
#### Possible fixes ####
* igt@i915_module_load@reload-no-display:
- fi-kbl-7567u: DMESG-WARN [fdo#103558] / [fdo#105602] -> PASS
* igt@i915_selftest@live_hangcheck:
- fi-bwr-2160: DMESG-FAIL [fdo#108735] -> PASS
* igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
- fi-blb-e6850: INCOMPLETE [fdo#107718] -> PASS
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103191]: https://bugs.freedesktop.org/show_bug.cgi?id=103191
[fdo#103558]: https://bugs.freedesktop.org/show_bug.cgi?id=103558
[fdo#105079]: https://bugs.freedesktop.org/show_bug.cgi?id=105079
[fdo#105602]: https://bugs.freedesktop.org/show_bug.cgi?id=105602
[fdo#107362]: https://bugs.freedesktop.org/show_bug.cgi?id=107362
[fdo#107718]: https://bugs.freedesktop.org/show_bug.cgi?id=107718
[fdo#108529]: https://bugs.freedesktop.org/show_bug.cgi?id=108529
[fdo#108735]: https://bugs.freedesktop.org/show_bug.cgi?id=108735
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
Participating hosts (49 -> 43)
------------------------------
Missing (6): fi-kbl-soraka fi-ilk-m540 fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-icl-y
Build changes
-------------
* IGT: IGT_4776 -> IGTPW_2248
CI_DRM_5434: f7277432c1bb671177bdef59755cb88c4ad9f75f @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_2248: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2248/
IGT_4776: a76fa4d02cc806e30ed72ba1b8233c694ab1727b @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@perf@blocking-parameterized
+igt@perf@blocking-with-interrupt
+igt@perf@flush-data
+igt@perf@polling-parameterized
+igt@perf@polling-with-interrupt
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2248/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt Lionel Landwerlin
@ 2019-01-16 23:30 ` Chris Wilson
2019-01-17 11:03 ` Lionel Landwerlin
0 siblings, 1 reply; 10+ messages in thread
From: Chris Wilson @ 2019-01-16 23:30 UTC (permalink / raw)
To: Lionel Landwerlin, igt-dev; +Cc: matthew.auld
Quoting Lionel Landwerlin (2019-01-16 15:37:31)
> + if (use_polling) {
> + while ((ret = poll(&pollfd, 1, -1)) < 0 &&
> + errno == EINTR)
> + ;
Hmm, are we sending signals to ourself? Just wondering if EINTR here is
a kernel bug...
> + igt_assert_eq(ret, 1);
> + igt_assert(pollfd.revents & POLLIN);
> + }
> +
> + while ((ret = read(stream_fd, buf, MAX_OA_BUF_SIZE)) < 0 &&
> + errno == EINTR)
> + ;
> +
> + if (ret < 0)
> + igt_debug("Unexpected error when reading after poll = %d\n", errno);
> + igt_assert_neq(ret, -1);
igt_assert_f(ret != -1,
"Unexpected error when reading after poll, %m\n");
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* [igt-dev] ✓ Fi.CI.IGT: success for tests/perf: Add new tests for enabling the OA interrupt
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
` (4 preceding siblings ...)
2019-01-16 21:50 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/perf: Add new tests for enabling the OA interrupt Patchwork
@ 2019-01-16 23:55 ` Patchwork
5 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2019-01-16 23:55 UTC (permalink / raw)
To: Lionel Landwerlin; +Cc: igt-dev
== Series Details ==
Series: tests/perf: Add new tests for enabling the OA interrupt
URL : https://patchwork.freedesktop.org/series/55310/
State : success
== Summary ==
CI Bug Log - changes from IGT_4776_full -> IGTPW_2248_full
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://patchwork.freedesktop.org/api/1.0/series/55310/revisions/1/mbox/
Known issues
------------
Here are the changes found in IGTPW_2248_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_busy@extended-pageflip-hang-newfb-render-c:
- shard-apl: PASS -> DMESG-WARN [fdo#107956]
- shard-glk: NOTRUN -> DMESG-WARN [fdo#107956]
* igt@kms_ccs@pipe-a-crc-sprite-planes-basic:
- shard-glk: PASS -> FAIL [fdo#108145] +1
* igt@kms_cursor_crc@cursor-64x21-random:
- shard-apl: PASS -> FAIL [fdo#103232] +3
* igt@kms_cursor_crc@cursor-64x64-dpms:
- shard-kbl: PASS -> FAIL [fdo#103232] +1
* igt@kms_cursor_crc@cursor-size-change:
- shard-glk: PASS -> FAIL [fdo#103232] +1
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-render:
- shard-apl: PASS -> FAIL [fdo#103167] +2
- shard-kbl: PASS -> FAIL [fdo#103167]
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt:
- shard-glk: PASS -> FAIL [fdo#103167] +3
* igt@kms_plane@pixel-format-pipe-b-planes-source-clamping:
- shard-apl: PASS -> FAIL [fdo#108948]
- shard-glk: PASS -> FAIL [fdo#108948]
* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes:
- shard-snb: PASS -> INCOMPLETE [fdo#105411]
* igt@kms_plane_alpha_blend@pipe-b-alpha-7efc:
- shard-apl: NOTRUN -> FAIL [fdo#108145]
* igt@kms_plane_multiple@atomic-pipe-b-tiling-none:
- shard-glk: PASS -> FAIL [fdo#103166] +1
- shard-apl: PASS -> FAIL [fdo#103166] +4
#### Possible fixes ####
* igt@kms_color@pipe-c-ctm-max:
- shard-apl: FAIL [fdo#108147] -> PASS
* igt@kms_cursor_crc@cursor-128x128-suspend:
- shard-glk: FAIL [fdo#103232] -> PASS +2
- shard-apl: FAIL [fdo#103191] / [fdo#103232] -> PASS +1
* igt@kms_cursor_crc@cursor-64x21-sliding:
- shard-apl: FAIL [fdo#103232] -> PASS +3
* igt@kms_cursor_crc@cursor-64x64-suspend:
- shard-kbl: FAIL [fdo#103191] / [fdo#103232] -> PASS +1
* igt@kms_draw_crc@draw-method-xrgb2101010-mmap-wc-xtiled:
- shard-snb: INCOMPLETE [fdo#105411] / [fdo#107469] -> PASS
* igt@kms_flip@bo-too-big:
- shard-kbl: DMESG-WARN [fdo#105345] -> PASS
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-kbl: FAIL [fdo#103167] -> PASS
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-onoff:
- shard-apl: FAIL [fdo#103167] -> PASS +1
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-mmap-wc:
- shard-glk: FAIL [fdo#103167] -> PASS +3
* igt@kms_plane@pixel-format-pipe-a-planes-source-clamping:
- shard-apl: FAIL [fdo#108948] -> PASS
* igt@kms_plane_alpha_blend@pipe-c-constant-alpha-max:
- shard-glk: FAIL [fdo#108145] -> PASS
- shard-apl: FAIL [fdo#108145] -> PASS
* igt@kms_plane_multiple@atomic-pipe-b-tiling-y:
- shard-glk: FAIL [fdo#103166] -> PASS +2
* igt@kms_plane_multiple@atomic-pipe-c-tiling-yf:
- shard-apl: FAIL [fdo#103166] -> PASS
- shard-kbl: FAIL [fdo#103166] -> PASS +1
* igt@kms_rotation_crc@primary-rotation-270:
- shard-apl: INCOMPLETE [fdo#103927] -> PASS
* igt@kms_setmode@basic:
- shard-kbl: FAIL [fdo#99912] -> PASS
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103166]: https://bugs.freedesktop.org/show_bug.cgi?id=103166
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103191]: https://bugs.freedesktop.org/show_bug.cgi?id=103191
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#105345]: https://bugs.freedesktop.org/show_bug.cgi?id=105345
[fdo#105411]: https://bugs.freedesktop.org/show_bug.cgi?id=105411
[fdo#107469]: https://bugs.freedesktop.org/show_bug.cgi?id=107469
[fdo#107956]: https://bugs.freedesktop.org/show_bug.cgi?id=107956
[fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
[fdo#108147]: https://bugs.freedesktop.org/show_bug.cgi?id=108147
[fdo#108948]: https://bugs.freedesktop.org/show_bug.cgi?id=108948
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
Participating hosts (7 -> 5)
------------------------------
Missing (2): shard-skl shard-iclb
Build changes
-------------
* IGT: IGT_4776 -> IGTPW_2248
CI_DRM_5434: f7277432c1bb671177bdef59755cb88c4ad9f75f @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_2248: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2248/
IGT_4776: a76fa4d02cc806e30ed72ba1b8233c694ab1727b @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2248/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt
2019-01-16 23:30 ` Chris Wilson
@ 2019-01-17 11:03 ` Lionel Landwerlin
2019-01-17 11:26 ` Chris Wilson
0 siblings, 1 reply; 10+ messages in thread
From: Lionel Landwerlin @ 2019-01-17 11:03 UTC (permalink / raw)
To: Chris Wilson, igt-dev; +Cc: matthew.auld
On 16/01/2019 23:30, Chris Wilson wrote:
> Quoting Lionel Landwerlin (2019-01-16 15:37:31)
>> + if (use_polling) {
>> + while ((ret = poll(&pollfd, 1, -1)) < 0 &&
>> + errno == EINTR)
>> + ;
> Hmm, are we sending signals to ourself? Just wondering if EINTR here is
> a kernel bug...
Hmm nope. I just assumed anything could interrupt us.
I think igt_ioctl() does the same right?
>
>> + igt_assert_eq(ret, 1);
>> + igt_assert(pollfd.revents & POLLIN);
>> + }
>> +
>> + while ((ret = read(stream_fd, buf, MAX_OA_BUF_SIZE)) < 0 &&
>> + errno == EINTR)
>> + ;
>> +
>> + if (ret < 0)
>> + igt_debug("Unexpected error when reading after poll = %d\n", errno);
>> + igt_assert_neq(ret, -1);
> igt_assert_f(ret != -1,
> "Unexpected error when reading after poll, %m\n");
> -Chris
>
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt
2019-01-17 11:03 ` Lionel Landwerlin
@ 2019-01-17 11:26 ` Chris Wilson
0 siblings, 0 replies; 10+ messages in thread
From: Chris Wilson @ 2019-01-17 11:26 UTC (permalink / raw)
To: Lionel Landwerlin, igt-dev; +Cc: matthew.auld
Quoting Lionel Landwerlin (2019-01-17 11:03:48)
> On 16/01/2019 23:30, Chris Wilson wrote:
> > Quoting Lionel Landwerlin (2019-01-16 15:37:31)
> >> + if (use_polling) {
> >> + while ((ret = poll(&pollfd, 1, -1)) < 0 &&
> >> + errno == EINTR)
> >> + ;
> > Hmm, are we sending signals to ourself? Just wondering if EINTR here is
> > a kernel bug...
>
>
> Hmm nope. I just assumed anything could interrupt us.
>
> I think igt_ioctl() does the same right?
In the general case, we do need to restart on signals as we do interrupt
ourselves.
I was worrying in case you've observed EINTR here in practice, as I
couldn't see a reason why (hence fretting over whether the chain of
wake_ups is causing issues in the kernel).
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2019-01-17 11:27 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-16 15:37 [igt-dev] [PATCH i-g-t 0/4] tests/perf: Add new tests for enabling the OA interrupt Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 1/4] bump headers Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 2/4] tests/perf: new tests for parameterized OA buffer polling Lionel Landwerlin
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 3/4] tests/perf: new tests for OA interrupt Lionel Landwerlin
2019-01-16 23:30 ` Chris Wilson
2019-01-17 11:03 ` Lionel Landwerlin
2019-01-17 11:26 ` Chris Wilson
2019-01-16 15:37 ` [igt-dev] [PATCH i-g-t 4/4] tests/perf: add flush data ioctl test Lionel Landwerlin
2019-01-16 21:50 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/perf: Add new tests for enabling the OA interrupt Patchwork
2019-01-16 23:55 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.