diff mbox

[2/8] drm/i915: Extract vm specific part of eviction

Message ID 1377906241-8463-3-git-send-email-benjamin.widawsky@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ben Widawsky Aug. 30, 2013, 11:43 p.m. UTC
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(-)

Comments

Chris Wilson Aug. 30, 2013, 11:52 p.m. UTC | #1
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
Ben Widawsky Aug. 31, 2013, 3:39 a.m. UTC | #2
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 mbox

Patch

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;
 }