diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_request.h')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_request.h | 40 | 
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h index e4dd013761e8..96991d64759c 100644 --- a/drivers/gpu/drm/i915/i915_request.h +++ b/drivers/gpu/drm/i915/i915_request.h @@ -113,7 +113,7 @@ struct i915_request {  	struct intel_engine_cs *engine;  	struct intel_context *hw_context;  	struct intel_ring *ring; -	struct intel_timeline *timeline; +	struct intel_timeline __rcu *timeline;  	struct list_head signal_link;  	/* @@ -211,14 +211,14 @@ struct i915_request {  	 * on the active_list (of their final request).  	 */  	struct i915_capture_list *capture_list; -	struct list_head active_list;  	/** Time at which this request was emitted, in jiffies. */  	unsigned long emitted_jiffies;  	unsigned long flags; -#define I915_REQUEST_WAITBOOST BIT(0) -#define I915_REQUEST_NOPREEMPT BIT(1) +#define I915_REQUEST_WAITBOOST	BIT(0) +#define I915_REQUEST_NOPREEMPT	BIT(1) +#define I915_REQUEST_SENTINEL	BIT(2)  	/** timeline->request entry for this request */  	struct list_head link; @@ -251,6 +251,7 @@ struct i915_request *__i915_request_commit(struct i915_request *request);  void __i915_request_queue(struct i915_request *rq,  			  const struct i915_sched_attr *attr); +bool i915_request_retire(struct i915_request *rq);  void i915_request_retire_upto(struct i915_request *rq);  static inline struct i915_request * @@ -309,10 +310,8 @@ long i915_request_wait(struct i915_request *rq,  		       long timeout)  	__attribute__((nonnull(1)));  #define I915_WAIT_INTERRUPTIBLE	BIT(0) -#define I915_WAIT_LOCKED	BIT(1) /* struct_mutex held, handle GPU reset */ -#define I915_WAIT_PRIORITY	BIT(2) /* small priority bump for the request */ -#define I915_WAIT_ALL		BIT(3) /* used by i915_gem_object_wait() */ -#define I915_WAIT_FOR_IDLE_BOOST BIT(4) +#define I915_WAIT_PRIORITY	BIT(1) /* small priority bump for the request */ +#define I915_WAIT_ALL		BIT(2) /* used by i915_gem_object_wait() */  static inline bool i915_request_signaled(const struct i915_request *rq)  { @@ -442,6 +441,29 @@ static inline bool i915_request_has_nopreempt(const struct i915_request *rq)  	return unlikely(rq->flags & I915_REQUEST_NOPREEMPT);  } -bool i915_retire_requests(struct drm_i915_private *i915); +static inline bool i915_request_has_sentinel(const struct i915_request *rq) +{ +	return unlikely(rq->flags & I915_REQUEST_SENTINEL); +} + +static inline struct intel_timeline * +i915_request_timeline(struct i915_request *rq) +{ +	/* Valid only while the request is being constructed (or retired). */ +	return rcu_dereference_protected(rq->timeline, +					 lockdep_is_held(&rcu_access_pointer(rq->timeline)->mutex)); +} + +static inline struct intel_timeline * +i915_request_active_timeline(struct i915_request *rq) +{ +	/* +	 * When in use during submission, we are protected by a guarantee that +	 * the context/timeline is pinned and must remain pinned until after +	 * this submission. +	 */ +	return rcu_dereference_protected(rq->timeline, +					 lockdep_is_held(&rq->engine->active.lock)); +}  #endif /* I915_REQUEST_H */  |