[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