[Intel-gfx] [PATCH 40/55] drm/i915: Refactor blocking waits

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Wed Jul 27 06:04:03 UTC 2016


On ma, 2016-07-25 at 18:32 +0100, Chris Wilson wrote:
> Tidy up the for loops that handle waiting for read/write vs read-only
> access.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_gem.c | 158 +++++++++++++++++++---------------------
>  1 file changed, 75 insertions(+), 83 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 3f6b69dcaccb..2d86a0c3f295 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1339,6 +1339,23 @@ put_rpm:
>  	return ret;
>  }
>  
> +static void
> +i915_gem_object_retire_request(struct drm_i915_gem_object *obj,
> +			       struct drm_i915_gem_request *req)
> +{
> +	int idx = req->engine->id;
> +
> +	if (i915_gem_active_peek(&obj->last_read[idx],
> +				 &obj->base.dev->struct_mutex) == req)
> +		i915_gem_object_retire__read(obj, idx);
> +	else if (i915_gem_active_peek(&obj->last_write,
> +				      &obj->base.dev->struct_mutex) == req)
> +		i915_gem_object_retire__write(obj);

If these functions will use same mutex (be it different than
struct_mutex) in all invocations, I'd make an alias for it.

> +
> +	if (!i915_reset_in_progress(&req->i915->gpu_error))
> +		i915_gem_request_retire_upto(req);
> +}
> +
>  /**
>   * Ensures that all rendering to the object has completed and the object is
>   * safe to unbind from the GTT or access from the CPU.
> @@ -1349,39 +1366,34 @@ int
>  i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
>  			       bool readonly)
>  {
> -	struct drm_i915_gem_request *request;
>  	struct reservation_object *resv;
> -	int ret, i;
> +	struct i915_gem_active *active;
> +	unsigned long active_mask;
> +	int idx, ret;
>  

We could do early exit here based on the active_mask, like with the
nonblocking version.

> -	if (readonly) {
> -		request = i915_gem_active_peek(&obj->last_write,
> -					       &obj->base.dev->struct_mutex);
> -		if (request) {
> -			ret = i915_wait_request(request);
> -			if (ret)
> -				return ret;
> +	lockdep_assert_held(&obj->base.dev->struct_mutex);
>  
> -			i = request->engine->id;
> -			if (i915_gem_active_peek(&obj->last_read[i],
> -						 &obj->base.dev->struct_mutex) == request)
> -				i915_gem_object_retire__read(obj, i);
> -			else
> -				i915_gem_object_retire__write(obj);
> -		}
> +	if (!readonly) {

Not sure why not just swap and keep this if (readonly)...

> +		active = obj->last_read;
> +		active_mask = obj->active;
>  	} else {
> -		for (i = 0; i < I915_NUM_ENGINES; i++) {
> -			request = i915_gem_active_peek(&obj->last_read[i],
> -						       &obj->base.dev->struct_mutex);
> -			if (!request)
> -				continue;
> +		active_mask = 1;

Wouldn't we have RENDER_RING define for this and other instances?

With above addressed,

Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

Regards, Joonas
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list