Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'drm-misc-next-fixes-2019-11-20' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

- Fix ttm bo refcnt when using the new gem obj mmap hook (Thomas)

Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Sean Paul <sean@poorly.run>
Link: https://patchwork.freedesktop.org/patch/msgid/20191120204946.GA120328@art_vandelay

+39 -24
+27 -23
drivers/gpu/drm/drm_gem.c
··· 1105 1105 if (obj_size < vma->vm_end - vma->vm_start) 1106 1106 return -EINVAL; 1107 1107 1108 - if (obj->funcs && obj->funcs->mmap) { 1109 - /* Remove the fake offset */ 1110 - vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node); 1111 - 1112 - ret = obj->funcs->mmap(obj, vma); 1113 - if (ret) 1114 - return ret; 1115 - WARN_ON(!(vma->vm_flags & VM_DONTEXPAND)); 1116 - } else { 1117 - if (obj->funcs && obj->funcs->vm_ops) 1118 - vma->vm_ops = obj->funcs->vm_ops; 1119 - else if (dev->driver->gem_vm_ops) 1120 - vma->vm_ops = dev->driver->gem_vm_ops; 1121 - else 1122 - return -EINVAL; 1123 - 1124 - vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP; 1125 - vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); 1126 - vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); 1127 - } 1128 - 1129 - vma->vm_private_data = obj; 1130 - 1131 1108 /* Take a ref for this mapping of the object, so that the fault 1132 1109 * handler can dereference the mmap offset's pointer to the object. 1133 1110 * This reference is cleaned up by the corresponding vm_close ··· 1112 1135 * by a vm_open due to mremap or partial unmap or whatever). 1113 1136 */ 1114 1137 drm_gem_object_get(obj); 1138 + 1139 + if (obj->funcs && obj->funcs->mmap) { 1140 + /* Remove the fake offset */ 1141 + vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node); 1142 + 1143 + ret = obj->funcs->mmap(obj, vma); 1144 + if (ret) { 1145 + drm_gem_object_put_unlocked(obj); 1146 + return ret; 1147 + } 1148 + WARN_ON(!(vma->vm_flags & VM_DONTEXPAND)); 1149 + } else { 1150 + if (obj->funcs && obj->funcs->vm_ops) 1151 + vma->vm_ops = obj->funcs->vm_ops; 1152 + else if (dev->driver->gem_vm_ops) 1153 + vma->vm_ops = dev->driver->gem_vm_ops; 1154 + else { 1155 + drm_gem_object_put_unlocked(obj); 1156 + return -EINVAL; 1157 + } 1158 + 1159 + vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP; 1160 + vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); 1161 + vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); 1162 + } 1163 + 1164 + vma->vm_private_data = obj; 1115 1165 1116 1166 return 0; 1117 1167 }
+12 -1
drivers/gpu/drm/drm_gem_ttm_helper.c
··· 64 64 struct vm_area_struct *vma) 65 65 { 66 66 struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem); 67 + int ret; 67 68 68 - return ttm_bo_mmap_obj(vma, bo); 69 + ret = ttm_bo_mmap_obj(vma, bo); 70 + if (ret < 0) 71 + return ret; 72 + 73 + /* 74 + * ttm has its own object refcounting, so drop gem reference 75 + * to avoid double accounting counting. 76 + */ 77 + drm_gem_object_put_unlocked(gem); 78 + 79 + return 0; 69 80 } 70 81 EXPORT_SYMBOL(drm_gem_ttm_mmap); 71 82