[PATCH 1/3] drm/sched: add drm_sched_prealloc_dependency_slots v3

Philipp Stanner phasta at mailbox.org
Mon May 19 09:04:27 UTC 2025


On Mon, 2025-05-19 at 09:51 +0100, Tvrtko Ursulin wrote:
> 
> On 16/05/2025 18:16, Philipp Stanner wrote:
> > On Fri, 2025-05-16 at 15:30 +0100, Tvrtko Ursulin wrote:
> > > 
> > > On 16/05/2025 14:38, Philipp Stanner wrote:
> > > > On Fri, 2025-05-16 at 13:10 +0100, Tvrtko Ursulin wrote:
> > > > > 
> > > > > On 16/05/2025 12:53, Tvrtko Ursulin wrote:
> > > > > > 
> > > > > > 

[snip]

> > > > > > > > > +
> > > > > > > > > +/**
> > > > > > > > > + * drm_sched_job_add_prealloc_dep - add dependency
> > > > > > > > > to
> > > > > > > > > preallocated
> > > > > > > > > slot
> > > > > > > > > + * @job: scheduler job where dependencies will be
> > > > > > > > > added
> > > > > > > > > + * @id: the preallocated slot index
> > > > > > > > > + * @fence: the dependency to add
> > > > > > > > > + *
> > > > > > > > > + * Consumes @fence and adds it to the preallocated
> > > > > > > > > slot
> > > > > > > > > dependency.
> > > > > > > > > + */
> > > > > > > > > +void drm_sched_job_add_prealloc_dep(struct
> > > > > > > > > drm_sched_job
> > > > > > > > > *job, u32
> > > > > > > > > id,
> > > > > > > > > +                    struct dma_fence *fence)
> > > > > > > > > +{
> > > > > > > > > +    fence = xa_store(&job->dependencies, id, fence,
> > > > > > > > > GFP_ATOMIC);
> > > > > > > > 
> > > > > > > > Add assert that the passed id exists (was preallocated)
> > > > > > > > and
> > > > > > > > is
> > > > > > > > NULL?
> > > > > > > 
> > > > > > > You
> > > > > > 
> > > > > > Hm?
> > > > > > 
> > > > > > > > 
> > > > > > > > Also, if someone preallocates and does not consume the
> > > > > > > > slot
> > > > > > > > will that
> > > > > > > > confuse the iteration in drm_sched_job_dependency()?
> > > > > > > 
> > > > > > > drm_sched_job_add_dependency() you mean.
> > > > > > 
> > > > > > I was actually thinking of drm_sched_job_dependency()
> > > > > > because
> > > > > > that
> > > > > > looked it would skip dependencies upon encountering an
> > > > > > unconsumed
> > > > > > preallocated slot, but yes, drm_sched_job_add_dependency()
> > > > > > could
> > > > > > explode
> > > > > > even earlier if adding a normal dependency after
> > > > > > preallocating
> > > > > > a
> > > > > > slot.
> > > > > > 
> > > > > > > Yes, it would. All operations simply give you NULL for
> > > > > > > those
> > > > > > > slots. So
> > > > > > > seems to me you have to check for NULL wherever a
> > > > > > > preallocated
> > > > > > > slot
> > > > > > > might drop out. That would then be a bug.
> > > > > > > 
> > > > > > > It's kind of tricky, all that. It's a pity that Wilcox
> > > > > > > didn't
> > > > > > > answer
> > > > > > > our questions about the idiomatic way to do it.
> > > > > > > 
> > > > > > > Maybe reserving slots with already signaled fences wasn't
> > > > > > > such a
> > > > > > > bad
> > > > > > > idea after all?
> > > > > > > 
> > > > > > > If we go for the NULL approach, it's probably the only
> > > > > > > sane
> > > > > > > way
> > > > > > > to then
> > > > > > > check for NULL wherever dependencies are accessed :(
> > > > > > > 
> > > > > > > Opinions?
> > > > > > 
> > > > > > Well if the xarray API returns the NULL consistently the
> > > > > > approach
> > > > > > from
> > > > > > this patch is fine I think.
> > > > > > 
> > > > > > We just need to add two more checks to the above mentioned
> > > > > > functions,
> > > > > 
> > > > > I need to correct myself, drm_sched_job_dependency() wouldn't
> > > > > be
> > > > > able
> > > > > to
> > > > > just skip NULLs since it relies on NULL for "no more
> > > > > dependencies".
> > > > > We
> > > > > would need to track something like job->max_dependency and
> > > > > terminate
> > > > > on
> > > > > job->last_dependency > job->max_dependency or so.
> > > > 
> > > > Agreed, that would have to be fixed.
> > > > 
> > > > I believe we should reconsider Christian's first idea [1].
> > > > 
> > > > Thinking about it some more:
> > > >    * With the NULL version, suddenly the xarray containing only
> > > > valid
> > > >      dependencies can sometimes contain NULL entries.
> > > >    * If we could create our own tag, entries could be returned
> > > > that
> > > > were
> > > >      neither NULL nor valid fences, also requiring checks
> > > > 'everywhere'.
> > > >    * Only the "signaled fence as prealloc reservation" approach
> > > > is
> > > > fully
> > > >      backwards compatible and will never cause anyone to block
> > > > after
> > > >      later reworks.
> > > > 
> > > > So maybe it's actually the best idea?
> > > > 
> > > > Sorry for the zigg-zagg. No hard requirements intended from my
> > > > side,
> > > > I'm willing to go with what you guys think.
> > > > 
> > > > Just saying, at least now I think that the already-signaled
> > > > fence
> > > > seems
> > > > the most elegant solution. And since there's a function
> > > > (dma_fence_get_stub()) for that, it seems to be in alignment
> > > > with
> > > > official dma_fence rules.
> > > 
> > > Potential problem there was dma_fence_is_signaled() and fence
> > > signaling
> > > annotations. In case some driver is holding a lock over the
> > > arm+push
> > > pair. I wish we had a non-signaling is_signaled helper..
> > > 
> > 
> > Yes! +1!
> > 
> > But Christian doesn't like that direction:
> > 
> > https://lore.kernel.org/all/20250409120640.106408-2-phasta@kernel.org/
> 
> Thanks, I read this but ended up uncertain on the conclusion.
> 
> For instance Christian at the end comments like this:
> 
> """
> You can test the flag if you know what the fence means to you, that
> is 
> not a problem at all.
> """
> 
> That was in the context of testing the signaled bit without 
> opportunistic signaling.
> 
> For me, from the scheduler dependencies side, that should exactly
> apply. 
> Scheduler knows it does not need to add a signaled fence to the dep 
> array so AFAICS it is fine to skip it. And it may easily be 
> opportunistic signaling ends up a problem for the scheduler.
> 
> So maybe such helper would be okay after all.

The thing is that, if I understand him correctly, Christian doesn't
want a helper. He wants "us" to just use test_bit().

My point is just that dma_fence_is_signaled() is a horrible name.

The function pci_is_enabled() tells you whether the PCI device is
enabled. What it doesn't do is

bool pci_is_enabled(pdev)
{
   if (crazy_callback_is_implemented()) {
      pci_enable_device();
      return true;
   }

  ...
}

It's not intuitive that a function called "{something}_is_signaled()"
does signal that thing. Although I get that the syntactical idea
probably is that from the GPUs POV the fence is already signaled when
this or that seqno has been reached.

Anyways, judging aside, if a wrapper for test_bit(dma_fence) were
acceptable, then it would need to steal dma_fence_is_signaled()'s name,
and dma_fence_is_signaled() would have to get a new name. Which is
precisely what was rejected, as I see it.

P.

> 
> Or if the concern is helper might encourage some potentially unsafe 
> usage, in that case it should come with kerneldoc describing. It is
> not 
> like review is guaranteed to catch someone using test_bit directly 
> anyway so for me, on balance, helper is always better.
> 
> Regards,
> 
> Tvrtko
> 
> 
> 
> 
> > 
> > P.
> > 
> > > 
> > > 
> > 
> > 
> > > 
> > > 
> > > Anyway, I think both options are passable. I even like the NULL
> > > entry
> > > slightly more since it is simpler in a way and I don't mind some
> > > extra
> > > checks completely hidden in scheduler internals.
> > > 
> > > Regards,
> > > 
> > > Tvrtko
> > > 
> > > > 
> > > > 
> > > > Philipp
> > > > 
> > > > 
> > > > [1]
> > > > https://lore.kernel.org/all/20250318120313.19099-2-christian.koenig@amd.com
> > > > /
> > > > 
> > > > 
> > > > > 
> > > > > Regards,
> > > > > 
> > > > > Tvrtko
> > > > > 
> > > > > > some more unit tests probably to make sure, and that should
> > > > > > be
> > > > > > fine
> > > > > > for
> > > > > > now.
> > > > > > 
> > > > > > On the bikeshedding front I would perhaps suggest:
> > > > > > 
> > > > > >     - drm_sched_job_preallocate_dependency()
> > > > > >     - drm_sched_job_replace_dependency()
> > > > > > 
> > > > > > Reads a little bit more aligned with the rest of the API
> > > > > > and a
> > > > > > bit
> > > > > > easier on the eyes, to my eyes at least.
> > > > > > 
> > > > > > Regards,
> > > > > > 
> > > > > > Tvrtko
> > > > > > 
> > > > > 
> > > > 
> > > 
> > 
> 



More information about the amd-gfx mailing list