Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/i915: Convert EFAULT into a silent SIGBUS
@ 2014-01-31 11:34 Chris Wilson
  2014-01-31 11:34 ` [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT Chris Wilson
  0 siblings, 1 reply; 7+ messages in thread
From: Chris Wilson @ 2014-01-31 11:34 UTC (permalink / raw)
  To: intel-gfx

EFAULT will be a possible return code where backing storage is
transient, such after it is purged by madvise. As such it is to be
expected and so should not trigger a WARN inside i915_gem_fault() but be
converted silently to SIGBUS.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d58f777903c0..f2ef2c8518ba 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1574,6 +1574,7 @@ out:
 		ret = VM_FAULT_OOM;
 		break;
 	case -ENOSPC:
+	case -EFAULT:
 		ret = VM_FAULT_SIGBUS;
 		break;
 	default:
-- 
1.9.rc1

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

* [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT
  2014-01-31 11:34 [PATCH 1/2] drm/i915: Convert EFAULT into a silent SIGBUS Chris Wilson
@ 2014-01-31 11:34 ` Chris Wilson
  2014-02-04 11:05   ` Daniel Vetter
  0 siblings, 1 reply; 7+ messages in thread
From: Chris Wilson @ 2014-01-31 11:34 UTC (permalink / raw)
  To: intel-gfx

Since a purged buffer is one without any associated pages, attempting to
use it should generate EFAULT rather than EINVAL, as it is not strictly
an invalid parameter.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index f2ef2c8518ba..1c91a6718e89 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1733,7 +1733,7 @@ i915_gem_mmap_gtt(struct drm_file *file,
 
 	if (obj->madv != I915_MADV_WILLNEED) {
 		DRM_ERROR("Attempting to mmap a purgeable buffer\n");
-		ret = -EINVAL;
+		ret = -EFAULT;
 		goto out;
 	}
 
@@ -2087,7 +2087,7 @@ i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 
 	if (obj->madv != I915_MADV_WILLNEED) {
 		DRM_ERROR("Attempting to obtain a purgeable object\n");
-		return -EINVAL;
+		return -EFAULT;
 	}
 
 	BUG_ON(obj->pages_pin_count);
@@ -4091,7 +4091,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,
 
 	if (obj->madv != I915_MADV_WILLNEED) {
 		DRM_ERROR("Attempting to pin a purgeable buffer\n");
-		ret = -EINVAL;
+		ret = -EFAULT;
 		goto out;
 	}
 
-- 
1.9.rc1

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

* Re: [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT
  2014-01-31 11:34 ` [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT Chris Wilson
@ 2014-02-04 11:05   ` Daniel Vetter
  2014-02-04 11:36     ` Chris Wilson
  0 siblings, 1 reply; 7+ messages in thread
From: Daniel Vetter @ 2014-02-04 11:05 UTC (permalink / raw)
  To: Chris Wilson; +Cc: intel-gfx

On Fri, Jan 31, 2014 at 11:34:58AM +0000, Chris Wilson wrote:
> Since a purged buffer is one without any associated pages, attempting to
> use it should generate EFAULT rather than EINVAL, as it is not strictly
> an invalid parameter.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

Care to drop a quick testcase into i-g-t to encode this return value
change? Also, any plans to use this with userspace somehow, or what's the
motivation for this?
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

* Re: [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT
  2014-02-04 11:05   ` Daniel Vetter
@ 2014-02-04 11:36     ` Chris Wilson
  2014-02-04 13:23       ` Daniel Vetter
  0 siblings, 1 reply; 7+ messages in thread
From: Chris Wilson @ 2014-02-04 11:36 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx

On Tue, Feb 04, 2014 at 12:05:13PM +0100, Daniel Vetter wrote:
> On Fri, Jan 31, 2014 at 11:34:58AM +0000, Chris Wilson wrote:
> > Since a purged buffer is one without any associated pages, attempting to
> > use it should generate EFAULT rather than EINVAL, as it is not strictly
> > an invalid parameter.
> > 
> > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> 
> Care to drop a quick testcase into i-g-t to encode this return value
> change? Also, any plans to use this with userspace somehow, or what's the
> motivation for this?

Just that we have other paths where inaccessible pages are reported back
to userspace as EFAULT, and this is another case where we could distinguish
the errno and so be more consistent.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

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

* Re: [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT
  2014-02-04 11:36     ` Chris Wilson
@ 2014-02-04 13:23       ` Daniel Vetter
  2014-02-04 14:14         ` [PATCH] tests: Add gem_madvise Chris Wilson
  0 siblings, 1 reply; 7+ messages in thread
From: Daniel Vetter @ 2014-02-04 13:23 UTC (permalink / raw)
  To: Chris Wilson, Daniel Vetter, intel-gfx

On Tue, Feb 04, 2014 at 11:36:39AM +0000, Chris Wilson wrote:
> On Tue, Feb 04, 2014 at 12:05:13PM +0100, Daniel Vetter wrote:
> > On Fri, Jan 31, 2014 at 11:34:58AM +0000, Chris Wilson wrote:
> > > Since a purged buffer is one without any associated pages, attempting to
> > > use it should generate EFAULT rather than EINVAL, as it is not strictly
> > > an invalid parameter.
> > > 
> > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> > 
> > Care to drop a quick testcase into i-g-t to encode this return value
> > change? Also, any plans to use this with userspace somehow, or what's the
> > motivation for this?
> 
> Just that we have other paths where inaccessible pages are reported back
> to userspace as EFAULT, and this is another case where we could distinguish
> the errno and so be more consistent.

Makes sense. I'll merge the patches once we have a bit of igt to enshrine
this.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

* [PATCH] tests: Add gem_madvise
  2014-02-04 13:23       ` Daniel Vetter
@ 2014-02-04 14:14         ` Chris Wilson
  2014-02-04 16:04           ` Daniel Vetter
  0 siblings, 1 reply; 7+ messages in thread
From: Chris Wilson @ 2014-02-04 14:14 UTC (permalink / raw)
  To: intel-gfx

Exercise that calling madvise produces expected results

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 tests/.gitignore       |   1 +
 tests/Makefile.sources |   1 +
 tests/gem_madvise.c    | 155 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 157 insertions(+)
 create mode 100644 tests/gem_madvise.c

diff --git a/tests/.gitignore b/tests/.gitignore
index 7377275..30d738f 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -48,6 +48,7 @@ gem_hangcheck_forcewake
 gem_largeobject
 gem_linear_blits
 gem_lut_handle
+gem_madvise
 gem_media_fill
 gem_mmap
 gem_mmap_gtt
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 459c7c9..124b235 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -34,6 +34,7 @@ TESTS_progs_M = \
 	gem_flink \
 	gem_flink_race \
 	gem_linear_blits \
+	gem_madvise \
 	gem_mmap \
 	gem_mmap_gtt \
 	gem_partial_pwrite_pread \
diff --git a/tests/gem_madvise.c b/tests/gem_madvise.c
new file mode 100644
index 0000000..a7bd22c
--- /dev/null
+++ b/tests/gem_madvise.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright © 2014 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Chris Wilson <chris@chris-wilson.co.uk>
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <setjmp.h>
+#include <signal.h>
+
+#include "drm.h"
+#include "i915_drm.h"
+#include "drmtest.h"
+
+#define OBJECT_SIZE (1024*1024)
+
+/* Testcase: checks that the kernel reports EFAULT when trying to use purged bo
+ *
+ */
+
+static jmp_buf jmp;
+
+static void sigtrap(int sig)
+{
+	longjmp(jmp, sig);
+}
+
+static void
+dontneed_before_mmap(void)
+{
+	int fd = drm_open_any();
+	uint32_t handle;
+	char *ptr;
+
+	handle = gem_create(fd, OBJECT_SIZE);
+	gem_madvise(fd, handle, I915_MADV_DONTNEED);
+	ptr = gem_mmap(fd, handle, OBJECT_SIZE, PROT_READ | PROT_WRITE);
+	igt_assert(ptr == NULL);
+	igt_assert(errno == EFAULT);
+	close(fd);
+}
+
+static void
+dontneed_after_mmap(void)
+{
+	int fd = drm_open_any();
+	uint32_t handle;
+	char *ptr;
+
+	handle = gem_create(fd, OBJECT_SIZE);
+	ptr = gem_mmap(fd, handle, OBJECT_SIZE, PROT_READ | PROT_WRITE);
+	igt_assert(ptr != NULL);
+	gem_madvise(fd, handle, I915_MADV_DONTNEED);
+	close(fd);
+
+	signal(SIGBUS, sigtrap);
+	switch (setjmp(jmp)) {
+	case SIGBUS:
+		break;
+	case 0:
+		*ptr = 0;
+	default:
+		igt_assert(!"reached");
+		break;
+	}
+	munmap(ptr, OBJECT_SIZE);
+	signal(SIGBUS, SIG_DFL);
+}
+
+static void
+dontneed_before_pwrite(void)
+{
+	int fd = drm_open_any();
+	uint32_t buf[] = { MI_BATCH_BUFFER_END, 0 };
+	struct drm_i915_gem_pwrite gem_pwrite;
+
+	gem_pwrite.handle = gem_create(fd, OBJECT_SIZE);
+	gem_pwrite.offset = 0;
+	gem_pwrite.size = sizeof(buf);
+	gem_pwrite.data_ptr = (uintptr_t)buf;
+	gem_madvise(fd, gem_pwrite.handle, I915_MADV_DONTNEED);
+
+	igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &gem_pwrite));
+	igt_assert(errno == EFAULT);
+
+	gem_close(fd, gem_pwrite.handle);
+	close(fd);
+}
+
+static void
+dontneed_before_exec(void)
+{
+	int fd = drm_open_any();
+	struct drm_i915_gem_execbuffer2 execbuf;
+	struct drm_i915_gem_exec_object2 exec;
+	uint32_t buf[] = { MI_BATCH_BUFFER_END, 0 };
+
+	memset(&execbuf, 0, sizeof(execbuf));
+	memset(&exec, 0, sizeof(exec));
+
+	exec.handle = gem_create(fd, OBJECT_SIZE);
+	gem_write(fd, exec.handle, 0, buf, sizeof(buf));
+	gem_madvise(fd, exec.handle, I915_MADV_DONTNEED);
+
+	execbuf.buffers_ptr = (uintptr_t)&exec;
+	execbuf.buffer_count = 1;
+	gem_execbuf(fd, &execbuf);
+
+	gem_close(fd, exec.handle);
+	close(fd);
+}
+
+igt_simple_main
+{
+	igt_skip_on_simulation();
+
+	igt_subtest("dontneed-before-mmap")
+		dontneed_before_mmap();
+
+	igt_subtest("dontneed-after-mmap")
+		dontneed_after_mmap();
+
+	igt_subtest("dontneed-before-pwrite")
+		dontneed_before_pwrite();
+
+	igt_subtest("dontneed-before-exec")
+		dontneed_before_exec();
+}
-- 
1.9.rc1

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

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

* Re: [PATCH] tests: Add gem_madvise
  2014-02-04 14:14         ` [PATCH] tests: Add gem_madvise Chris Wilson
@ 2014-02-04 16:04           ` Daniel Vetter
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Vetter @ 2014-02-04 16:04 UTC (permalink / raw)
  To: Chris Wilson; +Cc: intel-gfx

On Tue, Feb 04, 2014 at 02:14:31PM +0000, Chris Wilson wrote:
> Exercise that calling madvise produces expected results
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

Thanks a lot for the testcase and patches, all pulled in.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

end of thread, other threads:[~2014-02-04 16:04 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-31 11:34 [PATCH 1/2] drm/i915: Convert EFAULT into a silent SIGBUS Chris Wilson
2014-01-31 11:34 ` [PATCH 2/2] drm/i915: Treat using a purged buffer as a source of EFAULT Chris Wilson
2014-02-04 11:05   ` Daniel Vetter
2014-02-04 11:36     ` Chris Wilson
2014-02-04 13:23       ` Daniel Vetter
2014-02-04 14:14         ` [PATCH] tests: Add gem_madvise Chris Wilson
2014-02-04 16:04           ` Daniel Vetter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox