[Intel-gfx] [PATCH 61/66] drm/i915: Use multiple VMs

Ville Syrjälä ville.syrjala at linux.intel.com
Tue Jul 2 12:58:13 CEST 2013


On Thu, Jun 27, 2013 at 04:43:40PM -0700, Ben Widawsky wrote:
> On Thu, Jun 27, 2013 at 04:31:02PM -0700, Ben Widawsky wrote:
> > This requires doing an actual switch of the page tables during the
> > context switch/execbuf.
> > 
> > Along the way, cut away as much "aliasing" ppgtt as possible
> > 
> > Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> > ---
> >  drivers/gpu/drm/i915/i915_gem.c            | 22 +++++++++++++---------
> >  drivers/gpu/drm/i915/i915_gem_context.c    | 29 +++++++++++++++++------------
> >  drivers/gpu/drm/i915/i915_gem_execbuffer.c | 27 ++++++++++++++++++++-------
> >  3 files changed, 50 insertions(+), 28 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> > index af0150e..f05d585 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -2170,7 +2170,10 @@ request_to_vm(struct drm_i915_gem_request *request)
> >  	struct drm_i915_private *dev_priv = request->ring->dev->dev_private;
> >  	struct i915_address_space *vm;
> >  
> > -	vm = &dev_priv->gtt.base;
> > +	if (request->ctx)
> > +		vm = &request->ctx->ppgtt.base;
> > +	else
> > +		vm = &dev_priv->gtt.base;
> >  
> >  	return vm;
> >  }
> > @@ -2676,10 +2679,10 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj,
> >  
> >  	if (obj->has_global_gtt_mapping && is_i915_ggtt(vm))
> >  		i915_gem_gtt_unbind_object(obj);
> > -	if (obj->has_aliasing_ppgtt_mapping) {
> > -		i915_ppgtt_unbind_object(dev_priv->gtt.aliasing_ppgtt, obj);
> > -		obj->has_aliasing_ppgtt_mapping = 0;
> > -	}
> > +
> > +	vm->clear_range(vm, i915_gem_obj_offset(obj, vm) >> PAGE_SHIFT,
> > +			obj->base.size >> PAGE_SHIFT);
> > +
> >  	i915_gem_gtt_finish_object(obj);
> >  	i915_gem_object_unpin_pages(obj);
> >  
> > @@ -3444,11 +3447,12 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
> >  				return ret;
> >  		}
> >  
> > -		if (obj->has_global_gtt_mapping)
> > +		if (!is_i915_ggtt(vm) && obj->has_global_gtt_mapping)
> >  			i915_gem_gtt_bind_object(obj, cache_level);

Are you planning to kill i915_gem_gtt_(un)bind_object? In many cases you
seem to end up writing the global GTT PTEs twice because of it. I guess
the only catch is that obj->has_gtt_mapping must be kept in sync w/
reality if you kill it.

> > -		if (obj->has_aliasing_ppgtt_mapping)
> > -			i915_ppgtt_bind_object(dev_priv->gtt.aliasing_ppgtt,
> > -					       obj, cache_level);
> > +
> > +		vm->insert_entries(vm, obj->pages,
> > +				   i915_gem_obj_offset(obj, vm) >> PAGE_SHIFT,
> > +				   cache_level);
> >  
> >  		i915_gem_obj_set_color(obj, vm, cache_level);

This cache level stuff ends up looking a bit wonky, but I guess you
didn't spend much time on it yet.

I'll just note that I don't think we can allow per address space cache
levels through this interface since that would break the case where the
client renders to the buffer, then the server/compositor sets it to
uncached and does a page flip. After this the client has to also use
uncached mappings or the server/compositor won't realize that it would
need to clflush again before page flipping.

So I think you can just eliminate the vm argument from this function and
then the function could look something like this (pardon my pseudo
code):

  ...
  if (bound_any(obj)) {
    finish_gpu
    finish_gtt
    put_fence
    ...
  }

  for_each_safe(obj->vma_list) {
    vm = vma->vm;
    node = vma->node;
    if (verify_gtt(node, cache_level)) {
      unbind(ovj, vm);
      continue;
    }
    vm->insert_range();
    vma->color = cacle_level;
  }
  ...


This also got me thinking about MOCS. That think seems a bit dangerous
in this case since the client can easily override the cache level w/o
the server/compositor noticing. I guess we just have to make a rule that
clients aren't allowed to override cache level w/ MOCS for window
system buffers.

Also IIRC someone told me that w/ uncached mappings the caches aren't
snooped even on LLC platforms. If that's true, MOCS seems even more
dangerous since the client could easily mix cached and uncached
accesses. I don't really understand why uncached mappings wouldn't
snoop on LLC platforms since the snooping should be more or less free.

-- 
Ville Syrjälä
Intel OTC



More information about the Intel-gfx mailing list