why is there still so much __KERNEL__ testing in include/uapi/?

Robert P. J. Day rpjday at crashcourse.ca
Sat May 28 05:51:21 EDT 2016


On Fri, 27 May 2016, Greg KH wrote:

> On Fri, May 27, 2016 at 12:08:09PM -0400, Robert P. J. Day wrote:
> >
> >   continuing down this road of exporting kernel headers, under
> > include/uapi/ (and mostly further under linux/), there's still a
> > *ton* of testing of the __KERNEL__ preprocessor check.
> >
> >   now, i realize that when one does "make headers_install", all
> > those files are run through "unifdef" to sanitize almost all of
> > that kernel content, so it's not like it hurts, but is there any
> > reason so much of it is still there? wouldn't it be tidier to get
> > rid of it?
>
> No, because not all of the information in those .h files should be
> exported to userspace.  You could either split the files all up into
> two different ones, or just live with the existing infrastructure we
> have. We chose the easy one :)

  ok, after further perusal, i can see the misunderstandings i had,
mostly because i'd never read the rationale and design for UAPI
closely enough.

  originally, i thought the whole point of the uapi/ directories was
to factor out, as thoroughly as possible, user space-only header file
content, and certainly there are header files where there is a
beautiful, clean break between kernel space stuff and user space
stuff, so splitting such a file into two parts is easy.

  so my first mistake was thinking that there should be very little
__KERNEL__ checking in the uapi/ directories. there are, of course,
cases where it's just not feasible to do a perfect partitioning, like
in cases where a single structure definition might contain:

  #ifdef __KERNEL__
    some member
  #else
    some other member
  #endif

so, sure, that sort of thing would be retained in a uapi/ header file,
and would be finally sanitized as part of the headers install process.

  what i'm massively embarrassed to admit is that i didn't know the
uapi/ directories are part of the normal kernel header file search
path:

  # Use USERINCLUDE when you must reference the UAPI directories only.
  USERINCLUDE    := \
                -I$(srctree)/arch/$(hdr-arch)/include/uapi \
                -Iarch/$(hdr-arch)/include/generated/uapi \
                -I$(srctree)/include/uapi \
                -Iinclude/generated/uapi \
                -include $(srctree)/include/linux/kconfig.h

  # Use LINUXINCLUDE when you must reference the include/ directory.
  # Needed to be compatible with the O= option
  LINUXINCLUDE    := \
                -I$(srctree)/arch/$(hdr-arch)/include \
                -Iarch/$(hdr-arch)/include/generated/uapi \
                -Iarch/$(hdr-arch)/include/generated \
                $(if $(KBUILD_SRC), -I$(srctree)/include) \
                -Iinclude \
                $(USERINCLUDE)

which means that rather than trying to refactor a header file into
kernel and user space parts, you can just say, "ah, the heck with it,"
and move it into uapi/, where it will be the *only* version of that
header file in the kernel source tree, suitable for use in both kernel
and user space.  case in point:

  $ find . -name virtio_blk.h
  ./include/uapi/linux/virtio_blk.h
  $

and in cases like that, sure, there could be all sorts of __KERNEL__
checking going on to distinguish kernel space content from user space
content.

rday

-- 

========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                        http://crashcourse.ca

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================




More information about the Kernelnewbies mailing list