diff options
author | Jean-Sébastien Pédron <dumbbell@FreeBSD.org> | 2016-03-12 11:54:58 +0000 |
---|---|---|
committer | Jean-Sébastien Pédron <dumbbell@FreeBSD.org> | 2016-03-12 11:54:58 +0000 |
commit | 538cf7be5e2825541450a3c40af0e54e03e3b23c (patch) | |
tree | 9a70f01d8414ec49cd19d8dbe24af6c2c89f78a6 /sys/dev/drm2/i915 | |
parent | 85a60a7756050c046aa86ae3dc7a10cbd0145933 (diff) | |
download | src-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.c | 7 |
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; |