From: Boris Brezillon <boris.brezillon@collabora.com>
To: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: dri-devel@lists.freedesktop.org,
Steven Price <steven.price@arm.com>,
Liviu Dudau <liviu.dudau@arm.com>, Chia-I Wu <olvaffe@gmail.com>,
Danilo Krummrich <dakr@kernel.org>,
Matthew Brost <matthew.brost@intel.com>,
Philipp Stanner <phasta@kernel.org>,
kernel-dev@igalia.com
Subject: Re: [RFC 2/8] drm/panthor: Use separate workqueue for DRM scheduler
Date: Thu, 9 Jul 2026 08:45:20 +0200 [thread overview]
Message-ID: <20260709084520.16d32cb7@fedora-2.home> (raw)
In-Reply-To: <bd262d12-65d0-4c59-a314-b42b540acd99@igalia.com>
On Wed, 8 Jul 2026 17:47:36 +0100
Tvrtko Ursulin <tvrtko.ursulin@igalia.com> wrote:
> On 06/07/2026 15:18, Boris Brezillon wrote:
> > On Mon, 6 Jul 2026 13:03:33 +0100
> > Tvrtko Ursulin <tvrtko.ursulin@igalia.com> wrote:
> >
> >> On 02/07/2026 16:31, Boris Brezillon wrote:
> >>> On Thu, 2 Jul 2026 15:37:39 +0100
> >>> Tvrtko Ursulin <tvrtko.ursulin@igalia.com> wrote:
> >>>
> >>>> Currently an unordered workqueue is used for the DRM scheduler which means
> >>>> its concurrency is externally managed, and given there is one scheduler
> >>>> instance per userspace queue, that means workqueue management logic is
> >>>> within its rights to spawn many kernel threads to submit their respective
> >>>> jobs.
> >>>>
> >>>> Problem there is that all run job callbacks are serialized on the device
> >>>> global mutex,
> >>>
> >>> I think we should address that instead, and either shorten the scope of
> >>> the locked section, or make it so we don't make it a contention point
> >>> for concurrent job submission from different contexts (with a rwsem
> >>> instead of a lock, for instance).
> >>>
> >>>> making the potential thread storm just causing lock
> >>>> contention.
> >>>>
> >>>> If we add a separate ordered workqueue for the DRM scheduler integration
> >>>> we can avoid this problem, since the ordered property directly expresses
> >>>> the nature of the submission backend implementation.
> >>>
> >>> Yep, except that's not how it was meant to work. The goal was to allow
> >>> contexts to submit their jobs concurrently to the FW. The only reason we
> >>> take the lock is to:
> >>>
> >>> 1. make sure the context is still allowed to take jobs
> >>> 2. kick the group scheduler if the context is not resident
> >>>
> >>> For #1, I believe we can come up with either a lockless solution, or a
> >>> solution where the lock protecting the state belongs to the group
> >>> instead of being externally protected by the device-wide scheduler lock.
> >>>
> >>> For #2, the rwsem approach, and narrowing down the locked section to
> >>> just this part of the code should do the trick.
> >>
> >> Out of curiosity how much CPU side parallelism you think is required to
> >> keep these GPUs fed? Both today (with the greater lock contention) and
> >> in the future (with the reduced contention) I guess would be interesting
> >> data points.
> >
> > The maximum is known: it's the amount of FW CSG slot we have available.
> > I think the theoretical limit is 16, but IIRC, we never had more than 8
> > exposed by the FW.
>
> Yeah but is it _really_ required to have 8 CPU threads feed these slots?
8 is indeed the number of SW slots, but there are multiple HW queues
under the hood (and multiple cores to dispatch jobs to), making it so
multiple GPU context can effectively be scheduled in parallel. This
number is lower than the number of FW slots though (I need to check if
it's exposed through some RO regs).
> GPU will still take one at a time and preemption is not that fast, no?
Preemption on the FW side is pretty simple: each slot gets a unique
prio, and lower prio slots only get HW queues and GPU resources if
higher prio ones are idle and accept to give up their resources for a
bit. We then have a 10ms tick in panthor to rotate the FW slot
priorities. So yes, preemption is not very granular, but that's not
really the problem I'm worried about. What I'm worried about is having
just one thread for everything, with the first-queued/first-served
model that the kthread_worker infrastructure provides. If we're talking
about one thread per-priority level, that's already better, and then I
agree that the contention on GPU contexts with the same priority is less
of an issue, especially since the run_job work has to run before being
rescheduled, which gives you this natural FIFO behavior, thus leaving
other contexts a chance to queue their run_job in the meantime.
But this WQ_UNBOUND -> WQ_SINGLE_THREAD transition, where the wq is
shared among the entire device is not that. It's actually serializing
work submission for all GPU contexts regardless of their priority.
TLDR; I'd be happy if we start with just one kthread per-prio + the
narrowing of the locked section in the run_job() implementation, so
that context submission actually happens concurrently, and low prio
context don't starve high-prio/RT ones in the submission path.
next prev parent reply other threads:[~2026-07-09 6:45 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-02 14:37 [RFC 0/8] DRM scheduler kthread_worker for submission latency improvements Tvrtko Ursulin
2026-07-02 14:37 ` [RFC 1/8] drm/panthor: Remove redundant drm_sched_job_cleanup() from the .free_job callback Tvrtko Ursulin
2026-07-03 15:00 ` Steven Price
2026-07-09 10:05 ` Tvrtko Ursulin
2026-07-09 10:15 ` Boris Brezillon
2026-07-02 14:37 ` [RFC 2/8] drm/panthor: Use separate workqueue for DRM scheduler Tvrtko Ursulin
2026-07-02 15:31 ` Boris Brezillon
2026-07-06 12:03 ` Tvrtko Ursulin
2026-07-06 14:18 ` Boris Brezillon
2026-07-08 16:47 ` Tvrtko Ursulin
2026-07-09 6:45 ` Boris Brezillon [this message]
2026-07-09 10:56 ` Tvrtko Ursulin
2026-07-02 14:37 ` [RFC 3/8] drm/sched: Use generic naming for workqueue helpers Tvrtko Ursulin
2026-07-02 14:37 ` [RFC 4/8] drm/xe: Convert to per gt scheduler workers Tvrtko Ursulin
2026-07-03 9:06 ` Matthew Brost
2026-07-06 12:27 ` Tvrtko Ursulin
2026-07-06 23:14 ` Matthew Brost
2026-07-08 16:35 ` Tvrtko Ursulin
2026-07-08 19:32 ` Matthew Brost
2026-07-02 14:37 ` [RFC 5/8] drm: Wrap DRM scheduler worker in own abstraction Tvrtko Ursulin
2026-07-02 14:37 ` [RFC 6/8] drm/sched: Convert the scheduler job submission to kthread_worker Tvrtko Ursulin
2026-07-02 14:37 ` [RFC 7/8] drm/sched: Add ability to change drm_sched_worker priority Tvrtko Ursulin
2026-07-02 14:37 ` [RFC 8/8] drm/sched: Notify worker of the entity submission priority Tvrtko Ursulin
2026-07-03 8:52 ` [RFC 0/8] DRM scheduler kthread_worker for submission latency improvements Philipp Stanner
2026-07-06 12:20 ` Tvrtko Ursulin
2026-07-06 19:36 ` Tejun Heo
2026-07-08 16:24 ` Tvrtko Ursulin
2026-07-09 8:28 ` Tvrtko Ursulin
2026-07-03 9:22 ` Matthew Brost
2026-07-06 12:41 ` Tvrtko Ursulin
2026-07-06 22:54 ` Matthew Brost
2026-07-07 7:12 ` Matthew Brost
2026-07-08 17:01 ` Tvrtko Ursulin
2026-07-08 20:46 ` Matthew Brost
2026-07-08 22:39 ` Matthew Brost
2026-07-09 6:52 ` Boris Brezillon
2026-07-09 7:25 ` Boris Brezillon
2026-07-09 7:55 ` Matthew Brost
2026-07-09 10:08 ` Boris Brezillon
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=20260709084520.16d32cb7@fedora-2.home \
--to=boris.brezillon@collabora.com \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=kernel-dev@igalia.com \
--cc=liviu.dudau@arm.com \
--cc=matthew.brost@intel.com \
--cc=olvaffe@gmail.com \
--cc=phasta@kernel.org \
--cc=steven.price@arm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.