On Sun, Aug 09, 2020 at 04:43:24PM +0200, Mark Kettenis wrote:
> > Date: Sat, 8 Aug 2020 19:46:14 -0500
> > From: Scott Cheloha <scottchel...@gmail.com>
> > 
> > Hi,
> > 
> > I want to annotate the locking for the per-process interval timers.
> > 
> > In the process struct, the ITIMER_REAL itimerspec and the ps_itimer_to
> > timeout are protected by the kernel lock.  These should be annotated
> > with "K", right?
> > 
> > Also in the process struct, the ITIMER_VIRTUAL and ITIMER_PROF
> > itimerspecs are protected by the global itimer_mtx.
> > 
> > However, I don't think "itimer_mtx" isn't the best name for it, as it
> > doesn't protect state for *all* per-process interval timers.  Just the
> > virtual ones.
> > 
> > Could I rename the mutex to "virtual_itimer_mtx"?  Then I can annotate
> > the state protected by it with "V", as shown here in this patch.
> 
> That's quite a long variable name though.  And it also protects
> ITIMER_PROF.  So I'd say the name would be at least as misleading as
> the current one and perhaps even more so.  You can just use "I" as the
> annotation perhaps?

The convention is to use "I" for immutable variables.  We do it
everywhere.  I don't think we should buck convention here.

I also proposed using "i" in a prior patch to annotate these
variables, but mpi@ said it was too close to "I".  Also, it's a global
lock, and we have settled on only annotate global locks with capital
letters.

If you don't want to rename the mutex I guess we could use "T" for
"timer".  We use "T" for other global locks (tc_lock, timeout_mutex)
but not in this context.

However, there are only so many letters.  Eventually this scheme will
run afoul of that limitation.  An idea I had re. the letter shortage
was to use two letters where necessary.  So instead of "I" you could
use "It" for "itimer".  We annotate locking hierarchies with commas so
there isn't an ambiguity when reading it.

For example, if the code for writing a hypothetical "ps_foo" process
struct member was:

        KERNEL_LOCK();
        mtx_enter(&itimer_mtx);
        ps.ps_foo = 10;
        mtx_leave(&itimer_mtx);
        KERNEL_UNLOCK();

You could annotate it like this:

/*
 * Locks used to protect process struct members:
 *
 *      It      itimer_mtx
 *      K       kernel lock
 */
struct process {
        /* [...] */
        int ps_foo;     /* [K,It] per-process foobar */
        /* [...] */
};

anton@, mpi@: is that too radical or easily misread?

Sorry if this all seems fussy, but I'd like to get this right the
first time.

-Scott

Reply via email to