- Fix ttm bo refcnt when using the new gem obj mmap hook (Thomas)
Cc: Gerd Hoffmann <kraxel@redhat.com> -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEHF6rntfJ3enn8gh8cywAJXLcr3kFAl3VppEACgkQcywAJXLc r3l4RggAyrzNUVUcJnLG/DT4R+LYh+70OkyVmQRYAGg0xYRhFuoJdxTc4XqyaKrt KOP+i2oQr1Dx3H8m0/Nt9o9W3QLAUQ7BUyxZoQnMXXQOEN2CdtCshNcyUL8FUEoL AN78w7xhuoaz5BwkjTy7USnC4FCImksaYRb4nvPBlGF3/teoeRCI8kpem+JiqGHb g3v4abzPySypR1ZMH0Yxd8Yqc97bqP0bToDswQhlgCYDWylmplR0lbHFmIa5y573 aTa2ktsUE6IZ26jdRV74I8VCpxULcLEfgrXhBehlkecS+xXlM+VD6JwJxyAeAkjM 6wgeQyZ8mMInbf+9wBUj3lkieI0lIQ== =TkfK -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
17eee668b3
|
@ -1105,29 +1105,6 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
|||
if (obj_size < vma->vm_end - vma->vm_start)
|
||||
return -EINVAL;
|
||||
|
||||
if (obj->funcs && obj->funcs->mmap) {
|
||||
/* Remove the fake offset */
|
||||
vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
|
||||
|
||||
ret = obj->funcs->mmap(obj, vma);
|
||||
if (ret)
|
||||
return ret;
|
||||
WARN_ON(!(vma->vm_flags & VM_DONTEXPAND));
|
||||
} else {
|
||||
if (obj->funcs && obj->funcs->vm_ops)
|
||||
vma->vm_ops = obj->funcs->vm_ops;
|
||||
else if (dev->driver->gem_vm_ops)
|
||||
vma->vm_ops = dev->driver->gem_vm_ops;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
|
||||
}
|
||||
|
||||
vma->vm_private_data = obj;
|
||||
|
||||
/* Take a ref for this mapping of the object, so that the fault
|
||||
* handler can dereference the mmap offset's pointer to the object.
|
||||
* This reference is cleaned up by the corresponding vm_close
|
||||
|
@ -1136,6 +1113,33 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
|||
*/
|
||||
drm_gem_object_get(obj);
|
||||
|
||||
if (obj->funcs && obj->funcs->mmap) {
|
||||
/* Remove the fake offset */
|
||||
vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
|
||||
|
||||
ret = obj->funcs->mmap(obj, vma);
|
||||
if (ret) {
|
||||
drm_gem_object_put_unlocked(obj);
|
||||
return ret;
|
||||
}
|
||||
WARN_ON(!(vma->vm_flags & VM_DONTEXPAND));
|
||||
} else {
|
||||
if (obj->funcs && obj->funcs->vm_ops)
|
||||
vma->vm_ops = obj->funcs->vm_ops;
|
||||
else if (dev->driver->gem_vm_ops)
|
||||
vma->vm_ops = dev->driver->gem_vm_ops;
|
||||
else {
|
||||
drm_gem_object_put_unlocked(obj);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
|
||||
}
|
||||
|
||||
vma->vm_private_data = obj;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_mmap_obj);
|
||||
|
|
|
@ -64,8 +64,19 @@ int drm_gem_ttm_mmap(struct drm_gem_object *gem,
|
|||
struct vm_area_struct *vma)
|
||||
{
|
||||
struct ttm_buffer_object *bo = drm_gem_ttm_of_gem(gem);
|
||||
int ret;
|
||||
|
||||
return ttm_bo_mmap_obj(vma, bo);
|
||||
ret = ttm_bo_mmap_obj(vma, bo);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* ttm has its own object refcounting, so drop gem reference
|
||||
* to avoid double accounting counting.
|
||||
*/
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_ttm_mmap);
|
||||
|
||||
|
|
Loading…
Reference in New Issue