Re: [LTP] [RFC PATCH 1/1] lapi: Add sysinfo.h to fix build with MUSL libc

Petr Vorel
2023-04-27T18:54:45Z

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
>

--
Mailing list info: https://lists.linux.it/listinfo/ltp