[PATCH 21/48] drm/i915: Decrease priority for chained semaphores
Chris Wilson
chris at chris-wilson.co.uk
Fri Feb 1 22:19:36 UTC 2019
Try to avoid subsequent requests from boosting earlier semaphore waits.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_request.c | 2 +-
drivers/gpu/drm/i915/i915_scheduler.c | 10 +++++++++-
drivers/gpu/drm/i915/i915_scheduler.h | 3 ++-
drivers/gpu/drm/i915/intel_lrc.c | 3 ++-
4 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index dde0c104996a..1b390b20f420 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -821,7 +821,7 @@ emit_semaphore_wait(struct i915_request *to,
intel_ring_advance(to, cs);
- to->sched.semaphore = true;
+ to->sched.semaphore |= I915_SCHED_HAS_SEMAPHORE;
return 0;
}
diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c
index dee81d1e618b..e7424f6c7cf3 100644
--- a/drivers/gpu/drm/i915/i915_scheduler.c
+++ b/drivers/gpu/drm/i915/i915_scheduler.c
@@ -28,13 +28,18 @@ static inline bool node_signaled(const struct i915_sched_node *node)
return i915_request_completed(node_to_request(node));
}
+static inline bool node_started(const struct i915_sched_node *node)
+{
+ return i915_request_started(node_to_request(node));
+}
+
void i915_sched_node_init(struct i915_sched_node *node)
{
INIT_LIST_HEAD(&node->signalers_list);
INIT_LIST_HEAD(&node->waiters_list);
INIT_LIST_HEAD(&node->link);
node->attr.priority = I915_PRIORITY_INVALID;
- node->semaphore = false;
+ node->semaphore = 0;
}
static struct i915_dependency *
@@ -65,6 +70,9 @@ bool __i915_sched_node_add_dependency(struct i915_sched_node *node,
dep->signaler = signal;
dep->flags = flags;
+ if (!node_started(signal))
+ node->semaphore |= signal->semaphore << 1;
+
ret = true;
}
diff --git a/drivers/gpu/drm/i915/i915_scheduler.h b/drivers/gpu/drm/i915/i915_scheduler.h
index 5c18539a8314..4f33ebee8d7a 100644
--- a/drivers/gpu/drm/i915/i915_scheduler.h
+++ b/drivers/gpu/drm/i915/i915_scheduler.h
@@ -73,7 +73,8 @@ struct i915_sched_node {
struct list_head waiters_list; /* those after us, they depend upon us */
struct list_head link;
struct i915_sched_attr attr;
- bool semaphore;
+ unsigned long semaphore;
+#define I915_SCHED_HAS_SEMAPHORE BIT(0)
};
struct i915_dependency {
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 268f448091a6..2e4d9f087e5d 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -615,7 +615,8 @@ static bool can_merge_rq(const struct i915_request *prev,
* rules should mean that if this semaphore is preempted, its
* dependency chain is preserved and suitably promoted via PI.
*/
- if (prev->sched.semaphore && !i915_request_started(prev))
+ if (prev->sched.semaphore & I915_SCHED_HAS_SEMAPHORE &&
+ !i915_request_started(prev))
return false;
if (!can_merge_ctx(prev->hw_context, next->hw_context))
--
2.20.1
More information about the Intel-gfx-trybot
mailing list