diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-04-08 07:11:14 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-04-11 12:13:36 -0400 |
commit | fb8621d3bee88badeb25dccce0fb59ad145dba9e (patch) | |
tree | 1d9d36caed31d6b5644330137515f227cc53ac14 /drivers/gpu/drm/i915/i915_gem.c | |
parent | f2a85e1975d80d1b535b4c21517ed15226b96c87 (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.c | 19 |
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) |