Message ID | 20201001231256.6930-1-petr.vorel@gmail.com |
---|---|
State | Rejected |
Headers | show |
Series | [RFC,1/1] lapi: Add sysinfo.h to fix build with MUSL libc | expand |
Hi, > The reason is to avoid indirect <linux/sysinfo.h> include when using > some UAPI headers: <linux/netlink.h> or others -> <linux/kernel.h> > -> <linux/sysinfo.h> > This indirect include causes on MUSL redefinition of struct sysinfo when > included both <sys/sysinfo.h> and some of UAPI headers: > In file included from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/kernel.h:5, > from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/netlink.h:5, > from ../include/tst_netlink.h:14, > from tst_crypto.c:13: > x86_64-buildroot-linux-musl/sysroot/usr/include/linux/sysinfo.h:8:8: error: redefinition of ‘struct sysinfo’ > struct sysinfo { > ^~~~~~~ > In file included from ../include/tst_safe_macros.h:15, > from ../include/tst_test.h:93, > from tst_crypto.c:11: > x86_64-buildroot-linux-musl/sysroot/usr/include/sys/sysinfo.h:10:8: note: originally defined here FYI commit which introduced the problem is 39aabfbd0 ("Add SAFE_SYSINFO() macro"). Alpine linux has patched kernel header, that's why our travis test didn't catch that. https://git.alpinelinux.org/aports/tree/main/linux-headers/0003-remove-inclusion-of-sysinfo.h-in-kernel.h.patch Kind regards, Petr
Hi! > The reason is to avoid indirect <linux/sysinfo.h> include when using > some UAPI headers: <linux/netlink.h> or others -> <linux/kernel.h> > -> <linux/sysinfo.h> > > This indirect include causes on MUSL redefinition of struct sysinfo when > included both <sys/sysinfo.h> and some of UAPI headers: > > In file included from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/kernel.h:5, > from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/netlink.h:5, > from ../include/tst_netlink.h:14, > from tst_crypto.c:13: > x86_64-buildroot-linux-musl/sysroot/usr/include/linux/sysinfo.h:8:8: error: redefinition of ???struct sysinfo??? > struct sysinfo { > ^~~~~~~ > In file included from ../include/tst_safe_macros.h:15, > from ../include/tst_test.h:93, > from tst_crypto.c:11: > x86_64-buildroot-linux-musl/sysroot/usr/include/sys/sysinfo.h:10:8: note: originally defined here > > Signed-off-by: Petr Vorel <petr.vorel@gmail.com> > --- > Hi, > > another MUSL specific workaround. I'm ok if we don't want to accept it. > > I also sent patch to kernel, but don't think it will be accepted. > > https://lore.kernel.org/linux-api/20201001211942.13336-1-petr.vorel@gmail.com/T/#me9d7d385157ec5f6288bae77d738a96c12ab8ca7 > > Kind regards, > Petr > > include/lapi/sysinfo.h | 22 +++++++++++++++++++ > include/tst_safe_macros.h | 2 +- > lib/safe_macros.c | 2 +- > lib/tst_memutils.c | 2 +- > testcases/kernel/mem/mtest01/mtest01.c | 2 +- > testcases/kernel/syscalls/madvise/madvise06.c | 2 +- > testcases/kernel/syscalls/sysinfo/sysinfo01.c | 2 +- > testcases/kernel/syscalls/sysinfo/sysinfo02.c | 2 +- > testcases/kernel/syscalls/sysinfo/sysinfo03.c | 2 +- > 9 files changed, 30 insertions(+), 8 deletions(-) > create mode 100644 include/lapi/sysinfo.h > > diff --git a/include/lapi/sysinfo.h b/include/lapi/sysinfo.h > new file mode 100644 > index 000000000..d0e0e93d7 > --- /dev/null > +++ b/include/lapi/sysinfo.h > @@ -0,0 +1,22 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) 2020 Petr Vorel <petr.vorel@gmail.com> > + */ > + > +#ifndef SYSINFO_H__ > + > +/* > + * Don't use <sys/sysinfo.h> as it breaks build MUSL toolchain. > + * Use <linux/sysinfo.h> instead. > + * > + * Some kernel UAPI headers do indirect <linux/sysinfo.h> include: > + * <linux/netlink.h> or others -> <linux/kernel.h> -> <linux/sysinfo.h> > + * > + * This indirect include causes on MUSL redefinition of struct sysinfo when > + * included both <sys/sysinfo.h> and some of UAPI headers: > + */ > +#include <linux/sysinfo.h> > + > +#define SYSINFO_H__ > + > +#endif /* SYSINFO_H__ */ Well the #define SYSINFO_H__ usually goes right after the #ifndef on the top. Apart from that it looks like the kernel patch has been ignored. I guess that you should try to push it a bit more before we give up and apply workarounds...
Hi Cyril, thanks for your review! ... > > +++ b/include/lapi/sysinfo.h > > @@ -0,0 +1,22 @@ > > +// SPDX-License-Identifier: GPL-2.0-or-later > > +/* > > + * Copyright (c) 2020 Petr Vorel <petr.vorel@gmail.com> > > + */ > > + > > +#ifndef SYSINFO_H__ > > + > > +/* > > + * Don't use <sys/sysinfo.h> as it breaks build MUSL toolchain. > > + * Use <linux/sysinfo.h> instead. > > + * > > + * Some kernel UAPI headers do indirect <linux/sysinfo.h> include: > > + * <linux/netlink.h> or others -> <linux/kernel.h> -> <linux/sysinfo.h> > > + * > > + * This indirect include causes on MUSL redefinition of struct sysinfo when > > + * included both <sys/sysinfo.h> and some of UAPI headers: > > + */ > > +#include <linux/sysinfo.h> > > + > > +#define SYSINFO_H__ > > + > > +#endif /* SYSINFO_H__ */ > Well the #define SYSINFO_H__ usually goes right after the #ifndef on the > top. +1. It'd be in v2 if needed. I've added this patch already to buildroot, but if kernel patch get accepted, it'd be kept only temporarily (I think they don't have patches for musl based toolchains, otherwise they'd take Alpine's patch by now. But they instead drop support for these toolchains in packages which don't upstream the solution. > Apart from that it looks like the kernel patch has been ignored. I guess > that you should try to push it a bit more before we give up and apply > workarounds... Tried next version, let's see. https://lore.kernel.org/linux-api/20201015190013.8901-1-petr.vorel@gmail.com/ Kind regards, Petr
Hi Cyril, ... > I've added this patch already to buildroot, but if kernel patch get accepted, > it'd be kept only temporarily (I think they don't have patches for musl based > toolchains, otherwise they'd take Alpine's patch by now. But they instead drop > support for these toolchains in packages which don't upstream the solution. > > Apart from that it looks like the kernel patch has been ignored. I guess > > that you should try to push it a bit more before we give up and apply > > workarounds... > Tried next version, let's see. > https://lore.kernel.org/linux-api/20201015190013.8901-1-petr.vorel@gmail.com/ Patch has been included into next tree [1]. If not reverted, it would fix the problem for newer kernel headers. Distros using MUSL (Buildroot and OpenEmbedded) will have to keep this patch for older headers and update it as we might add more <sys/sysinfo.h> in the future, but that's not that difficult. Kind regards, Petr [1] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?h=next-20201027&id=92a5a1734a34380444dd9cace835525c5f51a9ed
Hi all, I've posted some time ago this patch. Although I fixed the problem for musl in kernel 5.11 (and backported to stable/LTS), there are still toolchains (among people) with older headers. Therefore the result was that Buildroot distribution requires kernel 5.11 headers in toolchains [1]. That effectively disables LTP for musl Buildroot toolchains, which have the problem fixed (they use 4.9 LTS new enough to contain the fix). As a result I'll keep keep rebasing this patch in Buildroot. It would help me not having to carry this downstream, but I understand that musl toolchains aren't something which would bother much LTP upstream, thus you aren't happy to keep lapi/sysinfo.h for a long time. Kind regards, Petr [1] https://lore.kernel.org/buildroot/20230417193924.GM2819@scaer/ On Fri, 2 Oct 2020 at 01:13, Petr Vorel <petr.vorel@gmail.com> wrote: > > The reason is to avoid indirect <linux/sysinfo.h> include when using > some UAPI headers: <linux/netlink.h> or others -> <linux/kernel.h> > -> <linux/sysinfo.h> > > This indirect include causes on MUSL redefinition of struct sysinfo when > included both <sys/sysinfo.h> and some of UAPI headers: > > In file included from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/kernel.h:5, > from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/netlink.h:5, > from ../include/tst_netlink.h:14, > from tst_crypto.c:13: > x86_64-buildroot-linux-musl/sysroot/usr/include/linux/sysinfo.h:8:8: error: redefinition of ‘struct sysinfo’ > struct sysinfo { > ^~~~~~~ > In file included from ../include/tst_safe_macros.h:15, > from ../include/tst_test.h:93, > from tst_crypto.c:11: > x86_64-buildroot-linux-musl/sysroot/usr/include/sys/sysinfo.h:10:8: note: originally defined here > > Signed-off-by: Petr Vorel <petr.vorel@gmail.com> > --- > Hi, > > another MUSL specific workaround. I'm ok if we don't want to accept it. > > I also sent patch to kernel, but don't think it will be accepted. > > https://lore.kernel.org/linux-api/20201001211942.13336-1-petr.vorel@gmail.com/T/#me9d7d385157ec5f6288bae77d738a96c12ab8ca7 > > Kind regards, > Petr > > include/lapi/sysinfo.h | 22 +++++++++++++++++++ > include/tst_safe_macros.h | 2 +- > lib/safe_macros.c | 2 +- > lib/tst_memutils.c | 2 +- > testcases/kernel/mem/mtest01/mtest01.c | 2 +- > testcases/kernel/syscalls/madvise/madvise06.c | 2 +- > testcases/kernel/syscalls/sysinfo/sysinfo01.c | 2 +- > testcases/kernel/syscalls/sysinfo/sysinfo02.c | 2 +- > testcases/kernel/syscalls/sysinfo/sysinfo03.c | 2 +- > 9 files changed, 30 insertions(+), 8 deletions(-) > create mode 100644 include/lapi/sysinfo.h > > diff --git a/include/lapi/sysinfo.h b/include/lapi/sysinfo.h > new file mode 100644 > index 000000000..d0e0e93d7 > --- /dev/null > +++ b/include/lapi/sysinfo.h > @@ -0,0 +1,22 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) 2020 Petr Vorel <petr.vorel@gmail.com> > + */ > + > +#ifndef SYSINFO_H__ > + > +/* > + * Don't use <sys/sysinfo.h> as it breaks build MUSL toolchain. > + * Use <linux/sysinfo.h> instead. > + * > + * Some kernel UAPI headers do indirect <linux/sysinfo.h> include: > + * <linux/netlink.h> or others -> <linux/kernel.h> -> <linux/sysinfo.h> > + * > + * This indirect include causes on MUSL redefinition of struct sysinfo when > + * included both <sys/sysinfo.h> and some of UAPI headers: > + */ > +#include <linux/sysinfo.h> > + > +#define SYSINFO_H__ > + > +#endif /* SYSINFO_H__ */ > diff --git a/include/tst_safe_macros.h b/include/tst_safe_macros.h > index 053c3bcf9..61ea2076d 100644 > --- a/include/tst_safe_macros.h > +++ b/include/tst_safe_macros.h > @@ -12,7 +12,7 @@ > #include <sys/resource.h> > #include <sys/stat.h> > #include <sys/vfs.h> > -#include <sys/sysinfo.h> > +#include <linux/sysinfo.h> > #include <fcntl.h> > #include <libgen.h> > #include <signal.h> > diff --git a/lib/safe_macros.c b/lib/safe_macros.c > index 4f48d7529..d8ee03dae 100644 > --- a/lib/safe_macros.c > +++ b/lib/safe_macros.c > @@ -11,7 +11,6 @@ > #include <sys/wait.h> > #include <sys/mount.h> > #include <sys/xattr.h> > -#include <sys/sysinfo.h> > #include <errno.h> > #include <fcntl.h> > #include <libgen.h> > @@ -23,6 +22,7 @@ > #include <malloc.h> > #include "test.h" > #include "safe_macros.h" > +#include "lapi/sysinfo.h" > > char *safe_basename(const char *file, const int lineno, > void (*cleanup_fn) (void), char *path) > diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c > index f134d90c9..647db951e 100644 > --- a/lib/tst_memutils.c > +++ b/lib/tst_memutils.c > @@ -5,11 +5,11 @@ > > #include <unistd.h> > #include <limits.h> > -#include <sys/sysinfo.h> > #include <stdlib.h> > > #define TST_NO_DEFAULT_MAIN > #include "tst_test.h" > +#include "lapi/sysinfo.h" > > #define BLOCKSIZE (16 * 1024 * 1024) > > diff --git a/testcases/kernel/mem/mtest01/mtest01.c b/testcases/kernel/mem/mtest01/mtest01.c > index f08d3943f..9b4d856f8 100644 > --- a/testcases/kernel/mem/mtest01/mtest01.c > +++ b/testcases/kernel/mem/mtest01/mtest01.c > @@ -20,7 +20,6 @@ > */ > > #include <sys/types.h> > -#include <sys/sysinfo.h> > #include <sys/wait.h> > #include <limits.h> > #include <signal.h> > @@ -29,6 +28,7 @@ > #include <unistd.h> > > #include "lapi/abisize.h" > +#include "lapi/sysinfo.h" > #include "tst_test.h" > > #define FIVE_HUNDRED_MB (500ULL*1024*1024) > diff --git a/testcases/kernel/syscalls/madvise/madvise06.c b/testcases/kernel/syscalls/madvise/madvise06.c > index f76f3f6aa..b2613670b 100644 > --- a/testcases/kernel/syscalls/madvise/madvise06.c > +++ b/testcases/kernel/syscalls/madvise/madvise06.c > @@ -24,8 +24,8 @@ > #include <errno.h> > #include <stdio.h> > #include <sys/mount.h> > -#include <sys/sysinfo.h> > #include "tst_test.h" > +#include "lapi/sysinfo.h" > > #define CHUNK_SZ (400*1024*1024L) > #define CHUNK_PAGES (CHUNK_SZ / pg_sz) > diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo01.c b/testcases/kernel/syscalls/sysinfo/sysinfo01.c > index 2ea44a2be..a95066bf5 100644 > --- a/testcases/kernel/syscalls/sysinfo/sysinfo01.c > +++ b/testcases/kernel/syscalls/sysinfo/sysinfo01.c > @@ -69,9 +69,9 @@ > #include <sys/types.h> > #include <sys/stat.h> > #include <sys/signal.h> > -#include <sys/sysinfo.h> > > #include "test.h" > +#include "lapi/sysinfo.h" > > void setup(); > void cleanup(); > diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo02.c b/testcases/kernel/syscalls/sysinfo/sysinfo02.c > index 678b8f1d3..5ce65d20e 100644 > --- a/testcases/kernel/syscalls/sysinfo/sysinfo02.c > +++ b/testcases/kernel/syscalls/sysinfo/sysinfo02.c > @@ -65,10 +65,10 @@ > #include <sys/types.h> > #include <sys/stat.h> > #include <sys/signal.h> > -#include <sys/sysinfo.h> > #include <stdint.h> > > #include "test.h" > +#include "lapi/sysinfo.h" > > #define INVALID_ADDRESS ((uintptr_t)-1) > > diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo03.c b/testcases/kernel/syscalls/sysinfo/sysinfo03.c > index af7cb6421..3b61a05b1 100644 > --- a/testcases/kernel/syscalls/sysinfo/sysinfo03.c > +++ b/testcases/kernel/syscalls/sysinfo/sysinfo03.c > @@ -13,9 +13,9 @@ > > */ > > -#include <sys/sysinfo.h> > #include "lapi/namespaces_constants.h" > #include "lapi/posix_clocks.h" > +#include "lapi/sysinfo.h" > #include "tst_test.h" > > static int offsets[] = { > -- > 2.28.0 >
diff --git a/include/lapi/sysinfo.h b/include/lapi/sysinfo.h new file mode 100644 index 000000000..d0e0e93d7 --- /dev/null +++ b/include/lapi/sysinfo.h @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2020 Petr Vorel <petr.vorel@gmail.com> + */ + +#ifndef SYSINFO_H__ + +/* + * Don't use <sys/sysinfo.h> as it breaks build MUSL toolchain. + * Use <linux/sysinfo.h> instead. + * + * Some kernel UAPI headers do indirect <linux/sysinfo.h> include: + * <linux/netlink.h> or others -> <linux/kernel.h> -> <linux/sysinfo.h> + * + * This indirect include causes on MUSL redefinition of struct sysinfo when + * included both <sys/sysinfo.h> and some of UAPI headers: + */ +#include <linux/sysinfo.h> + +#define SYSINFO_H__ + +#endif /* SYSINFO_H__ */ diff --git a/include/tst_safe_macros.h b/include/tst_safe_macros.h index 053c3bcf9..61ea2076d 100644 --- a/include/tst_safe_macros.h +++ b/include/tst_safe_macros.h @@ -12,7 +12,7 @@ #include <sys/resource.h> #include <sys/stat.h> #include <sys/vfs.h> -#include <sys/sysinfo.h> +#include <linux/sysinfo.h> #include <fcntl.h> #include <libgen.h> #include <signal.h> diff --git a/lib/safe_macros.c b/lib/safe_macros.c index 4f48d7529..d8ee03dae 100644 --- a/lib/safe_macros.c +++ b/lib/safe_macros.c @@ -11,7 +11,6 @@ #include <sys/wait.h> #include <sys/mount.h> #include <sys/xattr.h> -#include <sys/sysinfo.h> #include <errno.h> #include <fcntl.h> #include <libgen.h> @@ -23,6 +22,7 @@ #include <malloc.h> #include "test.h" #include "safe_macros.h" +#include "lapi/sysinfo.h" char *safe_basename(const char *file, const int lineno, void (*cleanup_fn) (void), char *path) diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c index f134d90c9..647db951e 100644 --- a/lib/tst_memutils.c +++ b/lib/tst_memutils.c @@ -5,11 +5,11 @@ #include <unistd.h> #include <limits.h> -#include <sys/sysinfo.h> #include <stdlib.h> #define TST_NO_DEFAULT_MAIN #include "tst_test.h" +#include "lapi/sysinfo.h" #define BLOCKSIZE (16 * 1024 * 1024) diff --git a/testcases/kernel/mem/mtest01/mtest01.c b/testcases/kernel/mem/mtest01/mtest01.c index f08d3943f..9b4d856f8 100644 --- a/testcases/kernel/mem/mtest01/mtest01.c +++ b/testcases/kernel/mem/mtest01/mtest01.c @@ -20,7 +20,6 @@ */ #include <sys/types.h> -#include <sys/sysinfo.h> #include <sys/wait.h> #include <limits.h> #include <signal.h> @@ -29,6 +28,7 @@ #include <unistd.h> #include "lapi/abisize.h" +#include "lapi/sysinfo.h" #include "tst_test.h" #define FIVE_HUNDRED_MB (500ULL*1024*1024) diff --git a/testcases/kernel/syscalls/madvise/madvise06.c b/testcases/kernel/syscalls/madvise/madvise06.c index f76f3f6aa..b2613670b 100644 --- a/testcases/kernel/syscalls/madvise/madvise06.c +++ b/testcases/kernel/syscalls/madvise/madvise06.c @@ -24,8 +24,8 @@ #include <errno.h> #include <stdio.h> #include <sys/mount.h> -#include <sys/sysinfo.h> #include "tst_test.h" +#include "lapi/sysinfo.h" #define CHUNK_SZ (400*1024*1024L) #define CHUNK_PAGES (CHUNK_SZ / pg_sz) diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo01.c b/testcases/kernel/syscalls/sysinfo/sysinfo01.c index 2ea44a2be..a95066bf5 100644 --- a/testcases/kernel/syscalls/sysinfo/sysinfo01.c +++ b/testcases/kernel/syscalls/sysinfo/sysinfo01.c @@ -69,9 +69,9 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/signal.h> -#include <sys/sysinfo.h> #include "test.h" +#include "lapi/sysinfo.h" void setup(); void cleanup(); diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo02.c b/testcases/kernel/syscalls/sysinfo/sysinfo02.c index 678b8f1d3..5ce65d20e 100644 --- a/testcases/kernel/syscalls/sysinfo/sysinfo02.c +++ b/testcases/kernel/syscalls/sysinfo/sysinfo02.c @@ -65,10 +65,10 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/signal.h> -#include <sys/sysinfo.h> #include <stdint.h> #include "test.h" +#include "lapi/sysinfo.h" #define INVALID_ADDRESS ((uintptr_t)-1) diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo03.c b/testcases/kernel/syscalls/sysinfo/sysinfo03.c index af7cb6421..3b61a05b1 100644 --- a/testcases/kernel/syscalls/sysinfo/sysinfo03.c +++ b/testcases/kernel/syscalls/sysinfo/sysinfo03.c @@ -13,9 +13,9 @@ */ -#include <sys/sysinfo.h> #include "lapi/namespaces_constants.h" #include "lapi/posix_clocks.h" +#include "lapi/sysinfo.h" #include "tst_test.h" static int offsets[] = {
The reason is to avoid indirect <linux/sysinfo.h> include when using some UAPI headers: <linux/netlink.h> or others -> <linux/kernel.h> -> <linux/sysinfo.h> This indirect include causes on MUSL redefinition of struct sysinfo when included both <sys/sysinfo.h> and some of UAPI headers: In file included from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/kernel.h:5, from x86_64-buildroot-linux-musl/sysroot/usr/include/linux/netlink.h:5, from ../include/tst_netlink.h:14, from tst_crypto.c:13: x86_64-buildroot-linux-musl/sysroot/usr/include/linux/sysinfo.h:8:8: error: redefinition of ‘struct sysinfo’ struct sysinfo { ^~~~~~~ In file included from ../include/tst_safe_macros.h:15, from ../include/tst_test.h:93, from tst_crypto.c:11: x86_64-buildroot-linux-musl/sysroot/usr/include/sys/sysinfo.h:10:8: note: originally defined here Signed-off-by: Petr Vorel <petr.vorel@gmail.com> --- Hi, another MUSL specific workaround. I'm ok if we don't want to accept it. I also sent patch to kernel, but don't think it will be accepted. https://lore.kernel.org/linux-api/20201001211942.13336-1-petr.vorel@gmail.com/T/#me9d7d385157ec5f6288bae77d738a96c12ab8ca7 Kind regards, Petr include/lapi/sysinfo.h | 22 +++++++++++++++++++ include/tst_safe_macros.h | 2 +- lib/safe_macros.c | 2 +- lib/tst_memutils.c | 2 +- testcases/kernel/mem/mtest01/mtest01.c | 2 +- testcases/kernel/syscalls/madvise/madvise06.c | 2 +- testcases/kernel/syscalls/sysinfo/sysinfo01.c | 2 +- testcases/kernel/syscalls/sysinfo/sysinfo02.c | 2 +- testcases/kernel/syscalls/sysinfo/sysinfo03.c | 2 +- 9 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 include/lapi/sysinfo.h