On Sat, Jun 01, 2019 at 07:04:23PM -0300, Martin Pieuchot wrote:
> On 01/06/19(Sat) 23:22, Mark Kettenis wrote:
> > > Date: Sat, 1 Jun 2019 17:32:52 -0300
> > > From: Martin Pieuchot <m...@openbsd.org>
> > > 
> > > Currently it isn't safe to call mtx_enter_try(9) if you're already
> > > holding the mutex.  That means it isn't safe to call that function
> > > in hardclock(9), like with `windup_mtx'.  That's why the mutex needs
> > > to be initialized as IPL_CLOCK.
> > > 
> > > I'm working on removing the SCHED_LOCK() from inside hardclock(9).
> > > That leads me to wonder if I should initialize all mutexes to IPL_SCHED,
> > > possibly blocking clock interrupts, or if we should change the mutex API
> > > to allow mtx_enter_try(9) to deal with recursion.
> > > 
> > > The diff below removes the recursion check for mtx_enter_try(9).
> > > 
> > > Comments?  Oks?
> > 
> > My initial reaction is that if you're trying to lock when you already
> > have the lock, there is something wrong with your locking strategy and
> > that this is something we don't want.
> 
> Could you elaborate?  Are you saying that preventing hardclock(9) to run
> is the way to move forward to unlock its internals?  Why isn't that
> strategy wrong?
> 
> In the `windup_mtx' case, does it matter if the mutex is taken by
> another CPU or by myself?  What's the problem when CPU0 is one holding
> the lock?

mutex(9) is not and should not become recursive. Recursive locking
works when it is voluntary. If recursion was allowed with interrupts,
the CPU could re-enter the critical section at any moment, possibly
seeing inconsistent state or breaking assumptions made by the original
entry.

Reply via email to