diff mbox series

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

Message ID 20201001231256.6930-1-petr.vorel@gmail.com
State New
Headers show
Series [RFC,1/1] lapi: Add sysinfo.h to fix build with MUSL libc | expand

Commit Message

Petr Vorel Oct. 1, 2020, 11:12 p.m. UTC
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

Comments

Petr Vorel Oct. 1, 2020, 11:21 p.m. UTC | #1
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
Cyril Hrubis Oct. 14, 2020, 2:33 p.m. UTC | #2
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...
Petr Vorel Oct. 15, 2020, 7:06 p.m. UTC | #3
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
diff mbox series

Patch

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[] = {