[Intel-gfx] [bug report] drm/i915: Allow compaction upto SWIOTLB max segment size

Chris Wilson chris at chris-wilson.co.uk
Mon Nov 14 11:23:59 UTC 2016


On Mon, Nov 14, 2016 at 02:14:56PM +0300, Dan Carpenter wrote:
> Hello Chris Wilson,
> 
> The patch 871dfbd67d4e: "drm/i915: Allow compaction upto SWIOTLB max
> segment size" from Oct 11, 2016, leads to the following static
> checker warning:
> 
> 	drivers/gpu/drm/i915/i915_gem.c:2357 i915_gem_object_get_pages_gtt()
> 	error: we previously assumed 'sg' could be null (see line 2341)
> 
> drivers/gpu/drm/i915/i915_gem.c
>   2339                  /* Check that the i965g/gm workaround works. */
>   2340                  WARN_ON((gfp & __GFP_DMA32) && (last_pfn >= 0x00100000UL));
>   2341          }
>   2342          if (sg) /* loop terminated early; short sg table */
> 
> We added a new check for NULL.
> 
>   2343                  sg_mark_end(sg);
>   2344  
>   2345          /* Trim unused sg entries to avoid wasting memory. */
>   2346          i915_sg_trim(st);
>   2347  
>   2348          ret = i915_gem_gtt_prepare_pages(obj, st);
>   2349          if (ret)
>   2350                  goto err_pages;
> 
> but we hit this goto
> 
>   2351  
>   2352          if (i915_gem_object_needs_bit17_swizzle(obj))
>   2353                  i915_gem_object_do_bit_17_swizzle(obj, st);
>   2354  
>   2355          return st;
>   2356  
>   2357  err_pages:
>   2358          sg_mark_end(sg);
> 
> Then don't check here.  Also do we really need to sg_mark_end() twice?

We need the mark_end when escaping from the loop, but after the loop, sg
may be NULL.

Archaelogy, suggests commit e227330223a7 ("drm/i915: avoid leaking DMA
mappings") as the original culprit (i.e. the introduction of goto
err_pages after the loop).
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list