Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Mar 2011 12:10:58 -0800
From:      mdf@FreeBSD.org
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: style(9) rules for nested includes
Message-ID:  <AANLkTikbRaCE628wJvKbBUbuBsJo6d6wJhvozSZA8kWW@mail.gmail.com>
In-Reply-To: <201103101446.37589.jhb@freebsd.org>
References:  <AANLkTikqBJON46-EJFPPktT82L8dgX6dwwDrxWwFqumU@mail.gmail.com> <201103101446.37589.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Mar 10, 2011 at 11:46 AM, John Baldwin <jhb@freebsd.org> wrote:
> On Thursday, March 10, 2011 12:17:28 pm mdf@freebsd.org wrote:
>> I recall a recent discussion/PR about nested includes in the context
>> of <sys/linker_set.h> and <sys/queue.h> being a few of the only ones
>> allowed. =A0However, I don't see anything in style(9) about this.
>
> bde@ is probably the most authoritative. =A0My understanding is that the =
only
> nested includes allowed in sys/sys/*.h are the two listed above and any h=
eader
> that starts with an underscore (sys/_mutex.h, etc.). =A0The underscore va=
riants
> were added to allow nested includes when absolutely necessary, but those
> includes are the bare minimum required to define structures, etc.
>
>> Now we come to the reason I ask. =A0I'm working on a patch to change the
>> static sysctl code to use the standard SYSININT/SYSUNINIT code rather
>> than have special treatment in kern_linker.c, but to do this I need to
>> either change quite a few places that include <sys/sysctl.h>, or
>> include <sys/kernel.h> instead of <sys/linker_set.h> in sysctl.h, as
>> the SI_SUB_SYSCTLS value isn't visible otherwise.
>
> Hmm, what is the reason to use SYSINIT's instead of a dedicated linker se=
t?

Mostly for consistency.  The DB_COMMAND linker set was changed to use
SYSINITs for version 8, and AFIAK SYSCTL is the only global kernel
thing using a separate linker set.

There's also a minor bug in initialization ordering where a static
SYSCTL_PROC could use a lock initialized by SX_SYSINIT or MTX_SYSINIT,
but at runtime module load the sysctl is exposed before the
SI_SUB_LOCK stage has run, so in theory someone doing sysctl -a would
crash the kernel on an attempt to lock an uninitialized mtx/sx.  We
saw this happen once at Isilon.

Thanks,
matthew



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTikbRaCE628wJvKbBUbuBsJo6d6wJhvozSZA8kWW>