[Intel-gfx] [PATCH v5 4/7] drm/i915: optimise i915_gem_object_vmap_range() for small objects
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Feb 29 12:01:34 UTC 2016
On 29/02/16 11:13, Dave Gordon wrote:
> 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 at intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Alex Dai <yu.dai at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 17 +++++++++++------
> 1 file changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index c621b3e..c126211 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2417,7 +2417,8 @@ void *i915_gem_object_vmap_range(struct drm_i915_gem_object *obj,
> unsigned int npages)
> {
> struct sg_page_iter sg_iter;
> - struct page **pages;
> + struct page *stack_pages[32];
> + struct page **pages = stack_pages;
> void *addr;
> int i;
>
> @@ -2426,10 +2427,13 @@ void *i915_gem_object_vmap_range(struct drm_i915_gem_object *obj,
> return NULL;
> }
>
> - pages = drm_malloc_gfp(npages, sizeof(*pages), GFP_TEMPORARY);
> - if (pages == NULL) {
> - DRM_DEBUG_DRIVER("Failed to get space for pages\n");
> - return NULL;
> + if (npages > ARRAY_SIZE(stack_pages)) {
> + /* Too big for stack -- allocate temporary array instead */
> + pages = drm_malloc_gfp(npages, sizeof(*pages), GFP_TEMPORARY);
> + if (pages == NULL) {
> + DRM_DEBUG_DRIVER("Failed to get space for pages\n");
> + return NULL;
> + }
> }
>
> i = 0;
> @@ -2442,7 +2446,8 @@ void *i915_gem_object_vmap_range(struct drm_i915_gem_object *obj,
> addr = vmap(pages, npages, 0, PAGE_KERNEL);
> if (addr == NULL)
> DRM_DEBUG_DRIVER("Failed to vmap pages\n");
> - drm_free_large(pages);
> + if (pages != stack_pages)
> + drm_free_large(pages);
>
> return addr;
> }
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list