aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/drm2/i915
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <dumbbell@FreeBSD.org>2016-03-12 11:54:58 +0000
committerJean-Sébastien Pédron <dumbbell@FreeBSD.org>2016-03-12 11:54:58 +0000
commit538cf7be5e2825541450a3c40af0e54e03e3b23c (patch)
tree9a70f01d8414ec49cd19d8dbe24af6c2c89f78a6 /sys/dev/drm2/i915
parent85a60a7756050c046aa86ae3dc7a10cbd0145933 (diff)
downloadsrc-538cf7be5e2825541450a3c40af0e54e03e3b23c.tar.gz
src-538cf7be5e2825541450a3c40af0e54e03e3b23c.zip
drm/i915: Fix page fault handler failure
... when __wait_seqno() is interrupted by a signal. In this case, __wait_seqno() returns -ERESTARTSYS. Like we already do in drm_ioctl(), we need to convert this error to a common code such as -EINTR, so the page fault handler is restarted. Reported by: Frederic Chardon <chardon.frederic@gmail.com> Tested by: Frederic Chardon <chardon.frederic@gmail.com>
Notes
Notes: svn path=/head/; revision=296720
Diffstat (limited to 'sys/dev/drm2/i915')
-rw-r--r--sys/dev/drm2/i915/i915_gem.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/dev/drm2/i915/i915_gem.c b/sys/dev/drm2/i915/i915_gem.c
index 625c8a67c175..7789e360326e 100644
--- a/sys/dev/drm2/i915/i915_gem.c
+++ b/sys/dev/drm2/i915/i915_gem.c
@@ -1619,6 +1619,13 @@ out:
KASSERT(ret != 0, ("i915_gem_pager_fault: wrong return"));
CTR4(KTR_DRM, "fault_fail %p %jx %x err %d", gem_obj, offset, prot,
-ret);
+ if (ret == -ERESTARTSYS) {
+ /*
+ * NOTE Linux<->FreeBSD: Convert Linux' -ERESTARTSYS to
+ * the more common -EINTR, so the page fault is retried.
+ */
+ ret = -EINTR;
+ }
if (ret == -EAGAIN || ret == -EIO || ret == -EINTR) {
kern_yield(PRI_USER);
goto retry;