[Intel-gfx] [PATCH 20/22] drm/i915: Move i915_gem_object_wait_rendering()

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Thu Jul 28 09:37:16 UTC 2016


On ke, 2016-07-27 at 12:14 +0100, Chris Wilson wrote:
> Just move it earlier so that we can use the companion nonblocking
> version in a couple of more callsites without having to add a forward
> declaration.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>


Separate code motion patch, wow.

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

> ---
>  drivers/gpu/drm/i915/i915_gem.c | 202 ++++++++++++++++++++--------------------
>  1 file changed, 101 insertions(+), 101 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index ca9741525bf4..54d8a3863d11 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -301,6 +301,107 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj)
>  	return ret;
>  }
>  
> +/**
> + * Ensures that all rendering to the object has completed and the object is
> + * safe to unbind from the GTT or access from the CPU.
> + */
> +int
> +i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
> +			       bool readonly)
> +{
> +	struct reservation_object *resv;
> +	struct i915_gem_active *active;
> +	unsigned long active_mask;
> +	int idx;
> +
> +	lockdep_assert_held(&obj->base.dev->struct_mutex);
> +
> +	if (!readonly) {
> +		active = obj->last_read;
> +		active_mask = i915_gem_object_is_active(obj);
> +	} else {
> +		active_mask = 1;
> +		active = &obj->last_write;
> +	}
> +
> +	for_each_active(active_mask, idx) {
> +		int ret;
> +
> +		ret = i915_gem_active_wait(&active[idx],
> +					   &obj->base.dev->struct_mutex);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	resv = i915_gem_object_get_dmabuf_resv(obj);
> +	if (resv) {
> +		long err;
> +
> +		err = reservation_object_wait_timeout_rcu(resv, !readonly, true,
> +							  MAX_SCHEDULE_TIMEOUT);
> +		if (err < 0)
> +			return err;
> +	}
> +
> +	return 0;
> +}
> +
> +/* A nonblocking variant of the above wait. This is a highly dangerous routine
> + * as the object state may change during this call.
> + */
> +static __must_check int
> +i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
> +					    struct intel_rps_client *rps,
> +					    bool readonly)
> +{
> +	struct drm_device *dev = obj->base.dev;
> +	struct drm_i915_gem_request *requests[I915_NUM_ENGINES];
> +	struct i915_gem_active *active;
> +	unsigned long active_mask;
> +	int ret, i, n = 0;
> +
> +	lockdep_assert_held(&dev->struct_mutex);
> +	GEM_BUG_ON(!to_i915(dev)->mm.interruptible);
> +
> +	active_mask = i915_gem_object_is_active(obj);
> +	if (!active_mask)
> +		return 0;
> +
> +	if (!readonly) {
> +		active = obj->last_read;
> +	} else {
> +		active_mask = 1;
> +		active = &obj->last_write;
> +	}
> +
> +	for_each_active(active_mask, i) {
> +		struct drm_i915_gem_request *req;
> +
> +		req = i915_gem_active_get(&active[i],
> +					  &obj->base.dev->struct_mutex);
> +		if (req)
> +			requests[n++] = req;
> +	}
> +
> +	mutex_unlock(&dev->struct_mutex);
> +	ret = 0;
> +	for (i = 0; ret == 0 && i < n; i++)
> +		ret = i915_wait_request(requests[i], true, NULL, rps);
> +	mutex_lock(&dev->struct_mutex);
> +
> +	for (i = 0; i < n; i++)
> +		i915_gem_request_put(requests[i]);
> +
> +	return ret;
> +}
> +
> +static struct intel_rps_client *to_rps_client(struct drm_file *file)
> +{
> +	struct drm_i915_file_private *fpriv = file->driver_priv;
> +
> +	return &fpriv->rps;
> +}
> +
>  int
>  i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
>  			    int align)
> @@ -1335,107 +1436,6 @@ put_rpm:
>  	return ret;
>  }
>  
> -/**
> - * Ensures that all rendering to the object has completed and the object is
> - * safe to unbind from the GTT or access from the CPU.
> - * @obj: i915 gem object
> - * @readonly: waiting for read access or write
> - */
> -int
> -i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
> -			       bool readonly)
> -{
> -	struct reservation_object *resv;
> -	struct i915_gem_active *active;
> -	unsigned long active_mask;
> -	int idx, ret;
> -
> -	lockdep_assert_held(&obj->base.dev->struct_mutex);
> -
> -	if (!readonly) {
> -		active = obj->last_read;
> -		active_mask = i915_gem_object_is_active(obj);
> -	} else {
> -		active_mask = 1;
> -		active = &obj->last_write;
> -	}
> -
> -	for_each_active(active_mask, idx) {
> -		ret = i915_gem_active_wait(&active[idx],
> -					   &obj->base.dev->struct_mutex);
> -		if (ret)
> -			return ret;
> -	}
> -
> -	resv = i915_gem_object_get_dmabuf_resv(obj);
> -	if (resv) {
> -		long err;
> -
> -		err = reservation_object_wait_timeout_rcu(resv, !readonly, true,
> -							  MAX_SCHEDULE_TIMEOUT);
> -		if (err < 0)
> -			return err;
> -	}
> -
> -	return 0;
> -}
> -
> -/* A nonblocking variant of the above wait. This is a highly dangerous routine
> - * as the object state may change during this call.
> - */
> -static __must_check int
> -i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
> -					    struct intel_rps_client *rps,
> -					    bool readonly)
> -{
> -	struct drm_device *dev = obj->base.dev;
> -	struct drm_i915_private *dev_priv = to_i915(dev);
> -	struct drm_i915_gem_request *requests[I915_NUM_ENGINES];
> -	struct i915_gem_active *active;
> -	unsigned long active_mask;
> -	int ret, i, n = 0;
> -
> -	BUG_ON(!mutex_is_locked(&dev->struct_mutex));
> -	BUG_ON(!dev_priv->mm.interruptible);
> -
> -	active_mask = i915_gem_object_is_active(obj);
> -	if (!active_mask)
> -		return 0;
> -
> -	if (!readonly) {
> -		active = obj->last_read;
> -	} else {
> -		active_mask = 1;
> -		active = &obj->last_write;
> -	}
> -
> -	for_each_active(active_mask, i) {
> -		struct drm_i915_gem_request *req;
> -
> -		req = i915_gem_active_get(&active[i],
> -					  &obj->base.dev->struct_mutex);
> -		if (req)
> -			requests[n++] = req;
> -	}
> -
> -	mutex_unlock(&dev->struct_mutex);
> -	ret = 0;
> -	for (i = 0; ret == 0 && i < n; i++)
> -		ret = i915_wait_request(requests[i], true, NULL, rps);
> -	mutex_lock(&dev->struct_mutex);
> -
> -	for (i = 0; i < n; i++)
> -		i915_gem_request_put(requests[i]);
> -
> -	return ret;
> -}
> -
> -static struct intel_rps_client *to_rps_client(struct drm_file *file)
> -{
> -	struct drm_i915_file_private *fpriv = file->driver_priv;
> -	return &fpriv->rps;
> -}
> -
>  static enum fb_op_origin
>  write_origin(struct drm_i915_gem_object *obj, unsigned domain)
>  {
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list