On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return; }
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org --- include/uapi/linux/sched/types.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/include/uapi/linux/sched/types.h b/include/uapi/linux/sched/types.h index c852153ddb0d3..1f10d935a63fe 100644 --- a/include/uapi/linux/sched/types.h +++ b/include/uapi/linux/sched/types.h @@ -4,9 +4,11 @@
#include <linux/types.h>
+#if defined(__KERNEL__) struct sched_param { int sched_priority; }; +#endif
#define SCHED_ATTR_SIZE_VER0 48 /* sizeof first published struct */ #define SCHED_ATTR_SIZE_VER1 56 /* add: util_{min,max} */
On Thu, May 21, 2020 at 11:53 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return;
}
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
If it is more preferable, another option is to move sched_param to include/linux/sched/types.h
- Joel
include/uapi/linux/sched/types.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/include/uapi/linux/sched/types.h b/include/uapi/linux/sched/types.h index c852153ddb0d3..1f10d935a63fe 100644 --- a/include/uapi/linux/sched/types.h +++ b/include/uapi/linux/sched/types.h @@ -4,9 +4,11 @@
#include <linux/types.h>
+#if defined(__KERNEL__) struct sched_param { int sched_priority; }; +#endif
#define SCHED_ATTR_SIZE_VER0 48 /* sizeof first published struct */
#define SCHED_ATTR_SIZE_VER1 56 /* add: util_{min,max} */
2.26.2.761.g0e0b3e54be-goog
On Thu, May 21, 2020 at 11:55:21AM -0400, Joel Fernandes wrote:
On Thu, May 21, 2020 at 11:53 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return;
}
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
If it is more preferable, another option is to move sched_param to include/linux/sched/types.h
Might it be worth Ccing libc-alpha here? Seems like one of those classic header conflicts.
Christian
On Fri, May 22, 2020 at 03:13:55PM +0200, Christian Brauner wrote:
On Thu, May 21, 2020 at 11:55:21AM -0400, Joel Fernandes wrote:
On Thu, May 21, 2020 at 11:53 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return;
}
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
If it is more preferable, another option is to move sched_param to include/linux/sched/types.h
Might it be worth Ccing libc-alpha here? Seems like one of those classic header conflicts.
sched_param is defined by POSIX from my reading of the manpage. Is the kernel supposed to define it in the UAPI at all? I guarded it with __KERNEL__ as you can see.
Resent with libc-alpha CC'd per your suggestion.
thanks,
- Joel
On Fri, May 22, 2020 at 09:38:16AM -0400, Joel Fernandes wrote:
On Fri, May 22, 2020 at 03:13:55PM +0200, Christian Brauner wrote:
On Thu, May 21, 2020 at 11:55:21AM -0400, Joel Fernandes wrote:
On Thu, May 21, 2020 at 11:53 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return;
}
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
If it is more preferable, another option is to move sched_param to include/linux/sched/types.h
Might it be worth Ccing libc-alpha here? Seems like one of those classic header conflicts.
sched_param is defined by POSIX from my reading of the manpage. Is the kernel supposed to define it in the UAPI at all? I guarded it with __KERNEL__ as you can see.
Your patch is fine of course. :) It's just that conflicts like this have happened before. Another conflict is e.g. in wait.h where the kernel has #define P_* and libc has an enum for P_* and it's not at all guaranteed that they are identical. Plus, sometimes the order of header inclusion matters because of things like this (or something like this). That's why having it seen on libc-alpha might help prevent accidentaly causing bugs where you now include a header that gives you a different definition than you expected.
Resent with libc-alpha CC'd per your suggestion.
Thanks!
Christian
On Thu, May 21, 2020 at 11:55:21AM -0400, Joel Fernandes wrote:
On Thu, May 21, 2020 at 11:53 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return;
}
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
If it is more preferable, another option is to move sched_param to include/linux/sched/types.h
Yeah, not sure. Ingo, you got a preference?
Also, this very much misses a Fixes tag.
On Fri, May 22, 2020 at 04:02:26PM +0200, Peter Zijlstra wrote:
On Thu, May 21, 2020 at 11:55:21AM -0400, Joel Fernandes wrote:
On Thu, May 21, 2020 at 11:53 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
On a modern Linux distro, compiling the following program fails: #include<stdlib.h> #include<stdint.h> #include<pthread.h> #include<linux/sched/types.h>
void main() { struct sched_attr sa;
return;
}
with: /usr/include/linux/sched/types.h:8:8: \ error: redefinition of ‘struct sched_param’ 8 | struct sched_param { | ^~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/sched.h:74, from /usr/include/sched.h:43, from /usr/include/pthread.h:23, from /tmp/s.c:4: /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h:23:8: note: originally defined here 23 | struct sched_param | ^~~~~~~~~~~
This is also causing a problem on using sched_attr Chrome. The issue is sched_param is already provided by glibc.
Guard the kernel's UAPI definition of sched_param with __KERNEL__ so that userspace can compile.
Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
If it is more preferable, another option is to move sched_param to include/linux/sched/types.h
Yeah, not sure. Ingo, you got a preference?
Also, this very much misses a Fixes tag.
Ok, will add Fixe: tag as follows:
Fixes: e2d1e2aec572a ("sched/headers: Move various ABI definitions to <uapi/linux/sched/types.h>")
thanks,
- Joel
linux-stable-mirror@lists.linaro.org