From db479d6e555bc938c0e559f69f017df94cfd2878 Mon Sep 17 00:00:00 2001 From: riastradh Date: Tue, 3 Jun 2014 15:06:36 +0000 Subject: [PATCH] Ensure we call uvmfault_unlockall on every exit from i915_gem_fault. --- sys/external/bsd/drm2/dist/drm/i915/i915_gem.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c b/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c index b20e934339f6..61cfffa76e28 100644 --- a/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c +++ b/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c @@ -1564,6 +1564,9 @@ unpin: unlock: mutex_unlock(&dev->struct_mutex); out: + uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); + if (ret == -ERESTART) + uvm_wait("i915flt"); return ret; } @@ -1581,7 +1584,6 @@ i915_udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, struct vm_page **pps, paddr_t gtt_paddr) { struct vm_map_entry *entry = ufi->entry; - struct uvm_object *uobj = entry->object.uvm_obj; vaddr_t curr_va; off_t curr_offset; paddr_t paddr; @@ -1599,7 +1601,6 @@ i915_udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, struct vm_page **pps, if (UVM_ET_ISCOPYONWRITE(entry)) { UVMHIST_LOG(maphist, "<- failed -- COW entry (etype=0x%x)", entry->etype, 0,0,0); - uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); return(EIO); } @@ -1647,15 +1648,11 @@ i915_udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, struct vm_page **pps, * XXX case. */ pmap_update(ufi->orig_map->pmap); /* sync what we have so far */ - uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, - uobj); - uvm_wait("i915flt"); return (ERESTART); } } pmap_update(ufi->orig_map->pmap); - uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); return (retval); } #else