On Wed, 2026-01-14 at 12:30 +0100, Christian König wrote:
> On 1/13/26 17:12, Philipp Stanner wrote:
> > On Tue, 2026-01-13 at 16:16 +0100, Christian König wrote:
> > > Using the inline lock is now the recommended way for dma_fence 
> > > implementations.
> > > 
> > > For the scheduler fence use the inline lock for the scheduled fence part
> > > and then the lock from the scheduled fence as external lock for the 
> > > finished fence.
> > > 
> > > This way there is no functional difference, except for saving the space
> > > for the separate lock.
> > > 
> > > v2: re-work the patch to avoid any functional difference
> > 
> > *cough cough*
> > 
> > > 
> > > Signed-off-by: Christian König <[email protected]>
> > > ---
> > >  drivers/gpu/drm/scheduler/sched_fence.c | 6 +++---
> > >  include/drm/gpu_scheduler.h             | 4 ----
> > >  2 files changed, 3 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/scheduler/sched_fence.c 
> > > b/drivers/gpu/drm/scheduler/sched_fence.c
> > > index 724d77694246..112677231f9a 100644
> > > --- a/drivers/gpu/drm/scheduler/sched_fence.c
> > > +++ b/drivers/gpu/drm/scheduler/sched_fence.c
> > > @@ -217,7 +217,6 @@ struct drm_sched_fence *drm_sched_fence_alloc(struct 
> > > drm_sched_entity *entity,
> > >  
> > >   fence->owner = owner;
> > >   fence->drm_client_id = drm_client_id;
> > > - spin_lock_init(&fence->lock);
> > >  
> > >   return fence;
> > >  }
> > > @@ -230,9 +229,10 @@ void drm_sched_fence_init(struct drm_sched_fence 
> > > *fence,
> > >   fence->sched = entity->rq->sched;
> > >   seq = atomic_inc_return(&entity->fence_seq);
> > >   dma_fence_init(&fence->scheduled, &drm_sched_fence_ops_scheduled,
> > > -                &fence->lock, entity->fence_context, seq);
> > > +                NULL, entity->fence_context, seq);
> > >   dma_fence_init(&fence->finished, &drm_sched_fence_ops_finished,
> > > -                &fence->lock, entity->fence_context + 1, seq);
> > > +                dma_fence_spinlock(&fence->scheduled),
> > 
> > I think while you are correct that this is no functional difference, it
> > is still a bad idea which violates the entire idea of your series:
> > 
> > All fences are now independent from each other and the fence context –
> > except for those two.
> > 
> > Some fences are more equal than others ;)
> 
> Yeah, I was going back and forth once more if I should keep this patch at all 
> or just drop it.
> 
> > By implementing this, you would also show to people browsing the code
> > that it can be a good idea or can be done to have fences share locks.
> > Do you want that?
> 
> Good question. For almost all cases we don't want this, but once more the 
> scheduler is special.
> 
> In the scheduler we have two fences in one, the scheduled one and the 
> finished one.
> 
> So here it technically makes sense to have this construct to be defensive.
> 
> But on the other hand it has no practical value because it still doesn't 
> allow us to unload the scheduler module. We would need a much wider rework 
> for being able to do that.
> 
> So maybe I should just really drop this patch or at least keep it back until 
> we had time to figure out what the next steps are.
> 
> > As far as I have learned from you and our discussions, that would be a
> > very bombastic violation of the sacred "dma-fence-rules".
> 
> Well using the inline fence is "only" a strong recommendation. It's not as 
> heavy as the signaling rules because when you mess up those you can easily 
> kill the whole system.
> 
> > I believe it's definitely worth sacrificing some bytes so that those
> > two fences get fully decoupled. Who will have it on their radar that
> > they are special? Think about future reworks.
> 
> This doesn't even save any bytes, my thinking was more that this is the more 
> defensive approach should anybody use the spinlock pointer from the scheduler 
> fence to do some locking.
> 

Using the scheduler's internal locks is not legal (anymore). With the
sched_fence it's a bit special though because that is the
synchronization object for the driver, actually. So I don't know
either.

I would say either separate the locks, or drop the patch as you
suggest.


P.

> > Besides that, no objections from my side.
> 
> Thanks,
> Christian.
> 
> > 
> > 
> > P.
> > 
> > > +                entity->fence_context + 1, seq);
> > >  }
> > >  
> > >  module_init(drm_sched_fence_slab_init);
> > > diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
> > > index 78e07c2507c7..ad3704685163 100644
> > > --- a/include/drm/gpu_scheduler.h
> > > +++ b/include/drm/gpu_scheduler.h
> > > @@ -297,10 +297,6 @@ struct drm_sched_fence {
> > >           * belongs to.
> > >           */
> > >   struct drm_gpu_scheduler        *sched;
> > > -        /**
> > > -         * @lock: the lock used by the scheduled and the finished fences.
> > > -         */
> > > - spinlock_t                      lock;
> > >          /**
> > >           * @owner: job owner for debugging
> > >           */
> > 
> 

Reply via email to