From: Willem de Bruijn <willemdebruijn.kernel@gmail.com> Date: 2016-09-12 17:05:37
From: Willem de Bruijn <willemb@google.com>
It was reported that linux/errqueue.h requires linux/time.h, but that
adding the include directly may cause userspace conflicts between
linux/time.h and glibc time.h:
https://lkml.org/lkml/2016/7/10/10
Address the conflicts using the standard libc-compat approach, then
add the #include to errqueue.h
The first patch is a resubmit. It was previously submitted to
tip/timers/core, but given the commit history, the maintainer
suggested this tree, instead.
https://lkml.org/lkml/2016/8/10/748
This also allows sending the follow-up as part of the patchset.
Willem de Bruijn (2):
uapi glibc compat: make linux/time.h compile with user time.h files
errqueue: include linux/time.h
include/uapi/linux/errqueue.h | 1 +
include/uapi/linux/libc-compat.h | 50 ++++++++++++++++++++++++++++++++++++++++
include/uapi/linux/time.h | 15 ++++++++++++
3 files changed, 66 insertions(+)
--
2.8.0.rc3.226.g39d4020
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com> Date: 2016-09-12 17:53:06
From: Willem de Bruijn <willemb@google.com>
struct scm_timestamping has fields of type struct timespec. Now that
it is safe to include linux/time.h and time.h at the same time,
include linux/time.h directly in linux/errqueue.h
Without this patch, when compiling the following program after
make headers_install:
gcc -Wall -Werror -Iusr/include -c -xc - <<EOF
#include <linux/errqueue.h>
static struct scm_timestamping tss;
int main(void) { tss.ts[0].tv_sec = 1; return 0; }
EOF
gcc gives this error:
In file included from <stdin>:1:0:
usr/include/linux/errqueue.h:33:18: error: array type has incomplete element type
struct timespec ts[3];
Reported-by: Brooks Moses <redacted>
Signed-off-by: Willem de Bruijn <willemb@google.com>
---
include/uapi/linux/errqueue.h | 1 +
1 file changed, 1 insertion(+)
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com> Date: 2016-09-12 17:53:49
From: Willem de Bruijn <willemb@google.com>
Add libc-compat workaround for definitions in linux/time.h that
duplicate those in libc time.h, sys/time.h and bits/time.h.
With this change, userspace builds succeeds when linux/time.h is
included after libc time.h and when it is included after sys/time.h.
The inverse requires additional changes to those userspace headers.
Without this patch, when compiling the following program after
make headers_install:
echo -e "#include <time.h>\n#include <linux/time.h>" | \
gcc -Wall -Werror -Iusr/include -c -xc -
gcc gives these errors:
#include <time.h>
#include <linux/time.h>
In file included from ../test_time.c:3:0:
/usr/include/time.h:120:8: error: redefinition of ‘struct timespec’
struct timespec
^
In file included from ../test_time.c:2:0:
./usr/include/linux/time.h:9:8: note: originally defined here
struct timespec {
^
In file included from ../test_time.c:3:0:
/usr/include/time.h:161:8: error: redefinition of ‘struct itimerspec’
struct itimerspec
^
In file included from ../test_time.c:2:0:
./usr/include/linux/time.h:34:8: note: originally defined here
struct itimerspec {
and this warning by indirect inclusion of bits/time.h:
In file included from ../test_time.c:4:0:
./usr/include/linux/time.h:67:0: error: "TIMER_ABSTIME" redefined [-Werror]
#define TIMER_ABSTIME 0x01
^
In file included from /usr/include/time.h:41:0,
from ../test_time.c:3:
/usr/include/x86_64-linux-gnu/bits/time.h:82:0: note: this is the location of the previous definition
# define TIMER_ABSTIME 1
^
The _SYS_TIME_H variant resolves similar errors for timeval, timezone,
itimerval and warnings for ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF.
Ran the same program for sys/time.h and bits/time.h.
Signed-off-by: Willem de Bruijn <willemb@google.com>
---
include/uapi/linux/libc-compat.h | 50 ++++++++++++++++++++++++++++++++++++++++
include/uapi/linux/time.h | 15 ++++++++++++
2 files changed, 65 insertions(+)
From: kbuild test robot <hidden> Date: 2016-09-12 19:27:14
Hi Willem,
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Willem-de-Bruijn/uapi-include-time-h-from-errqueue-h/20160913-020431
config: i386-defconfig (attached as .config)
compiler: gcc-6 (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All errors (new ones prefixed by >>):
In file included from ./usr/include/linux/errqueue.h:4:0,
from Documentation/networking/timestamping/timestamping.c:46:
quoted
./usr/include/linux/time.h:26:8: error: redefinition of 'struct timezone'
struct timezone {
^~~~~~~~
In file included from Documentation/networking/timestamping/timestamping.c:37:0:
/usr/include/x86_64-linux-gnu/sys/time.h:55:8: note: originally defined here
struct timezone
^~~~~~~~
--
In file included from ./usr/include/linux/errqueue.h:4:0,
from Documentation/networking/timestamping/txtimestamp.c:40:
quoted
./usr/include/linux/time.h:19:8: error: redefinition of 'struct timeval'
struct timeval {
^~~~~~~
In file included from /usr/include/x86_64-linux-gnu/sys/select.h:45:0,
from /usr/include/x86_64-linux-gnu/sys/types.h:219,
from /usr/include/x86_64-linux-gnu/sys/uio.h:23,
from /usr/include/x86_64-linux-gnu/sys/socket.h:26,
from /usr/include/netinet/in.h:23,
from /usr/include/arpa/inet.h:22,
from Documentation/networking/timestamping/txtimestamp.c:35:
/usr/include/x86_64-linux-gnu/bits/time.h:30:8: note: originally defined here
struct timeval
^~~~~~~
In file included from Documentation/networking/timestamping/txtimestamp.c:59:0:
quoted
/usr/include/x86_64-linux-gnu/sys/time.h:55:8: error: redefinition of 'struct timezone'
struct timezone
^~~~~~~~
In file included from ./usr/include/linux/errqueue.h:4:0,
from Documentation/networking/timestamping/txtimestamp.c:40:
./usr/include/linux/time.h:26:8: note: originally defined here
struct timezone {
^~~~~~~~
quoted
./usr/include/linux/time.h:38:22: error: expected identifier before numeric constant
#define ITIMER_REAL 0
^
In file included from Documentation/networking/timestamping/txtimestamp.c:59:0:
quoted
/usr/include/x86_64-linux-gnu/sys/time.h:107:8: error: redefinition of 'struct itimerval'
struct itimerval
^~~~~~~~~
In file included from ./usr/include/linux/errqueue.h:4:0,
from Documentation/networking/timestamping/txtimestamp.c:40:
./usr/include/linux/time.h:51:8: note: originally defined here
struct itimerval {
^~~~~~~~~
In file included from Documentation/networking/timestamping/txtimestamp.c:61:0:
quoted
/usr/include/time.h:161:8: error: redefinition of 'struct itimerspec'
struct itimerspec
^~~~~~~~~~
In file included from ./usr/include/linux/errqueue.h:4:0,
from Documentation/networking/timestamping/txtimestamp.c:40:
./usr/include/linux/time.h:44:8: note: originally defined here
struct itimerspec {
^~~~~~~~~~
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
This error report shows that breakage can occur with applications that
include linux/errqueue.h before the libc time headers.
The libc-compat definitions in this patch set only fix compilation
when uapi headers are included after the userspace headers.
These errors indeed go away when errqueue.h is included after the
userspace time includes, as in the diff below.
For the inverse, the libc headers need additional #if __UAPI_DEF_FOO
changes, as described in include/uapli/linux/libc-compat.h. Those
changes are a noop without kernel definitions, so arguably that libc
patch should be merged before this kernel patch.
I will remove this patch set from the patchwork queue for now.