Message ID | 1377906241-8463-3-git-send-email-benjamin.widawsky@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Aug 30, 2013 at 04:43:55PM -0700, Ben Widawsky wrote: > As we'll see in the next patch, being able to evict for just 1 VM is > handy. > > Signed-off-by: Ben Widawsky <ben@bwidawsk.net> > --- > drivers/gpu/drm/i915/i915_gem_evict.c | 28 ++++++++++++++++++++++------ > 1 file changed, 22 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c > index cc8974f..e9033f0 100644 > --- a/drivers/gpu/drm/i915/i915_gem_evict.c > +++ b/drivers/gpu/drm/i915/i915_gem_evict.c > @@ -155,12 +155,31 @@ found: > return ret; > } > > +static int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle) > +{ > + struct i915_vma *vma, *next; > + int ret; > + > + if (do_idle) { > + ret = i915_gpu_idle(vm->dev); > + if (ret) > + return ret; > + > + i915_gem_retire_requests(vm->dev); > + } > + > + list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) > + if (vma->obj->pin_count == 0) > + WARN_ON(i915_vma_unbind(vma)); > + > + return 0; > +} > + > int > i915_gem_evict_everything(struct drm_device *dev) > { > drm_i915_private_t *dev_priv = dev->dev_private; > struct i915_address_space *vm; > - struct i915_vma *vma, *next; > bool lists_empty = true; > int ret; > > @@ -187,11 +206,8 @@ i915_gem_evict_everything(struct drm_device *dev) > i915_gem_retire_requests(dev); > > /* Having flushed everything, unbind() should never raise an error */ > - list_for_each_entry(vm, &dev_priv->vm_list, global_link) { > - list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) > - if (vma->obj->pin_count == 0) > - WARN_ON(i915_vma_unbind(vma)); > - } > + list_for_each_entry(vm, &dev_priv->vm_list, global_link) > + WARN_ON(i915_gem_evict_vm(vm, false)); Wny not use do_idle here? -Chris
On Sat, Aug 31, 2013 at 12:52:03AM +0100, Chris Wilson wrote: > On Fri, Aug 30, 2013 at 04:43:55PM -0700, Ben Widawsky wrote: > > As we'll see in the next patch, being able to evict for just 1 VM is > > handy. > > > > Signed-off-by: Ben Widawsky <ben@bwidawsk.net> > > --- > > drivers/gpu/drm/i915/i915_gem_evict.c | 28 ++++++++++++++++++++++------ > > 1 file changed, 22 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c > > index cc8974f..e9033f0 100644 > > --- a/drivers/gpu/drm/i915/i915_gem_evict.c > > +++ b/drivers/gpu/drm/i915/i915_gem_evict.c > > @@ -155,12 +155,31 @@ found: > > return ret; > > } > > > > +static int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle) > > +{ > > + struct i915_vma *vma, *next; > > + int ret; > > + > > + if (do_idle) { > > + ret = i915_gpu_idle(vm->dev); > > + if (ret) > > + return ret; > > + > > + i915_gem_retire_requests(vm->dev); > > + } > > + > > + list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) > > + if (vma->obj->pin_count == 0) > > + WARN_ON(i915_vma_unbind(vma)); > > + > > + return 0; > > +} > > + > > int > > i915_gem_evict_everything(struct drm_device *dev) > > { > > drm_i915_private_t *dev_priv = dev->dev_private; > > struct i915_address_space *vm; > > - struct i915_vma *vma, *next; > > bool lists_empty = true; > > int ret; > > > > @@ -187,11 +206,8 @@ i915_gem_evict_everything(struct drm_device *dev) > > i915_gem_retire_requests(dev); > > > > /* Having flushed everything, unbind() should never raise an error */ > > - list_for_each_entry(vm, &dev_priv->vm_list, global_link) { > > - list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) > > - if (vma->obj->pin_count == 0) > > - WARN_ON(i915_vma_unbind(vma)); > > - } > > + list_for_each_entry(vm, &dev_priv->vm_list, global_link) > > + WARN_ON(i915_gem_evict_vm(vm, false)); > > Wny not use do_idle here? > -Chris > The point of the extraction was to exactly avoid repeated call to idle + retire, although in looking back at it, I suppose the cost wouldn't be much since the first idle would make subsequent calls to idle + retire just about free). Just dropping the do_idle parameter, and always idling is what you probably want.
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index cc8974f..e9033f0 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -155,12 +155,31 @@ found: return ret; } +static int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle) +{ + struct i915_vma *vma, *next; + int ret; + + if (do_idle) { + ret = i915_gpu_idle(vm->dev); + if (ret) + return ret; + + i915_gem_retire_requests(vm->dev); + } + + list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) + if (vma->obj->pin_count == 0) + WARN_ON(i915_vma_unbind(vma)); + + return 0; +} + int i915_gem_evict_everything(struct drm_device *dev) { drm_i915_private_t *dev_priv = dev->dev_private; struct i915_address_space *vm; - struct i915_vma *vma, *next; bool lists_empty = true; int ret; @@ -187,11 +206,8 @@ i915_gem_evict_everything(struct drm_device *dev) i915_gem_retire_requests(dev); /* Having flushed everything, unbind() should never raise an error */ - list_for_each_entry(vm, &dev_priv->vm_list, global_link) { - list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) - if (vma->obj->pin_count == 0) - WARN_ON(i915_vma_unbind(vma)); - } + list_for_each_entry(vm, &dev_priv->vm_list, global_link) + WARN_ON(i915_gem_evict_vm(vm, false)); return 0; }
As we'll see in the next patch, being able to evict for just 1 VM is handy. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> --- drivers/gpu/drm/i915/i915_gem_evict.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-)