All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] drm/i915: fix pm refcounting on fence error in execbuf
@ 2017-02-04  0:08 Daniele Ceraolo Spurio
  2017-02-04  0:10 ` [PATCH v2] tests/gem_exec_params: add test for exec_fence params Daniele Ceraolo Spurio
  0 siblings, 1 reply; 2+ messages in thread
From: Daniele Ceraolo Spurio @ 2017-02-04  0:08 UTC (permalink / raw)
  To: intel-gfx

Fences are creted/checked before the pm ref is taken, so if we jump to
pre_mutex_err we will uncorrectly call intel_runtime_pm_put.

v2: transform unwind sequence (Chris)

Fixes: fec0445caa27 (drm/i915: Support explicit fencing for execbuf)
Testcase: igt/gem_exec_params
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
---
 drivers/gpu/drm/i915/i915_gem_execbuffer.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index a40ade6..8987d38 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1643,18 +1643,15 @@ static void eb_export_fence(struct drm_i915_gem_object *obj,
 
 	if (args->flags & I915_EXEC_FENCE_IN) {
 		in_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));
-		if (!in_fence) {
-			ret = -EINVAL;
-			goto pre_mutex_err;
-		}
+		if (!in_fence)
+			return -EINVAL;
 	}
 
 	if (args->flags & I915_EXEC_FENCE_OUT) {
 		out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
 		if (out_fence_fd < 0) {
 			ret = out_fence_fd;
-			out_fence_fd = -1;
-			goto pre_mutex_err;
+			goto err_in_fence;
 		}
 	}
 
@@ -1877,6 +1874,8 @@ static void eb_export_fence(struct drm_i915_gem_object *obj,
 	intel_runtime_pm_put(dev_priv);
 	if (out_fence_fd != -1)
 		put_unused_fd(out_fence_fd);
+
+err_in_fence:
 	dma_fence_put(in_fence);
 	return ret;
 }
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH v2] tests/gem_exec_params: add test for exec_fence params
  2017-02-04  0:08 [PATCH v2] drm/i915: fix pm refcounting on fence error in execbuf Daniele Ceraolo Spurio
@ 2017-02-04  0:10 ` Daniele Ceraolo Spurio
  0 siblings, 0 replies; 2+ messages in thread
From: Daniele Ceraolo Spurio @ 2017-02-04  0:10 UTC (permalink / raw)
  To: intel-gfx

Added a subtest for invalid FENCE_IN usage, updated invalid-flag subtest
and made the rsvd2 test skip when exec fences are available.

v2: add a test that tries to use the device fd as fence (Chris)

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
---
 lib/ioctl_wrappers.c    | 29 +++++++++++++++++++++++++++++
 lib/ioctl_wrappers.h    |  1 +
 tests/gem_exec_fence.c  | 14 --------------
 tests/gem_exec_params.c | 33 ++++++++++++++++++++++++++++++---
 4 files changed, 60 insertions(+), 17 deletions(-)

diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index ccc5ccf..cd0c24b 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -1433,6 +1433,35 @@ bool gem_has_softpin(int fd)
 	return has_softpin;
 }
 
+#define LOCAL_PARAM_HAS_EXEC_FENCE 44
+/**
+ * gem_has_exec_fence:
+ * @fd: open i915 drm file descriptor
+ *
+ * Feature test macro to query whether in/out fence support in execbuffer is
+ * available.
+ *
+ * Returns: Whether fence support is available
+ */
+bool gem_has_exec_fence(int fd)
+{
+	static int has_exec_fence = -1;
+
+	if (has_exec_fence < 0) {
+		struct drm_i915_getparam gp;
+
+		memset(&gp, 0, sizeof(gp));
+		gp.param = LOCAL_PARAM_HAS_EXEC_FENCE;
+		gp.value = &has_exec_fence;
+
+		has_exec_fence = 0;
+		ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp));
+		errno = 0;
+	}
+
+	return has_exec_fence;
+}
+
 /**
  * gem_require_caching:
  * @fd: open i915 drm file descriptor
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index 5f3bbd1..64628df 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -164,6 +164,7 @@ uint64_t gem_aperture_size(int fd);
 uint64_t gem_global_aperture_size(int fd);
 uint64_t gem_mappable_aperture_size(void);
 bool gem_has_softpin(int fd);
+bool gem_has_exec_fence(int fd);
 
 /* check functions which auto-skip tests by calling igt_skip() */
 void gem_require_caching(int fd);
diff --git a/tests/gem_exec_fence.c b/tests/gem_exec_fence.c
index 3df436a..ddc5e7f 100644
--- a/tests/gem_exec_fence.c
+++ b/tests/gem_exec_fence.c
@@ -309,20 +309,6 @@ static void test_fence_flip(int i915)
 	igt_skip_on_f(1, "no fence-in for atomic flips\n");
 }
 
-static bool gem_has_exec_fence(int fd)
-{
-	struct drm_i915_getparam gp;
-	int val = -1;
-
-	memset(&gp, 0, sizeof(gp));
-	gp.param = LOCAL_PARAM_HAS_EXEC_FENCE;
-	gp.value = &val;
-
-	ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
-	return val > 0;
-}
-
 igt_main
 {
 	const struct intel_execution_engine *e;
diff --git a/tests/gem_exec_params.c b/tests/gem_exec_params.c
index f9a2054..8a6cb45 100644
--- a/tests/gem_exec_params.c
+++ b/tests/gem_exec_params.c
@@ -45,6 +45,8 @@
 #define LOCAL_I915_EXEC_BSD_RING1 (1<<13)
 #define LOCAL_I915_EXEC_BSD_RING2 (2<<13)
 #define LOCAL_I915_EXEC_RESOURCE_STREAMER (1<<15)
+#define LOCAL_I915_EXEC_FENCE_IN (1 << 16)
+#define LOCAL_I915_EXEC_FENCE_OUT (1 << 17)
 
 static bool has_ring(int fd, unsigned ring_exec_flags)
 {
@@ -239,13 +241,15 @@ igt_main
 				    &execbuf) == 0);
 	}
 
-	/* HANDLE_LUT and NO_RELOC are already exercised by gem_exec_lut_handle */
+	/* HANDLE_LUT and NO_RELOC are already exercised by gem_exec_lut_handle,
+	 * EXEC_FENCE_IN and EXEC_FENCE_OUT correct usage is tested by
+	 * gem_exec_fence, invalid usage of EXEC_FENCE_IN is tested below. */
 
 	igt_subtest("invalid-flag") {
 		/* NOTE: This test intentionally exercise the next available
 		 * flag. Don't "fix" this testcase without adding the required
 		 * tests for the new flag first. */
-		execbuf.flags = I915_EXEC_RENDER | (LOCAL_I915_EXEC_RESOURCE_STREAMER << 1);
+		execbuf.flags = I915_EXEC_RENDER | (LOCAL_I915_EXEC_FENCE_OUT << 1);
 		RUN_FAIL(EINVAL);
 	}
 
@@ -283,6 +287,30 @@ igt_main
 		RUN_FAIL(EINVAL);
 	}
 
+	igt_subtest("invalid-fence-in") {
+		igt_require(gem_has_exec_fence(fd));
+		execbuf.flags = LOCAL_I915_EXEC_FENCE_IN;
+		execbuf.rsvd2 = -1;
+		RUN_FAIL(EINVAL);
+		execbuf.rsvd2 = 0;
+	}
+
+	igt_subtest("invalid-fence-in2") {
+		igt_require(gem_has_exec_fence(fd));
+		execbuf.flags = LOCAL_I915_EXEC_FENCE_IN;
+		execbuf.rsvd2 = fd;
+		RUN_FAIL(EINVAL);
+		execbuf.rsvd2 = 0;
+	}
+
+	igt_subtest("rsvd2-dirt") {
+		igt_require(!gem_has_exec_fence(fd));
+		execbuf.flags = 0;
+		execbuf.rsvd2 = 1;
+		RUN_FAIL(EINVAL);
+		execbuf.rsvd2 = 0;
+	}
+
 #define DIRT(name) \
 	igt_subtest(#name "-dirt") { \
 		execbuf.flags = 0; \
@@ -291,7 +319,6 @@ igt_main
 		execbuf.name = 0; \
 	}
 
-	DIRT(rsvd2);
 	DIRT(cliprects_ptr);
 	DIRT(DR1);
 	DIRT(DR4);
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-02-04  0:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-04  0:08 [PATCH v2] drm/i915: fix pm refcounting on fence error in execbuf Daniele Ceraolo Spurio
2017-02-04  0:10 ` [PATCH v2] tests/gem_exec_params: add test for exec_fence params Daniele Ceraolo Spurio

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.