aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-04-08 07:11:14 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-04-11 12:13:36 -0400
commitfb8621d3bee88badeb25dccce0fb59ad145dba9e (patch)
tree1d9d36caed31d6b5644330137515f227cc53ac14 /drivers/gpu/drm/i915/i915_gem.c
parentf2a85e1975d80d1b535b4c21517ed15226b96c87 (diff)
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>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index eaf906875cd8..f1455faecbd2 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2233,7 +2233,10 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
2233 list_del(&obj->global_list); 2233 list_del(&obj->global_list);
2234 2234
2235 if (obj->mapping) { 2235 if (obj->mapping) {
2236 vunmap(obj->mapping); 2236 if (is_vmalloc_addr(obj->mapping))
2237 vunmap(obj->mapping);
2238 else
2239 kunmap(kmap_to_page(obj->mapping));
2237 obj->mapping = NULL; 2240 obj->mapping = NULL;
2238 } 2241 }
2239 2242
@@ -2418,13 +2421,19 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj)
2418 i915_gem_object_pin_pages(obj); 2421 i915_gem_object_pin_pages(obj);
2419 2422
2420 if (obj->mapping == NULL) { 2423 if (obj->mapping == NULL) {
2421 struct sg_page_iter sg_iter;
2422 struct page **pages; 2424 struct page **pages;
2423 int n;
2424 2425
2425 n = obj->base.size >> PAGE_SHIFT; 2426 pages = NULL;
2426 pages = drm_malloc_gfp(n, sizeof(*pages), GFP_TEMPORARY); 2427 if (obj->base.size == PAGE_SIZE)
2428 obj->mapping = kmap(sg_page(obj->pages->sgl));
2429 else
2430 pages = drm_malloc_gfp(obj->base.size >> PAGE_SHIFT,
2431 sizeof(*pages),
2432 GFP_TEMPORARY);
2427 if (pages != NULL) { 2433 if (pages != NULL) {
2434 struct sg_page_iter sg_iter;
2435 int n;
2436
2428 n = 0; 2437 n = 0;
2429 for_each_sg_page(obj->pages->sgl, &sg_iter, 2438 for_each_sg_page(obj->pages->sgl, &sg_iter,
2430 obj->pages->nents, 0) 2439 obj->pages->nents, 0)