mirror of https://gitee.com/openkylin/linux.git
drm/i915: Avoid allocating a vmap arena for a single page
If we want a contiguous mapping of a single page sized object, we can forgo using vmap() and just use a regular kmap(). Note that this is only suitable if the desired pgprot_t is compatible. v2: Use is_vmalloc_addr() Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> Cc: Dave Gordon <david.s.gordon@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1460113874-17366-7-git-send-email-chris@chris-wilson.co.uk Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
This commit is contained in:
parent
f2a85e1975
commit
fb8621d3be
|
@ -2233,7 +2233,10 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
|
|||
list_del(&obj->global_list);
|
||||
|
||||
if (obj->mapping) {
|
||||
vunmap(obj->mapping);
|
||||
if (is_vmalloc_addr(obj->mapping))
|
||||
vunmap(obj->mapping);
|
||||
else
|
||||
kunmap(kmap_to_page(obj->mapping));
|
||||
obj->mapping = NULL;
|
||||
}
|
||||
|
||||
|
@ -2418,13 +2421,19 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj)
|
|||
i915_gem_object_pin_pages(obj);
|
||||
|
||||
if (obj->mapping == NULL) {
|
||||
struct sg_page_iter sg_iter;
|
||||
struct page **pages;
|
||||
int n;
|
||||
|
||||
n = obj->base.size >> PAGE_SHIFT;
|
||||
pages = drm_malloc_gfp(n, sizeof(*pages), GFP_TEMPORARY);
|
||||
pages = NULL;
|
||||
if (obj->base.size == PAGE_SIZE)
|
||||
obj->mapping = kmap(sg_page(obj->pages->sgl));
|
||||
else
|
||||
pages = drm_malloc_gfp(obj->base.size >> PAGE_SHIFT,
|
||||
sizeof(*pages),
|
||||
GFP_TEMPORARY);
|
||||
if (pages != NULL) {
|
||||
struct sg_page_iter sg_iter;
|
||||
int n;
|
||||
|
||||
n = 0;
|
||||
for_each_sg_page(obj->pages->sgl, &sg_iter,
|
||||
obj->pages->nents, 0)
|
||||
|
|
Loading…
Reference in New Issue