svn commit: r272574 - head/sys/sys

Bruce Evans brde at optusnet.com.au
Mon Oct 6 04:25:55 UTC 2014


On Sun, 5 Oct 2014, Mateusz Guzik wrote:

> Log:
>  seq_t needs to be visible to userspace
>
>  Pointy hat to:	mjg
>  Reported by: bz
>  X-MFC:	with r272567

The namespace pollution is more disgusting than before.

> Modified: head/sys/sys/seq.h
> ==============================================================================
> --- head/sys/sys/seq.h	Sun Oct  5 21:34:56 2014	(r272573)
> +++ head/sys/sys/seq.h	Sun Oct  5 21:39:50 2014	(r272574)
> @@ -29,6 +29,16 @@
> #define _SYS_SEQ_H_
>
> #ifdef _KERNEL
> +#include <sys/systm.h>
> +#endif

Namespace pollution.  In the kernel, it is the responsibility of .c
files to include <sys/systm.h> before any other header except
<sys/param.h>, in case bad headers like this one use inline functions
with KASSERT() either now or later.

> +#include <sys/types.h>

Namespace pollution.  In the kernel, it is the responsibility of .c
files to include <sys/param.h> before any other header, since it has
standard namspace pollution that other headers may depend on now or
later.  This pollution includes <sys/types.h>, even outside the
kernel.  It is a documented style bug to include both <sys/types.h>
and <sys/param.h>.  It is a bug to include <sys/types.h> and not
<sys/param.h> in the kernel, except in very special cases where only
headers with a stable API are included after it (otherwise, the others
might grow a need for <sys/param.h> or <sys/systm.h>.

Outside of the kernel, the necessary types and no others should be
declared in headers.


> +/*
> + * seq_t may be included in structs visible to userspace
> + */
> +typedef uint32_t seq_t;
> +
> +#ifdef _KERNEL
>
> /*
>  * Typical usage:
> @@ -54,10 +64,7 @@
>  * 	foo(lobj);
>  */
>
> -typedef uint32_t seq_t;
> -
> /* A hack to get MPASS macro */
> -#include <sys/systm.h>
> #include <sys/lock.h>

Now the comment doesn't match the code.  The hack is to include both
<sys/systm.h> and <sys/lock.h>.  MPASS is defined in <sys/lock.h>.
<sys/lock.h> has minimal pollution.  In particular, it doesn't
include <sys/systm.h>.  It uses MPASS() with a KASSERT(), but this
is in a macro so files that actually use the macro need to include
<sys/param.h>.  <sys/filedesc.h>'s includers are now such files, but
<sys/filedesc.h> polluted instead.  This commit moves half of the
hack earlier than needed and far from the comment that documents it.

>
> #include <machine/cpu.h>

If you remove the <sys/systm.h> part of the hack, some .c files might
break.  This is a feature.  It detects 2 bugs:
- nested pollution.  IIRC, <sys/filedesc.h> is now polluted with an
   include of <sys/seq.h>, so not only files that include <sys/seq.h>
   are effected
- the brokenness of the files that break.  <sys/filedesc.h> is included
   much more, and any .c file that is missing the include of
   <sys/systm.h>, or includes it miss-sorted in alphabetical or totally
   disordered after <sys/filedesc.h>.  Part of the feature is that you
   get to fix all such broken .c files, or better implement new headers
   without namespace pollution.  The only easy way to avoid pollution
   from KASSERT() in headers is to only use it in other macros.  Some
   inline functions are so small that this is clean enough.  But ones
   that use KASSERT() are not so small.  Just using it makes them too
   large to inline (when it is enabled).

Bruce


More information about the svn-src-head mailing list