Skip to content

Commit

Permalink
drm/i915: optimise i915_gem_object_map() for small objects
Browse files Browse the repository at this point in the history
We're using this function for ringbuffers and other "small" objects, so
it's worth avoiding an extra malloc()/free() cycle if the page array is
small enough to put on the stack. Here we've chosen an arbitrary cutoff
of 32 (4k) pages, which is big enough for a ringbuffer (4 pages) or a
context image (currently up to 22 pages).

v5:
    change name of local array [Chris Wilson]

Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1463741647-15666-3-git-send-email-chris@chris-wilson.co.uk
  • Loading branch information
Dave Gordon authored and Chris Wilson committed May 20, 2016
1 parent dd6034c commit b338fa4
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2404,17 +2404,21 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj)
unsigned long n_pages = obj->base.size >> PAGE_SHIFT;
struct sg_table *sgt = obj->pages;
struct sg_page_iter sg_iter;
struct page **pages;
struct page *stack_pages[32];
struct page **pages = stack_pages;
unsigned long i = 0;
void *addr;

/* A single page can always be kmapped */
if (n_pages == 1)
return kmap(sg_page(sgt->sgl));

pages = drm_malloc_gfp(n_pages, sizeof(*pages), GFP_TEMPORARY);
if (!pages)
return NULL;
if (n_pages > ARRAY_SIZE(stack_pages)) {
/* Too big for stack -- allocate temporary array instead */
pages = drm_malloc_gfp(n_pages, sizeof(*pages), GFP_TEMPORARY);
if (!pages)
return NULL;
}

for_each_sg_page(sgt->sgl, &sg_iter, sgt->nents, 0)
pages[i++] = sg_page_iter_page(&sg_iter);
Expand All @@ -2424,7 +2428,8 @@ static void *i915_gem_object_map(const struct drm_i915_gem_object *obj)

addr = vmap(pages, n_pages, 0, PAGE_KERNEL);

drm_free_large(pages);
if (pages != stack_pages)
drm_free_large(pages);

return addr;
}
Expand Down

0 comments on commit b338fa4

Please sign in to comment.