From: "Danilo Krummrich" <dakr@kernel.org>
To: "Tvrtko Ursulin" <tvrtko.ursulin@igalia.com>
Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
kernel-dev@igalia.com,
"Christian König" <christian.koenig@amd.com>,
"Matthew Brost" <matthew.brost@intel.com>,
"Philipp Stanner" <phasta@kernel.org>,
"Pierre-Eric Pelloux-Prayer" <pierre-eric.pelloux-prayer@amd.com>
Subject: Re: [PATCH v5 09/28] drm/sched: Add fair scheduling policy
Date: Thu, 15 Jan 2026 12:44:25 +0100 [thread overview]
Message-ID: <DFP4XVVKNIRC.2O817MGMKCQ3P@kernel.org> (raw)
In-Reply-To: <1fceb644-ff22-45c8-bd83-4a32786c35f2@igalia.com>
On Thu Jan 15, 2026 at 9:28 AM CET, Tvrtko Ursulin wrote:
>
> On 14/01/2026 22:13, Danilo Krummrich wrote:
>> On Fri Dec 19, 2025 at 2:53 PM CET, Tvrtko Ursulin wrote:
>>> diff --git a/drivers/gpu/drm/scheduler/sched_rq.c b/drivers/gpu/drm/scheduler/sched_rq.c
>>> index 2d1f579d8352..2fde309d02a6 100644
>>> --- a/drivers/gpu/drm/scheduler/sched_rq.c
>>> +++ b/drivers/gpu/drm/scheduler/sched_rq.c
>>> @@ -16,6 +16,35 @@ drm_sched_entity_compare_before(struct rb_node *a, const struct rb_node *b)
>>> return ktime_before(ea->oldest_job_waiting, eb->oldest_job_waiting);
>>> }
>>>
>>> +static void drm_sched_rq_update_prio(struct drm_sched_rq *rq)
>>> +{
>>> + enum drm_sched_priority prio = DRM_SCHED_PRIORITY_INVALID;
>>> + struct rb_node *rb;
>>> +
>>> + lockdep_assert_held(&rq->lock);
>>> +
>>> + rb = rb_first_cached(&rq->rb_tree_root);
>>> + if (rb) {
>>> + struct drm_sched_entity *entity =
>>> + rb_entry(rb, typeof(*entity), rb_tree_node);
>>> +
>>> + /*
>>> + * The normal locking order is entity then run-queue so taking
>>> + * the entity lock here would be a locking inversion for the
>>> + * case when the current head of the run-queue is different from
>>> + * the one we already have locked. The unlocked read is fine
>>> + * though, because if the priority had just changed it is no big
>>> + * deal for our algorithm, but just a transient reachable only
>>> + * by drivers with userspace dynamic priority changes API. Equal
>>> + * in effect to the priority change becoming visible a few
>>> + * instructions later.
>>> + */
>>> + prio = READ_ONCE(entity->priority);
>>
>> I still think that we should address the root cause of the lock inversion
>> problem instead.
>>
>> I previously mentioned that I can take a look at this beginning of this year,
>> which I can do soon.
>>
>> In the meantime, can you please explain what's the problem with this specific
>> case? This function is only ever called from drm_sched_rq_remove_fifo_locked()
>> and drm_sched_rq_update_fifo_locked(), which already seem to hold both locks.
>
> The entity which is locked is likely not the same as entity at the head
> of the run-queue from either call chains.
>
> In one case we have just removed the locked entity from the run-queue,
> while in the other tree has been re-balanced so a different entity may
> have taken the head position.
Ick! That makes it even worse because this would mean that even if we would be
able to take the entity lock here, this is also prone to lock inversion between
entities.
I.e. that is a huge indicator that it is even more necessary to revisit locking
design in general.
> Also to note is 99% of cases entity->priority is invariant. Only amdgpu
> allows for change of priority post entity creation. So for the rest
> locking would not gain anything.
>
> Even for amdgpu the unlocked read is not very relevant, since the only
> thing this is used is to determine the run-queue insertion position of a
> re-joining entity. So worst thing that could happen, if userspace thread
> would race set priority with the job worker picking the next job, is to
> *one time* pick a different job.
I get that; it is less that dealing with the priority field by itself is a huge
issue we can't handle, it is more that the above workaround clearly points out a
(locking) design issue, which we should not ignore. It's not only about code
the code working or being correct, it's also about maintainability.
(Even though I'm aware that DRM scheduler maintainability is a bit the DRM
equivalent of the infamous 3x+1 problem. :)
> Also to address the root cause of the lock inversion would IMHO be to
> re-design the whole scheduler and this specific function here does not
> seem should be the trigger for that.
I'm not sure it is that bad, let me take a look in the next days and see what
options we have.
next prev parent reply other threads:[~2026-01-15 11:44 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-19 13:53 [PATCH v5 00/28] Fair(er) DRM scheduler Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 01/28] drm/sched: Consolidate entity run queue management Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 02/28] drm/sched: Move run queue related code into a separate file Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 03/28] drm/sched: Add some scheduling quality unit tests Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 04/28] drm/sched: Add some more " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 05/28] drm/sched: Implement RR via FIFO Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 06/28] drm/sched: Free all finished jobs at once Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 07/28] drm/sched: Account entity GPU time Tvrtko Ursulin
2026-01-14 17:48 ` Danilo Krummrich
2026-01-15 8:56 ` Tvrtko Ursulin
2026-01-15 12:06 ` Danilo Krummrich
2026-01-15 12:52 ` Tvrtko Ursulin
2026-01-15 13:18 ` Danilo Krummrich
2026-01-20 10:31 ` Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 08/28] drm/sched: Remove idle entity from tree Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 09/28] drm/sched: Add fair scheduling policy Tvrtko Ursulin
2026-01-14 22:13 ` Danilo Krummrich
2026-01-15 8:28 ` Tvrtko Ursulin
2026-01-15 11:44 ` Danilo Krummrich [this message]
2026-01-15 13:00 ` Tvrtko Ursulin
2026-01-15 23:39 ` Danilo Krummrich
2026-01-20 9:51 ` Tvrtko Ursulin
2026-03-07 1:17 ` Hillf Danton
2025-12-19 13:53 ` [PATCH v5 10/28] drm/sched: Favour interactive clients slightly Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 11/28] drm/sched: Switch default policy to fair Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 12/28] drm/sched: Remove FIFO and RR and simplify to a single run queue Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 13/28] drm/sched: Embed run queue singleton into the scheduler Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 14/28] accel/amdxdna: Remove drm_sched_init_args->num_rqs usage Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 15/28] accel/rocket: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 16/28] accel/ethosu: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 17/28] drm/amdgpu: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 18/28] drm/etnaviv: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 19/28] drm/imagination: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 20/28] drm/lima: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 21/28] drm/msm: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 22/28] drm/nouveau: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 23/28] drm/panfrost: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 24/28] drm/panthor: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 25/28] drm/sched: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 26/28] drm/v3d: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 27/28] drm/xe: " Tvrtko Ursulin
2025-12-19 13:53 ` [PATCH v5 28/28] drm/sched: Remove drm_sched_init_args->num_rqs Tvrtko Ursulin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DFP4XVVKNIRC.2O817MGMKCQ3P@kernel.org \
--to=dakr@kernel.org \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=kernel-dev@igalia.com \
--cc=matthew.brost@intel.com \
--cc=phasta@kernel.org \
--cc=pierre-eric.pelloux-prayer@amd.com \
--cc=tvrtko.ursulin@igalia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox