[Intel-gfx] [PATCH 2/5] drm/i915: Fallback to using CPU relocations for large batch buffers

Chris Wilson chris at chris-wilson.co.uk
Tue Jan 27 13:43:00 PST 2015


On Tue, Jan 27, 2015 at 04:09:37PM +0100, Daniel Vetter wrote:
> On Wed, Jan 14, 2015 at 11:20:56AM +0000, Chris Wilson wrote:
> >  static int
> >  i915_gem_execbuffer_reserve_vma(struct i915_vma *vma,
> >  				struct intel_engine_cs *ring,
> > @@ -536,14 +589,21 @@ i915_gem_execbuffer_reserve_vma(struct i915_vma *vma,
> >  	int ret;
> >  
> >  	flags = 0;
> > -	if (entry->flags & __EXEC_OBJECT_NEEDS_MAP)
> > -		flags |= PIN_GLOBAL | PIN_MAPPABLE;
> > -	if (entry->flags & EXEC_OBJECT_NEEDS_GTT)
> > -		flags |= PIN_GLOBAL;
> > -	if (entry->flags & __EXEC_OBJECT_NEEDS_BIAS)
> > -		flags |= BATCH_OFFSET_BIAS | PIN_OFFSET_BIAS;
> > +	if (!drm_mm_node_allocated(&vma->node)) {
> > +		if (entry->flags & __EXEC_OBJECT_NEEDS_MAP)
> > +			flags |= PIN_GLOBAL | PIN_MAPPABLE;
> > +		if (entry->flags & EXEC_OBJECT_NEEDS_GTT)
> > +			flags |= PIN_GLOBAL;
> > +		if (entry->flags & __EXEC_OBJECT_NEEDS_BIAS)
> > +			flags |= BATCH_OFFSET_BIAS | PIN_OFFSET_BIAS;
> > +	}
> 
> Hm, aren't we always calling reserve un buffers we know we've just
> unbound? Keeping the flags computation would at least be a good selfcheck
> about the consistency of our placing decisions, so I'd like to keep it.
> 
> >  
> >  	ret = i915_gem_object_pin(obj, vma->vm, entry->alignment, flags);
> > +	if ((ret == -ENOSPC  || ret == -E2BIG) &&
> > +	    only_mappable_for_reloc(entry->flags))
> > +		ret = i915_gem_object_pin(obj, vma->vm,
> > +					  entry->alignment,
> > +					  flags & ~(PIN_GLOBAL | PIN_MAPPABLE));
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -605,13 +665,13 @@ eb_vma_misplaced(struct i915_vma *vma)
> >  	    vma->node.start & (entry->alignment - 1))
> >  		return true;
> >  
> > -	if (entry->flags & __EXEC_OBJECT_NEEDS_MAP && !obj->map_and_fenceable)
> > -		return true;
> > -
> >  	if (entry->flags & __EXEC_OBJECT_NEEDS_BIAS &&
> >  	    vma->node.start < BATCH_OFFSET_BIAS)
> >  		return true;
> >  
> > +	if (entry->flags & __EXEC_OBJECT_NEEDS_MAP && !obj->map_and_fenceable)
> > +		return !only_mappable_for_reloc(entry->flags);
> 
> Hm, this seems to contradict your commit message a bit since it'll result
> in a behavioural change of what we try to push into mappable for relocs.
> 
> Shouldn't we instead just clear the NEEDS_MAP flag in reserve_vma when the
> mappable pin fails and we fall back?

This pair of chunks is required to prevent the ping-pong you just
described, which was very slow.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list