[Intel-gfx] [PATCH] drm/i915: report all active objects as busy

Daniel Vetter daniel at ffwll.ch
Wed Aug 4 20:57:26 CEST 2010


On Wed, Aug 04, 2010 at 03:36:30PM +0100, Chris Wilson wrote:
> Incorporates a similar patch by Daniel Vetter, the alteration being to
> report the current busy state after retiring.
Woot, nice idea to exactly preserve the semantics of the old
implementation.

/me bangs the head against the wall for not coming up with this myself

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc : Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  drivers/gpu/drm/i915/i915_gem.c |   40 +++++++++++++++++++++++++-------------
>  1 files changed, 26 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index f599d77..909e727 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -4163,22 +4163,34 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
>  	}
>  
>  	mutex_lock(&dev->struct_mutex);
> -	/* Update the active list for the hardware's current position.
> -	 * Otherwise this only updates on a delayed timer or when irqs are
> -	 * actually unmasked, and our working set ends up being larger than
> -	 * required.
> -	 */
> -	i915_gem_retire_requests(dev);
>  
> -	obj_priv = to_intel_bo(obj);
> -	/* Don't count being on the flushing list against the object being
> -	 * done.  Otherwise, a buffer left on the flushing list but not getting
> -	 * flushed (because nobody's flushing that domain) won't ever return
> -	 * unbusy and get reused by libdrm's bo cache.  The other expected
> -	 * consumer of this interface, OpenGL's occlusion queries, also specs
> -	 * that the objects get unbusy "eventually" without any interference.
> +	/* Count all active objects as busy, even if they are currently not used
> +	 * by the gpu. Users of this interface expect objects to eventually
> +	 * become non-busy without any further actions, therefore emit any
> +	 * necessary flushes here.
>  	 */
> -	args->busy = obj_priv->active && obj_priv->last_rendering_seqno != 0;
> +	obj_priv = to_intel_bo(obj);
> +	args->busy = obj_priv->active;
> +	if (args->busy) {
> +		/* Unconditionally flush objects, even when the gpu still uses this
> +		 * object. Userspace calling this function indicates that it wants to
> +		 * use this buffer rather sooner than later, so issuing the required
> +		 * flush earlier is beneficial.
> +		 */
> +		if (obj->write_domain) {
> +			i915_gem_flush(dev, 0, obj->write_domain);
> +			(void)i915_add_request(dev, file_priv, obj->write_domain, obj_priv->ring);
> +		}
> +
> +		/* Update the active list for the hardware's current position.
> +		 * Otherwise this only updates on a delayed timer or when irqs
> +		 * are actually unmasked, and our working set ends up being
> +		 * larger than required.
> +		 */
> +		i915_gem_retire_requests_ring(dev, obj_priv->ring);
> +
> +		args->busy = obj_priv->active;
> +	}
>  
>  	drm_gem_object_unreference(obj);
>  	mutex_unlock(&dev->struct_mutex);
> -- 
> 1.7.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48



More information about the Intel-gfx mailing list