[PATCH 65/65] rq-rcu

Chris Wilson chris at chris-wilson.co.uk
Tue Dec 22 23:52:17 UTC 2020


---
 drivers/gpu/drm/i915/i915_request.c |  8 ++++----
 drivers/gpu/drm/i915/i915_request.h | 14 +++++++++++---
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index 7179efc58640..e078ee1969ae 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -276,7 +276,7 @@ static void remove_from_engine(struct i915_request *rq)
 
 bool i915_request_retire(struct i915_request *rq)
 {
-	if (!__i915_request_is_complete(rq))
+	if (!__i915_request_is_complete_protected(rq))
 		return false;
 
 	RQ_TRACE(rq, "\n");
@@ -342,7 +342,7 @@ void i915_request_retire_upto(struct i915_request *rq)
 	struct i915_request *tmp;
 
 	RQ_TRACE(rq, "\n");
-	GEM_BUG_ON(!__i915_request_is_complete(rq));
+	GEM_BUG_ON(!__i915_request_is_complete_protected(rq));
 
 	do {
 		tmp = list_first_entry(&tl->requests, typeof(*tmp), link);
@@ -857,7 +857,7 @@ __i915_request_create(struct intel_context *ce, gfp_t gfp)
 	RCU_INIT_POINTER(rq->timeline, tl);
 	RCU_INIT_POINTER(rq->hwsp_cacheline, tl->hwsp_cacheline);
 	rq->hwsp_seqno = tl->hwsp_seqno;
-	GEM_BUG_ON(__i915_request_is_complete(rq));
+	GEM_BUG_ON(__i915_request_is_complete_protected(rq));
 
 	rq->rcustate = get_state_synchronize_rcu(); /* acts as smp_mb() */
 
@@ -1520,7 +1520,7 @@ __i915_request_add_to_timeline(struct i915_request *rq)
 	 */
 	prev = to_request(__i915_active_fence_set(&timeline->last_request,
 						  &rq->fence));
-	if (prev && !__i915_request_is_complete(prev)) {
+	if (prev && !__i915_request_is_complete_protected(prev)) {
 		/*
 		 * The requests are supposed to be kept in order. However,
 		 * we need to be wary in case the timeline->last_request
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h
index 560a0ef0c80d..32935696b19c 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -235,7 +235,7 @@ struct i915_request {
 	 * the HW status page (or our timeline's local equivalent). The full
 	 * path would be rq->hw_context->ring->timeline->hwsp_seqno.
 	 */
-	const u32 *hwsp_seqno;
+	const u32 __rcu *hwsp_seqno;
 
 	/*
 	 * If we need to access the timeline's seqno for this request in
@@ -410,9 +410,12 @@ static inline bool i915_seqno_passed(u32 seq1, u32 seq2)
 
 static inline u32 __hwsp_seqno(const struct i915_request *rq)
 {
-	const u32 *hwsp = READ_ONCE(rq->hwsp_seqno);
+	return READ_ONCE(*rcu_dereference(rq->hwsp_seqno));
+}
 
-	return READ_ONCE(*hwsp);
+static inline u32 __hwsp_seqno_protected(const struct i915_request *rq)
+{
+	return READ_ONCE(*rcu_dereference_protected(rq->hwsp_seqno, true));
 }
 
 /**
@@ -535,6 +538,11 @@ static inline bool __i915_request_is_complete(const struct i915_request *rq)
 	return i915_seqno_passed(__hwsp_seqno(rq), rq->fence.seqno);
 }
 
+static inline bool __i915_request_is_complete_protected(const struct i915_request *rq)
+{
+	return i915_seqno_passed(__hwsp_seqno_protected(rq), rq->fence.seqno);
+}
+
 static inline bool i915_request_completed(const struct i915_request *rq)
 {
 	bool result;
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list