diff mbox series

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

Message ID 20230506184424.105501-1-pvorel@suse.cz
State Changes Requested
Headers show
Series [RFC,v2,1/1] lapi: Add sysinfo.h to fix build with older MUSL toolchain | expand

Commit Message

Petr Vorel May 6, 2023, 6:44 p.m. UTC
From: Petr Vorel <petr.vorel@gmail.com>

When building LTP with older MUSL based toolchains without kernel fix
a85cbe6159ff ("uapi: move constants from <linux/kernel.h> to <linux/const.h>")
from 5.11 build fails due indirect <linux/sysinfo.h> include when using
some network 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

a85cbe6159ff was merged into stable versions, but Buildroot projects
reports still older MUSL toolchains not using it. Therefore they asked
to require 5.11 headers for musl, which mean no LTP for many toolchains.

Signed-off-by: Petr Vorel <petr.vorel@gmail.com>
---
Hi,

I posted this patch 3 years ago [1]. Later my fix in kernel was merged,
but still Buildroot asks for this patch. I'm ok to maintain it
downstream, unless you are ok to have it in upstream LTP. I'm not sure
for how long it will be needed, at least now the official Buildroot MUSL
toolchains are 4.9 based.

Kind regards,
Petr

[1] https://lore.kernel.org/ltp/20201001231256.6930-1-petr.vorel@gmail.com/

 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 |  4 ++--
 .../interfaces/pthread_cond_broadcast/1-2.c   |  2 +-
 10 files changed, 32 insertions(+), 10 deletions(-)
 create mode 100644 include/lapi/sysinfo.h

Comments

Petr Vorel May 11, 2023, 7:31 p.m. UTC | #1
Hi all,

> diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo01.c b/testcases/kernel/syscalls/sysinfo/sysinfo01.c
> index 2ea44a2be..a237345ef 100644
> --- a/testcases/kernel/syscalls/sysinfo/sysinfo01.c
> +++ b/testcases/kernel/syscalls/sysinfo/sysinfo01.c
> @@ -69,7 +69,7 @@
>  #include <sys/types.h>
>  #include <sys/stat.h>
>  #include <sys/signal.h>
> -#include <sys/sysinfo.h>
> +#include "lapi/sysinfo.h"

NOTE: sysinfo0[1-3].c (and any new sysinfo test) will need to use
<sys/sysinfo.h> due sysinfo() signature in it (that's not in
<linux/sysinfo.h>).
Following fix would be needed for this patch. But as there is no
feedback, I don't even send v3.

Kind regards,
Petr

diff --git testcases/kernel/syscalls/sysinfo/sysinfo01.c
testcases/kernel/syscalls/sysinfo/sysinfo01.c
index a237345ef..2ea44a2be 100644
--- testcases/kernel/syscalls/sysinfo/sysinfo01.c
+++ testcases/kernel/syscalls/sysinfo/sysinfo01.c
@@ -69,7 +69,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/signal.h>
-#include "lapi/sysinfo.h"
+#include <sys/sysinfo.h>

 #include "test.h"

diff --git testcases/kernel/syscalls/sysinfo/sysinfo02.c
testcases/kernel/syscalls/sysinfo/sysinfo02.c
index 61fa1ab75..7ad0e8bdc 100644
--- testcases/kernel/syscalls/sysinfo/sysinfo02.c
+++ testcases/kernel/syscalls/sysinfo/sysinfo02.c
@@ -65,7 +65,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/signal.h>
-#include "lapi/sysinfo.h"
+#include <sys/sysinfo.h>
 #include <stdint.h>

 #include "test.h"
diff --git testcases/kernel/syscalls/sysinfo/sysinfo03.c
testcases/kernel/syscalls/sysinfo/sysinfo03.c
index 0b6ffb49b..13b0de806 100644
--- testcases/kernel/syscalls/sysinfo/sysinfo03.c
+++ testcases/kernel/syscalls/sysinfo/sysinfo03.c
@@ -14,9 +14,9 @@
  */

 #include "lapi/posix_clocks.h"
-#include "lapi/sched.h"
-#include "lapi/sysinfo.h"
+#include <sys/sysinfo.h>
 #include "tst_test.h"
+#include "lapi/sched.h"

 static int offsets[] = {
  10,
Yang Xu May 12, 2023, 7:53 a.m. UTC | #2
Hi Petr

Cyril has pointed that SYSINFO_H__ should be on the top of #ifndef 
SYSINFO_H__ three years ago[1].

#ifndef SYSINFO_H__
#define SYSINFO_H__

......

[1]https://lore.kernel.org/ltp/20201014143317.GC13224@yuki.lan/

> Hi all,
> 
>> diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo01.c b/testcases/kernel/syscalls/sysinfo/sysinfo01.c
>> index 2ea44a2be..a237345ef 100644
>> --- a/testcases/kernel/syscalls/sysinfo/sysinfo01.c
>> +++ b/testcases/kernel/syscalls/sysinfo/sysinfo01.c
>> @@ -69,7 +69,7 @@
>>   #include <sys/types.h>
>>   #include <sys/stat.h>
>>   #include <sys/signal.h>
>> -#include <sys/sysinfo.h>
>> +#include "lapi/sysinfo.h"
> 
> NOTE: sysinfo0[1-3].c (and any new sysinfo test) will need to use
> <sys/sysinfo.h> due sysinfo() signature in it (that's not in
> <linux/sysinfo.h>).
> Following fix would be needed for this patch. But as there is no
> feedback, I don't even send v3.
I guess it still will meet redefine erroron musl[2] because
tst_test.h- >#include "tst_safe_macros.h" -> <linux/sysinfo.h>  -> 
sysinfo struct
<sys/sysinfo.h> -> sysinfo struct
[2]http://git.musl-libc.org/cgit/musl/tree/include/sys/sysinfo.h

How about use <linux/sysinfo.h> directly and add signature in 
lapi/sysinfo.h?

Best Regards
Yang Xu
> 
> Kind regards,
> Petr
> 
> diff --git testcases/kernel/syscalls/sysinfo/sysinfo01.c
> testcases/kernel/syscalls/sysinfo/sysinfo01.c
> index a237345ef..2ea44a2be 100644
> --- testcases/kernel/syscalls/sysinfo/sysinfo01.c
> +++ testcases/kernel/syscalls/sysinfo/sysinfo01.c
> @@ -69,7 +69,7 @@
>   #include <sys/types.h>
>   #include <sys/stat.h>
>   #include <sys/signal.h>
> -#include "lapi/sysinfo.h"
> +#include <sys/sysinfo.h>
> 
>   #include "test.h"
> 
> diff --git testcases/kernel/syscalls/sysinfo/sysinfo02.c
> testcases/kernel/syscalls/sysinfo/sysinfo02.c
> index 61fa1ab75..7ad0e8bdc 100644
> --- testcases/kernel/syscalls/sysinfo/sysinfo02.c
> +++ testcases/kernel/syscalls/sysinfo/sysinfo02.c
> @@ -65,7 +65,7 @@
>   #include <sys/types.h>
>   #include <sys/stat.h>
>   #include <sys/signal.h>
> -#include "lapi/sysinfo.h"
> +#include <sys/sysinfo.h>
>   #include <stdint.h>
> 
>   #include "test.h"
> diff --git testcases/kernel/syscalls/sysinfo/sysinfo03.c
> testcases/kernel/syscalls/sysinfo/sysinfo03.c
> index 0b6ffb49b..13b0de806 100644
> --- testcases/kernel/syscalls/sysinfo/sysinfo03.c
> +++ testcases/kernel/syscalls/sysinfo/sysinfo03.c
> @@ -14,9 +14,9 @@
>    */
> 
>   #include "lapi/posix_clocks.h"
> -#include "lapi/sched.h"
> -#include "lapi/sysinfo.h"
> +#include <sys/sysinfo.h>
>   #include "tst_test.h"
> +#include "lapi/sched.h"
> 
>   static int offsets[] = {
>    10,
>
diff mbox series

Patch

diff --git a/include/lapi/sysinfo.h b/include/lapi/sysinfo.h
new file mode 100644
index 000000000..ab4e4c62a
--- /dev/null
+++ b/include/lapi/sysinfo.h
@@ -0,0 +1,22 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2023 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 0cf3d7878..43da18e2a 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 af6dd0716..e38ff1c43 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 <libgen.h>
 #include <limits.h>
@@ -22,6 +21,7 @@ 
 #include <malloc.h>
 #include <math.h>
 #include "lapi/fcntl.h"
+#include "lapi/sysinfo.h"
 #include "test.h"
 #include "safe_macros.h"
 
diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c
index 6fc9f6a93..a52b46a71 100644
--- a/lib/tst_memutils.c
+++ b/lib/tst_memutils.c
@@ -6,7 +6,7 @@ 
 #include <stdio.h>
 #include <unistd.h>
 #include <limits.h>
-#include <sys/sysinfo.h>
+#include "lapi/sysinfo.h"
 #include <stdlib.h>
 
 #define TST_NO_DEFAULT_MAIN
diff --git a/testcases/kernel/mem/mtest01/mtest01.c b/testcases/kernel/mem/mtest01/mtest01.c
index fb991ce8b..0fccd5405 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 be22318ea..32fdff740 100644
--- a/testcases/kernel/syscalls/madvise/madvise06.c
+++ b/testcases/kernel/syscalls/madvise/madvise06.c
@@ -46,7 +46,7 @@ 
 #include <errno.h>
 #include <stdio.h>
 #include <sys/mount.h>
-#include <sys/sysinfo.h>
+#include "lapi/sysinfo.h"
 #include "tst_test.h"
 
 #define CHUNK_SZ (400*1024*1024L)
diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo01.c b/testcases/kernel/syscalls/sysinfo/sysinfo01.c
index 2ea44a2be..a237345ef 100644
--- a/testcases/kernel/syscalls/sysinfo/sysinfo01.c
+++ b/testcases/kernel/syscalls/sysinfo/sysinfo01.c
@@ -69,7 +69,7 @@ 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/signal.h>
-#include <sys/sysinfo.h>
+#include "lapi/sysinfo.h"
 
 #include "test.h"
 
diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo02.c b/testcases/kernel/syscalls/sysinfo/sysinfo02.c
index 7ad0e8bdc..61fa1ab75 100644
--- a/testcases/kernel/syscalls/sysinfo/sysinfo02.c
+++ b/testcases/kernel/syscalls/sysinfo/sysinfo02.c
@@ -65,7 +65,7 @@ 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/signal.h>
-#include <sys/sysinfo.h>
+#include "lapi/sysinfo.h"
 #include <stdint.h>
 
 #include "test.h"
diff --git a/testcases/kernel/syscalls/sysinfo/sysinfo03.c b/testcases/kernel/syscalls/sysinfo/sysinfo03.c
index 6b8f0aef7..0b6ffb49b 100644
--- a/testcases/kernel/syscalls/sysinfo/sysinfo03.c
+++ b/testcases/kernel/syscalls/sysinfo/sysinfo03.c
@@ -13,10 +13,10 @@ 
 
  */
 
-#include <sys/sysinfo.h>
 #include "lapi/posix_clocks.h"
-#include "tst_test.h"
 #include "lapi/sched.h"
+#include "lapi/sysinfo.h"
+#include "tst_test.h"
 
 static int offsets[] = {
 	10,
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c
index 22e7c3638..572701f9f 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c
+++ b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_broadcast/1-2.c
@@ -43,7 +43,7 @@ 
 #include <sys/wait.h>
 #include <semaphore.h>
 #ifdef	__linux__
-#include <sys/sysinfo.h>
+#include "lapi/sysinfo.h"
 #endif
 
 #include "../testfrmw/testfrmw.h"