[Intel-gfx] [PATCH 6/6] drm/i915: Avoid allocating a vmap arena for a single page

Chris Wilson chris at chris-wilson.co.uk
Wed Apr 6 10:05:29 UTC 2016


On Wed, Apr 06, 2016 at 10:49:36AM +0100, Tvrtko Ursulin wrote:
> >diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> >index 985f067c1f0e..dc8e1b76c896 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)
> >  	list_del(&obj->global_list);
> >
> >  	if (obj->vmapping) {
> >-		vunmap(obj->vmapping);
> >+		if (obj->base.size == PAGE_SIZE)
> >+			kunmap(kmap_to_page(obj->vmapping));
> >+		else
> >+			vunmap(obj->vmapping);
> 
> Can't think of a reason why it would be better but there is also
> is_vmalloc_addr(addr) as used by kvfree.

For consistency with the shrinker (see below).

> >  		obj->vmapping = NULL;
> >  	}
> >
> >@@ -2416,15 +2419,22 @@ void *i915_gem_object_pin_vmap(struct drm_i915_gem_object *obj)
> >  	i915_gem_object_pin_pages(obj);
> >
> >  	if (obj->vmapping == 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->vmapping = 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)
> >+			for_each_sg_page(obj->pages->sgl, &sg_iter,
> >+					 obj->pages->nents, 0)
> >  				pages[n++] = sg_page_iter_page(&sg_iter);
> >
> >  			obj->vmapping = vmap(pages, n, 0, PAGE_KERNEL);
> >
> 
> Two problems I can spot are:
> 
> 1. Callers of pin_vmap now don't know which kind of address they are
> getting. Maybe call it pin_kvmap or something? Just mention in
> kerneldoc could be enough.

I think just mention, and we can rename this to i915_gem_object_pin_map().
Hmm. I liked the pin in the name since it ties to to pin_pages (later
I plan to change that to get_pages and get_vmap/get_map as the pin
becomes implicit).

> 2. Shrinker will try to kick out kmapped objects because they have
> obj->vmapping set.

Not caring that much since the vmap_purge is very heavy weight, but we
can apply is_vmalloc_addr() to the shrinker.

Ok, happy to call this obj->mapping and i915_gem_object_pin_map() ?
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list