diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2018-11-08 07:10:43 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-11-08 07:10:45 -0800 |
commit | 8348f04016aa52adbfd7955036a85803db781ce9 (patch) | |
tree | c05533382d2c0fbb087ea0a9885890b109fcdec2 | |
parent | f49d94fc9bf014c48227222ea54096d180ca1f75 (diff) | |
parent | 42564fd9b535ab1bdbac1303556c1c71ada0dffc (diff) |
Merge "drm/msm: avoid memory allocation when sg table is imported" into kernel.lnx.4.9.r18-relLA.UM.6.8.r3-02600-SDM710.0
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index d9aad883dda3..f216c15f7933 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -80,6 +80,9 @@ static struct page **get_pages(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj = to_msm_bo(obj); + if (obj->import_attach) + return msm_obj->pages; + if (!msm_obj->pages) { struct drm_device *dev = obj->dev; struct page **p; @@ -567,8 +570,13 @@ void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj) struct page **pages = get_pages(obj); if (IS_ERR(pages)) return ERR_CAST(pages); - msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, + if (obj->import_attach) + msm_obj->vaddr = dma_buf_vmap( + obj->import_attach->dmabuf); + else + msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, VM_MAP, pgprot_writecombine(PAGE_KERNEL)); + if (msm_obj->vaddr == NULL) return ERR_PTR(-ENOMEM); } @@ -654,7 +662,11 @@ void msm_gem_vunmap(struct drm_gem_object *obj) if (!msm_obj->vaddr || WARN_ON(!is_vunmapable(msm_obj))) return; - vunmap(msm_obj->vaddr); + if (obj->import_attach) + dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr); + else + vunmap(msm_obj->vaddr); + msm_obj->vaddr = NULL; } @@ -1006,7 +1018,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, struct msm_gem_object *msm_obj; struct drm_gem_object *obj = NULL; uint32_t size; - int ret, npages; + int ret; /* if we don't have IOMMU, don't bother pretending we can import: */ if (!iommu_present(&platform_bus_type)) { @@ -1027,19 +1039,9 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev, drm_gem_private_object_init(dev, obj, size); - npages = size / PAGE_SIZE; - msm_obj = to_msm_bo(obj); msm_obj->sgt = sgt; - msm_obj->pages = drm_malloc_ab(npages, sizeof(struct page *)); - if (!msm_obj->pages) { - ret = -ENOMEM; - goto fail; - } - - ret = drm_prime_sg_to_page_addr_arrays(sgt, msm_obj->pages, NULL, npages); - if (ret) - goto fail; + msm_obj->pages = NULL; return obj; |