diff mbox series

Update kernel-features.h files for Linux 5.1

Message ID alpine.DEB.2.21.1905092300170.12754@digraph.polyomino.org.uk
State New
Headers show
Series Update kernel-features.h files for Linux 5.1 | expand

Commit Message

Joseph Myers May 9, 2019, 11 p.m. UTC
Linux 5.1 adds missing syscalls to the syscall table for many Linux
kernel architectures.  This patch updates the kernel-features.h
headers accordingly.  I believe the statfs64 structure used by alpha
matches what the new kernel syscalls use, but that should be reviewed
carefully.

Tested with build-many-glibcs.py.

2019-05-09  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/alpha/kernel-features.h
	(__ASSUME_STATFS64): Only undefine if [__LINUX_KERNEL_VERSION <
	0x050100].
	* sysdeps/unix/sysv/linux/i386/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.
	* sysdeps/unix/sysv/linux/ia64/kernel-features.h (__ASSUME_STATX):
	Likewise.
	* sysdeps/unix/sysv/linux/m68k/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.
	* sysdeps/unix/sysv/linux/mips/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.
	* sysdeps/unix/sysv/linux/s390/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.
	* sysdeps/unix/sysv/linux/sh/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.
	(__ASSUME_STATX): Likewise.
	* sysdeps/unix/sysv/linux/sparc/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Likewise.

Comments

Stepan Golosunov May 10, 2019, 10:27 a.m. UTC | #1
09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
> Linux 5.1 adds missing syscalls to the syscall table for many Linux
> kernel architectures.  This patch updates the kernel-features.h
> headers accordingly.  I believe the statfs64 structure used by alpha
> matches what the new kernel syscalls use, but that should be reviewed
> carefully.
> 
> Tested with build-many-glibcs.py.

The newly added direct ipc syscalls are different from the old ones:

1. They do not accept IPC_64.  This means that __IPC_64 should be set
to zero when new syscalls are used.  And new syscalls can not be used
for compat functions like __old_semctl.

(Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
__ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
__old_msgctl currently?)

2. semtimedop does not exist on 32-bit ABIs.  They have
semtimedop_time64 instead.
(I also think that ipc with IPCOP_semtimedop was accidentally made to
behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
would be a kernel bug.)

> diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h
> index 3ac725b5a2..8610651346 100644
> --- a/sysdeps/unix/sysv/linux/i386/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h
> @@ -43,8 +43,10 @@
>  # undef __ASSUME_SENDTO_SYSCALL
>  #endif
>  
> -/* i686 only supports ipc syscall.  */
> -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* i686 only supports ipc syscall before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +#endif
>  
>  #undef __ASSUME_CLONE_DEFAULT
>  #define __ASSUME_CLONE_BACKWARDS	1

> diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> index 1976724362..1467474b8a 100644
> --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
> @@ -50,5 +50,7 @@
>  # undef __ASSUME_SET_ROBUST_LIST
>  #endif
>  
> -/* m68k only supports ipc syscall.  */
> -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* m68k only supports ipc syscall before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> index c341c3fa10..8114090913 100644
> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> @@ -31,8 +31,10 @@
>     pairs to start with an even-number register.  */
>  #if _MIPS_SIM == _ABIO32
>  # define __ASSUME_ALIGNED_REGISTER_PAIRS	1
> -/* mips32 only supports ipc syscall.  */
> -# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* mips32 only supports ipc syscall before 5.1.  */
> +# if __LINUX_KERNEL_VERSION < 0x050100
> +#  undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +# endif
>  
>  /* The o32 MIPS fadvise64 syscall behaves as fadvise64_64.  */
>  # define __ASSUME_FADVISE64_AS_64_64		1
> diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
> index 413a185db3..5924534c22 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
> @@ -44,8 +44,10 @@
>  
>  #include_next <kernel-features.h>
>  
> -/* powerpc only supports ipc syscall.  */
> -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* powerpc only supports ipc syscall before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +#endif
>  
>  #undef __ASSUME_CLONE_DEFAULT
>  #define __ASSUME_CLONE_BACKWARDS	1
> diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h
> index 8fdf38c454..dcbf1c7c53 100644
> --- a/sysdeps/unix/sysv/linux/s390/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h
> @@ -45,8 +45,10 @@
>  # undef __ASSUME_SENDTO_SYSCALL
>  #endif
>  
> -/* s390 only supports ipc syscall.  */
> -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* s390 only supports ipc syscall before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +#endif
>  
>  #undef __ASSUME_CLONE_DEFAULT
>  #define __ASSUME_CLONE_BACKWARDS2
> diff --git a/sysdeps/unix/sysv/linux/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h
> index 767df721b8..8532cccadd 100644
> --- a/sysdeps/unix/sysv/linux/sh/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h
> @@ -41,8 +41,10 @@
>     before the offset.  */
>  #define __ASSUME_PRW_DUMMY_ARG	1
>  
> -/* sh only supports ipc syscall.  */
> -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* sh only supports ipc syscall before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +#endif
>  
>  /* Support for several syscalls was added in 4.8.  */
>  #if __LINUX_KERNEL_VERSION < 0x040800

> diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> index f441bd811d..7b5db4af17 100644
> --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
> @@ -58,8 +58,10 @@
>  # undef __NR_pause
>  #endif
>  
> -/* sparc only supports ipc syscall.  */
> -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +/* sparc only supports ipc syscall before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
> +#endif
>  
>  /* Support for the renameat2 syscall was added in 3.16.  */
>  #if __LINUX_KERNEL_VERSION < 0x031000
Stepan Golosunov May 10, 2019, 1:19 p.m. UTC | #2
10.05.2019 в 14:27:13 +0400 Stepan Golosunov написал(а):
> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
> > Linux 5.1 adds missing syscalls to the syscall table for many Linux
> > kernel architectures.  This patch updates the kernel-features.h
> > headers accordingly.  I believe the statfs64 structure used by alpha
> > matches what the new kernel syscalls use, but that should be reviewed
> > carefully.
> > 
> > Tested with build-many-glibcs.py.
> 
> The newly added direct ipc syscalls are different from the old ones:
> 
> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
> to zero when new syscalls are used.  And new syscalls can not be used
> for compat functions like __old_semctl.
> 
> (Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
> __ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
> architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
> __old_msgctl currently?)
> 
> 2. semtimedop does not exist on 32-bit ABIs.  They have
> semtimedop_time64 instead.
> (I also think that ipc with IPCOP_semtimedop was accidentally made to
> behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> would be a kernel bug.)

And, after rereading
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0d6040d4681735dfc47565de288525de405a5c99

3. There is no semop. semtimedop(_time64)? should be used instead.
Adhemerval Zanella May 10, 2019, 3:07 p.m. UTC | #3
On 10/05/2019 07:27, Stepan Golosunov wrote:
> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
>> kernel architectures.  This patch updates the kernel-features.h
>> headers accordingly.  I believe the statfs64 structure used by alpha
>> matches what the new kernel syscalls use, but that should be reviewed
>> carefully.
>>
>> Tested with build-many-glibcs.py.
> 
> The newly added direct ipc syscalls are different from the old ones:
> 
> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
> to zero when new syscalls are used.  And new syscalls can not be used
> for compat functions like __old_semctl.

So it seems we will need to conditionally set __IPC_64 based on kernel
version. It also seems that our default value on generic ipc_priv.h
is not really expressing the kernel ABI.

> 
> (Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
> __ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
> architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
> __old_msgctl currently?)

The architectures that exports msgctl@GLIBC_2.0 as compat symbol are
alpha, i686, m68k, mips-o32, powerpc32, s390-32, and sparc32. And
from these one alpha currently is the only architecture that defines
__ASSUME_DIRECT_SYSVIPC_SYSCALLS. So it is buggy for alpha currently
and it would be for the aforementioned architectures once they
start to use wire-up syscall.


> 
> 2. semtimedop does not exist on 32-bit ABIs.  They have
> semtimedop_time64 instead.
> (I also think that ipc with IPCOP_semtimedop was accidentally made to
> behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> would be a kernel bug.)

So it seems we would need to either add an __ASSUME specific for semtimedop
to just enable wire-up calls if time64 is defined or add another pre-processor
check to see if __NR_semtimeop is defined as well.


To summarize, I think we need too:

1. Fix Linux msgctl compat function to remove __IPC64.

2. Move __IPC64 to kernel-feature.h and define it based on kernel version
   along with __ASSUME_DIRECT_SYSVIPC_SYSCALLS.

3. Only use wire-up semtimeop iff __NR_semtimedop is also defined.
Adhemerval Zanella May 10, 2019, 3:11 p.m. UTC | #4
On 10/05/2019 12:07, Adhemerval Zanella wrote:
> 
> 
> On 10/05/2019 07:27, Stepan Golosunov wrote:
>> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
>>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
>>> kernel architectures.  This patch updates the kernel-features.h
>>> headers accordingly.  I believe the statfs64 structure used by alpha
>>> matches what the new kernel syscalls use, but that should be reviewed
>>> carefully.
>>>
>>> Tested with build-many-glibcs.py.
>>
>> The newly added direct ipc syscalls are different from the old ones:
>>
>> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
>> to zero when new syscalls are used.  And new syscalls can not be used
>> for compat functions like __old_semctl.
> 
> So it seems we will need to conditionally set __IPC_64 based on kernel
> version. It also seems that our default value on generic ipc_priv.h
> is not really expressing the kernel ABI.
> 
>>
>> (Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
>> __ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
>> architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
>> __old_msgctl currently?)
> 
> The architectures that exports msgctl@GLIBC_2.0 as compat symbol are
> alpha, i686, m68k, mips-o32, powerpc32, s390-32, and sparc32. And
> from these one alpha currently is the only architecture that defines
> __ASSUME_DIRECT_SYSVIPC_SYSCALLS. So it is buggy for alpha currently
> and it would be for the aforementioned architectures once they
> start to use wire-up syscall.
> 
> 
>>
>> 2. semtimedop does not exist on 32-bit ABIs.  They have
>> semtimedop_time64 instead.
>> (I also think that ipc with IPCOP_semtimedop was accidentally made to
>> behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
>> would be a kernel bug.)
> 
> So it seems we would need to either add an __ASSUME specific for semtimedop
> to just enable wire-up calls if time64 is defined or add another pre-processor
> check to see if __NR_semtimeop is defined as well.
> 
> 
> To summarize, I think we need too:
> 
> 1. Fix Linux msgctl compat function to remove __IPC64.
> 
> 2. Move __IPC64 to kernel-feature.h and define it based on kernel version
>    along with __ASSUME_DIRECT_SYSVIPC_SYSCALLS.
> 
> 3. Only use wire-up semtimeop iff __NR_semtimedop is also defined.
> 

It seems semop would also need be handled this way.
Stepan Golosunov May 10, 2019, 4:15 p.m. UTC | #5
10.05.2019 в 12:11:22 -0300 Adhemerval Zanella написал:
> On 10/05/2019 12:07, Adhemerval Zanella wrote:
> > On 10/05/2019 07:27, Stepan Golosunov wrote:
> >> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
> >>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
> >>> kernel architectures.  This patch updates the kernel-features.h
> >>> headers accordingly.  I believe the statfs64 structure used by alpha
> >>> matches what the new kernel syscalls use, but that should be reviewed
> >>> carefully.
> >>>
> >>> Tested with build-many-glibcs.py.
> >>
> >> The newly added direct ipc syscalls are different from the old ones:
> >>
> >> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
> >> to zero when new syscalls are used.  And new syscalls can not be used
> >> for compat functions like __old_semctl.
> > 
> > So it seems we will need to conditionally set __IPC_64 based on kernel
> > version. It also seems that our default value on generic ipc_priv.h
> > is not really expressing the kernel ABI.
> > 
> >>
> >> (Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
> >> __ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
> >> architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
> >> __old_msgctl currently?)
> > 
> > The architectures that exports msgctl@GLIBC_2.0 as compat symbol are
> > alpha, i686, m68k, mips-o32, powerpc32, s390-32, and sparc32. And
> > from these one alpha currently is the only architecture that defines
> > __ASSUME_DIRECT_SYSVIPC_SYSCALLS. So it is buggy for alpha currently
> > and it would be for the aforementioned architectures once they
> > start to use wire-up syscall.
> > 
> > 
> >>
> >> 2. semtimedop does not exist on 32-bit ABIs.  They have
> >> semtimedop_time64 instead.
> >> (I also think that ipc with IPCOP_semtimedop was accidentally made to
> >> behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> >> would be a kernel bug.)
> > 
> > So it seems we would need to either add an __ASSUME specific for semtimedop
> > to just enable wire-up calls if time64 is defined or add another pre-processor
> > check to see if __NR_semtimeop is defined as well.
> > 
> > 
> > To summarize, I think we need too:
> > 
> > 1. Fix Linux msgctl compat function to remove __IPC64.
> > 
> > 2. Move __IPC64 to kernel-feature.h and define it based on kernel version
> >    along with __ASSUME_DIRECT_SYSVIPC_SYSCALLS.
> > 
> > 3. Only use wire-up semtimeop iff __NR_semtimedop is also defined.
> > 
> 
> It seems semop would also need be handled this way.

5. Ensure __old_msgctl, __old_semctl and __old_shmctl do not use
direct syscalls when __IPC64 is zero.
Adhemerval Zanella May 10, 2019, 4:40 p.m. UTC | #6
On 10/05/2019 13:15, Stepan Golosunov wrote:
> 10.05.2019 в 12:11:22 -0300 Adhemerval Zanella написал:
>> On 10/05/2019 12:07, Adhemerval Zanella wrote:
>>> On 10/05/2019 07:27, Stepan Golosunov wrote:
>>>> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
>>>>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
>>>>> kernel architectures.  This patch updates the kernel-features.h
>>>>> headers accordingly.  I believe the statfs64 structure used by alpha
>>>>> matches what the new kernel syscalls use, but that should be reviewed
>>>>> carefully.
>>>>>
>>>>> Tested with build-many-glibcs.py.
>>>>
>>>> The newly added direct ipc syscalls are different from the old ones:
>>>>
>>>> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
>>>> to zero when new syscalls are used.  And new syscalls can not be used
>>>> for compat functions like __old_semctl.
>>>
>>> So it seems we will need to conditionally set __IPC_64 based on kernel
>>> version. It also seems that our default value on generic ipc_priv.h
>>> is not really expressing the kernel ABI.
>>>
>>>>
>>>> (Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
>>>> __ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
>>>> architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
>>>> __old_msgctl currently?)
>>>
>>> The architectures that exports msgctl@GLIBC_2.0 as compat symbol are
>>> alpha, i686, m68k, mips-o32, powerpc32, s390-32, and sparc32. And
>>> from these one alpha currently is the only architecture that defines
>>> __ASSUME_DIRECT_SYSVIPC_SYSCALLS. So it is buggy for alpha currently
>>> and it would be for the aforementioned architectures once they
>>> start to use wire-up syscall.
>>>
>>>
>>>>
>>>> 2. semtimedop does not exist on 32-bit ABIs.  They have
>>>> semtimedop_time64 instead.
>>>> (I also think that ipc with IPCOP_semtimedop was accidentally made to
>>>> behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
>>>> would be a kernel bug.)
>>>
>>> So it seems we would need to either add an __ASSUME specific for semtimedop
>>> to just enable wire-up calls if time64 is defined or add another pre-processor
>>> check to see if __NR_semtimeop is defined as well.
>>>
>>>
>>> To summarize, I think we need too:
>>>
>>> 1. Fix Linux msgctl compat function to remove __IPC64.
>>>
>>> 2. Move __IPC64 to kernel-feature.h and define it based on kernel version
>>>    along with __ASSUME_DIRECT_SYSVIPC_SYSCALLS.
>>>
>>> 3. Only use wire-up semtimeop iff __NR_semtimedop is also defined.
>>>
>>
>> It seems semop would also need be handled this way.
> 
> 5. Ensure __old_msgctl, __old_semctl and __old_shmctl do not use
> direct syscalls when __IPC64 is zero.

Indeed, alpha cases prevents us to just use __NR_ipc in this case.
Joseph Myers May 13, 2019, 9:33 p.m. UTC | #7
On Fri, 10 May 2019, Stepan Golosunov wrote:

> The newly added direct ipc syscalls are different from the old ones:

Thanks for pointing this out.  Here's a revised patch version with the 
__ASSUME_DIRECT_SYSVIPC_SYSCALLS changes removed.


Update kernel-features.h files for Linux 5.1.

Linux 5.1 adds missing syscalls to the syscall table for many Linux
kernel architectures.  This patch updates the kernel-features.h
headers accordingly.  __ASSUME_DIRECT_SYSVIPC_SYSCALLS is not updated
because of the differences between new and old syscalls described in
<https://sourceware.org/ml/libc-alpha/2019-05/msg00235.html>.  I
believe the statfs64 structure used by alpha matches what the new
kernel syscalls use, but that should be reviewed carefully.

Tested with build-many-glibcs.py.

2019-05-13  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/alpha/kernel-features.h
	(__ASSUME_STATFS64): Only undefine if [__LINUX_KERNEL_VERSION <
	0x050100].
	* sysdeps/unix/sysv/linux/ia64/kernel-features.h (__ASSUME_STATX):
	Likewise.
	* sysdeps/unix/sysv/linux/sh/kernel-features.h
	(__ASSUME_STATX): Likewise.

diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
index f3298b234e..4a5d029c1d 100644
--- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
@@ -22,9 +22,11 @@
 
 #include_next <kernel-features.h>
 
-/* There never has been support for fstat64.  */
-#undef __ASSUME_STATFS64
-#define __ASSUME_STATFS64 0
+/* Support for statfs64 was added in 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_STATFS64
+# define __ASSUME_STATFS64 0
+#endif
 
 /* Alpha used to define SysV ipc shmat syscall with a different name.  */
 #ifndef __NR_shmat
diff --git a/sysdeps/unix/sysv/linux/ia64/kernel-features.h b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
index 0f4948b8e0..333947931d 100644
--- a/sysdeps/unix/sysv/linux/ia64/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
@@ -26,8 +26,10 @@
 #define __ASSUME_SEND_SYSCALL		1
 #define __ASSUME_ACCEPT4_SYSCALL	1
 
-/* No statx system call on ia64 yet.  */
-#undef __ASSUME_STATX
+/* Support for statx was added in 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_STATX
+#endif
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE2
diff --git a/sysdeps/unix/sysv/linux/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h
index 767df721b8..b11a5cb544 100644
--- a/sysdeps/unix/sysv/linux/sh/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h
@@ -52,7 +52,9 @@
 # undef __ASSUME_COPY_FILE_RANGE
 #endif
 
-/* sh does not support the statx system call.  */
-#undef __ASSUME_STATX
+/* sh does not support the statx system call before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_STATX
+#endif
 
 #endif
Arnd Bergmann May 16, 2019, 7:59 a.m. UTC | #8
On Fri, May 10, 2019 at 3:19 PM Stepan Golosunov <stepan@golosunov.pp.ru> wrote:
>
> 10.05.2019 в 14:27:13 +0400 Stepan Golosunov написал(а):
> > 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
> > > Linux 5.1 adds missing syscalls to the syscall table for many Linux
> > > kernel architectures.  This patch updates the kernel-features.h
> > > headers accordingly.  I believe the statfs64 structure used by alpha
> > > matches what the new kernel syscalls use, but that should be reviewed
> > > carefully.
> > >
> > > Tested with build-many-glibcs.py.
> >
> > The newly added direct ipc syscalls are different from the old ones:
> >
> > 1. They do not accept IPC_64.  This means that __IPC_64 should be set
> > to zero when new syscalls are used.  And new syscalls can not be used
> > for compat functions like __old_semctl.

Correct, the idea is that we can stop passing that flag on most architectures
when a C library only supports new kernels.

I expect that glibc will start using the direct system calls in 5 to 10 years,
once it stops running on linux-5.0 and earlier. Until then, the easiest way
is to keep using the ipc() wrapper.

> > (Hmm.  Is __old_msgctl already buggy due to its use of __IPC_64 when
> > __ASSUME_DIRECT_SYSVIPC_SYSCALLS is defined?  Is there any
> > architecture with both __ASSUME_DIRECT_SYSVIPC_SYSCALLS and
> > __old_msgctl currently?)

My spreadsheet [1] tells me that mips-n32, mips-n64, alpha, arm, microblaze
and xtensa all provide the direct syscalls traditionally but require passing
__IPC_64 for historic reasons. Out of these, only arm-oabi (no longer supported
in glibc) also has sys_ipc().
It would have been nice to change that, but it seemed not worth adding another
set of IPC syscalls for these.

> > 2. semtimedop does not exist on 32-bit ABIs.  They have
> > semtimedop_time64 instead.

Right, we had a long debate over that, and in the end I decided not to
add two versions of semtimedop() to keep the ABI more compact.

> > (I also think that ipc with IPCOP_semtimedop was accidentally made to
> > behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> > would be a kernel bug.)

Can you elaborate? The code I see in mainline is

        case SEMTIMEDOP:
                if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
                        return ksys_semtimedop(first, ptr, second,
                                (const struct __kernel_timespec __user *)fifth);
                else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
                        return compat_ksys_semtimedop(first, ptr, second,
                                (const struct old_timespec32 __user *)fifth);
                else
                        return -ENOSYS;

Since both CONFIG_64BIT_TIME and CONFIG_COMPAT_32BIT_TIME
are always set on 32-bit architectures, SEMTIMEDOP passes
an old_timespec32 argument here. Am I missing something?

> And, after rereading
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0d6040d4681735dfc47565de288525de405a5c99
>
> 3. There is no semop. semtimedop(_time64)? should be used instead.

Right.

      Arnd

[1] https://docs.google.com/spreadsheets/d/1QxMvW5jpVG2jb4RM9CQQl27-wVpNYOa-_3K2RVKifb0/edit#gid=0
Arnd Bergmann May 16, 2019, 8:08 a.m. UTC | #9
On Fri, May 10, 2019 at 5:07 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 10/05/2019 07:27, Stepan Golosunov wrote:
> > 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
> >> Linux 5.1 adds missing syscalls to the syscall table for many Linux
> >> kernel architectures.  This patch updates the kernel-features.h
> >> headers accordingly.  I believe the statfs64 structure used by alpha
> >> matches what the new kernel syscalls use, but that should be reviewed
> >> carefully.
> >>
> >> Tested with build-many-glibcs.py.
> >
> > The newly added direct ipc syscalls are different from the old ones:
> >
> > 1. They do not accept IPC_64.  This means that __IPC_64 should be set
> > to zero when new syscalls are used.  And new syscalls can not be used
> > for compat functions like __old_semctl.
>
> So it seems we will need to conditionally set __IPC_64 based on kernel
> version.

How so? I did not expect to see any libc change here at all, unless
you mean after you stop using sys_ipc().

> It also seems that our default value on generic ipc_priv.h
> is not really expressing the kernel ABI.

Right, it should only be set for historic ABIs.

> > 2. semtimedop does not exist on 32-bit ABIs.  They have
> > semtimedop_time64 instead.
> > (I also think that ipc with IPCOP_semtimedop was accidentally made to
> > behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> > would be a kernel bug.)
>
> So it seems we would need to either add an __ASSUME specific for semtimedop
> to just enable wire-up calls if time64 is defined or add another pre-processor
> check to see if __NR_semtimeop is defined as well.

The implementation I expected to see here is to have the
64-bit time_t version of semtimedop() to call the direct semtimedop_time64()
system call, and fall back to the existing implementation if that
returns -ENOSYS and the libc is built to support old kernels.

        Arnd
Adhemerval Zanella May 16, 2019, 11:15 a.m. UTC | #10
On 16/05/2019 05:08, Arnd Bergmann wrote:
> On Fri, May 10, 2019 at 5:07 PM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> On 10/05/2019 07:27, Stepan Golosunov wrote:
>>> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
>>>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
>>>> kernel architectures.  This patch updates the kernel-features.h
>>>> headers accordingly.  I believe the statfs64 structure used by alpha
>>>> matches what the new kernel syscalls use, but that should be reviewed
>>>> carefully.
>>>>
>>>> Tested with build-many-glibcs.py.
>>>
>>> The newly added direct ipc syscalls are different from the old ones:
>>>
>>> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
>>> to zero when new syscalls are used.  And new syscalls can not be used
>>> for compat functions like __old_semctl.
>>
>> So it seems we will need to conditionally set __IPC_64 based on kernel
>> version.
> 
> How so? I did not expect to see any libc change here at all, unless
> you mean after you stop using sys_ipc().

The idea is if user configure a minimum kernel version of v5.1,
sysvipc would use wire-up syscalls.  So for sys_ipc the affected
architectures calls with required IPC_64, and for wire-up syscalls
IPC_64 is redefined accordingly. 

> 
>> It also seems that our default value on generic ipc_priv.h
>> is not really expressing the kernel ABI.
> 
> Right, it should only be set for historic ABIs.
> 
>>> 2. semtimedop does not exist on 32-bit ABIs.  They have
>>> semtimedop_time64 instead.
>>> (I also think that ipc with IPCOP_semtimedop was accidentally made to
>>> behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
>>> would be a kernel bug.)
>>
>> So it seems we would need to either add an __ASSUME specific for semtimedop
>> to just enable wire-up calls if time64 is defined or add another pre-processor
>> check to see if __NR_semtimeop is defined as well.
> 
> The implementation I expected to see here is to have the
> 64-bit time_t version of semtimedop() to call the direct semtimedop_time64()
> system call, and fall back to the existing implementation if that
> returns -ENOSYS and the libc is built to support old kernels.

I am not taking in consideration 64-bit time_t adjustments here.
Arnd Bergmann May 16, 2019, 11:34 a.m. UTC | #11
On Thu, May 16, 2019 at 1:15 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 16/05/2019 05:08, Arnd Bergmann wrote:
> > On Fri, May 10, 2019 at 5:07 PM Adhemerval Zanella
> > <adhemerval.zanella@linaro.org> wrote:
> >> On 10/05/2019 07:27, Stepan Golosunov wrote:
> >>> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
> >>>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
> >>>> kernel architectures.  This patch updates the kernel-features.h
> >>>> headers accordingly.  I believe the statfs64 structure used by alpha
> >>>> matches what the new kernel syscalls use, but that should be reviewed
> >>>> carefully.
> >>>>
> >>>> Tested with build-many-glibcs.py.
> >>>
> >>> The newly added direct ipc syscalls are different from the old ones:
> >>>
> >>> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
> >>> to zero when new syscalls are used.  And new syscalls can not be used
> >>> for compat functions like __old_semctl.
> >>
> >> So it seems we will need to conditionally set __IPC_64 based on kernel
> >> version.
> >
> > How so? I did not expect to see any libc change here at all, unless
> > you mean after you stop using sys_ipc().
>
> The idea is if user configure a minimum kernel version of v5.1,
> sysvipc would use wire-up syscalls.  So for sys_ipc the affected
> architectures calls with required IPC_64, and for wire-up syscalls
> IPC_64 is redefined accordingly.

Ah, I see. Is there any real advantage in doing this now though?
It seems to save a few cycles for each of those syscalls when building
for linux-5.1+, but the cost is a significant increase in source code
complexity.

      Arnd
Adhemerval Zanella May 16, 2019, 12:28 p.m. UTC | #12
On 16/05/2019 08:34, Arnd Bergmann wrote:
> On Thu, May 16, 2019 at 1:15 PM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> On 16/05/2019 05:08, Arnd Bergmann wrote:
>>> On Fri, May 10, 2019 at 5:07 PM Adhemerval Zanella
>>> <adhemerval.zanella@linaro.org> wrote:
>>>> On 10/05/2019 07:27, Stepan Golosunov wrote:
>>>>> 09.05.2019 в 23:00:37 +0000 Joseph Myers написал:
>>>>>> Linux 5.1 adds missing syscalls to the syscall table for many Linux
>>>>>> kernel architectures.  This patch updates the kernel-features.h
>>>>>> headers accordingly.  I believe the statfs64 structure used by alpha
>>>>>> matches what the new kernel syscalls use, but that should be reviewed
>>>>>> carefully.
>>>>>>
>>>>>> Tested with build-many-glibcs.py.
>>>>>
>>>>> The newly added direct ipc syscalls are different from the old ones:
>>>>>
>>>>> 1. They do not accept IPC_64.  This means that __IPC_64 should be set
>>>>> to zero when new syscalls are used.  And new syscalls can not be used
>>>>> for compat functions like __old_semctl.
>>>>
>>>> So it seems we will need to conditionally set __IPC_64 based on kernel
>>>> version.
>>>
>>> How so? I did not expect to see any libc change here at all, unless
>>> you mean after you stop using sys_ipc().
>>
>> The idea is if user configure a minimum kernel version of v5.1,
>> sysvipc would use wire-up syscalls.  So for sys_ipc the affected
>> architectures calls with required IPC_64, and for wire-up syscalls
>> IPC_64 is redefined accordingly.
> 
> Ah, I see. Is there any real advantage in doing this now though?
> It seems to save a few cycles for each of those syscalls when building
> for linux-5.1+, but the cost is a significant increase in source code
> complexity.

Not really, however it gave me opportunity to clean up the sysvipc code a bit
more. I changed the __IPC_64 default value to 0x0, which simplifies a bit
new ports additions (no need to override the value); consolidates some
implementation a bit more (s390 is an outlier regarding semtimedop); and
we spot an compat issues on alpha.

I am just checking everthing is ok on a 5.1 kernel before send it to
review.
Arnd Bergmann May 16, 2019, 12:42 p.m. UTC | #13
On Thu, May 16, 2019 at 2:28 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 16/05/2019 08:34, Arnd Bergmann wrote:
> > On Thu, May 16, 2019 at 1:15 PM Adhemerval Zanella
> > <adhemerval.zanella@linaro.org> wrote:
> >> On 16/05/2019 05:08, Arnd Bergmann wrote:
> >>> On Fri, May 10, 2019 at 5:07 PM Adhemerval Zanella
> >>> How so? I did not expect to see any libc change here at all, unless
> >>> you mean after you stop using sys_ipc().
> >>
> >> The idea is if user configure a minimum kernel version of v5.1,
> >> sysvipc would use wire-up syscalls.  So for sys_ipc the affected
> >> architectures calls with required IPC_64, and for wire-up syscalls
> >> IPC_64 is redefined accordingly.
> >
> > Ah, I see. Is there any real advantage in doing this now though?
> > It seems to save a few cycles for each of those syscalls when building
> > for linux-5.1+, but the cost is a significant increase in source code
> > complexity.
>
> Not really, however it gave me opportunity to clean up the sysvipc code a bit
> more. I changed the __IPC_64 default value to 0x0, which simplifies a bit
> new ports additions (no need to override the value); consolidates some
> implementation a bit more (s390 is an outlier regarding semtimedop); and
> we spot an compat issues on alpha.

Ok, fair enough. Too bad this didn't come up during the review of
the kernel patches, I could probably have kept the IPC_64 flag
for the separate calls on mips/alpha/arm/microblaze/xtensa to make
it easier for you.

      Arnd
Adhemerval Zanella May 16, 2019, 3:06 p.m. UTC | #14
On 13/05/2019 18:33, Joseph Myers wrote:
> On Fri, 10 May 2019, Stepan Golosunov wrote:
> 
>> The newly added direct ipc syscalls are different from the old ones:
> 
> Thanks for pointing this out.  Here's a revised patch version with the 
> __ASSUME_DIRECT_SYSVIPC_SYSCALLS changes removed.
> 
> 
> Update kernel-features.h files for Linux 5.1.
> 
> Linux 5.1 adds missing syscalls to the syscall table for many Linux
> kernel architectures.  This patch updates the kernel-features.h
> headers accordingly.  __ASSUME_DIRECT_SYSVIPC_SYSCALLS is not updated
> because of the differences between new and old syscalls described in
> <https://sourceware.org/ml/libc-alpha/2019-05/msg00235.html>.  I
> believe the statfs64 structure used by alpha matches what the new
> kernel syscalls use, but that should be reviewed carefully.
> 
> Tested with build-many-glibcs.py.

LGTM.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>

> 
> 2019-05-13  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* sysdeps/unix/sysv/linux/alpha/kernel-features.h
> 	(__ASSUME_STATFS64): Only undefine if [__LINUX_KERNEL_VERSION <
> 	0x050100].
> 	* sysdeps/unix/sysv/linux/ia64/kernel-features.h (__ASSUME_STATX):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/sh/kernel-features.h
> 	(__ASSUME_STATX): Likewise.
> 
> diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> index f3298b234e..4a5d029c1d 100644
> --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> @@ -22,9 +22,11 @@
>  
>  #include_next <kernel-features.h>
>  
> -/* There never has been support for fstat64.  */
> -#undef __ASSUME_STATFS64
> -#define __ASSUME_STATFS64 0
> +/* Support for statfs64 was added in 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_STATFS64
> +# define __ASSUME_STATFS64 0
> +#endif

Ok, alpha statfs64 used on syscall entry points defines the structure as

--
typedef unsigned int __u32;
__extension__ typedef unsigned long long __u64;

typedef struct {
 int val[2];
} __kernel_fsid_t;

struct statfs64 {
 __u32 f_type;
 __u32 f_bsize;
 __u64 f_blocks;
 __u64 f_bfree;
 __u64 f_bavail;
 __u64 f_files;
 __u64 f_ffree;
 __kernel_fsid_t f_fsid;
 __u32 f_namelen;
 __u32 f_frsize;
 __u32 f_flags;
 __u32 f_spare[4];
} ;
--

While glibc does:

--

#define __S64_TYPE             long int
#define __FSBLKCNT64_T_TYPE    __S64_TYPE
__STD_TYPE __FSBLKCNT64_T_TYPE __fsblkcnt64_t;

#define __FSID_T_TYPE          struct { int __val[2]; }
__STD_TYPE __FSID_T_TYPE       __fsid_t;

struct statfs64
  { 
    int f_type;
    int f_bsize;
    __fsblkcnt64_t f_blocks;
    __fsblkcnt64_t f_bfree;
    __fsblkcnt64_t f_bavail;
    __fsfilcnt64_t f_files;
    __fsfilcnt64_t f_ffree;
    __fsid_t f_fsid;
    int f_namelen;
    int f_frsize;
    int f_flags;
    int f_spare[4];
  };
--

My understanding is __u64 and __fsblkcnt64_t should have identical sizes on
alpha.

>  
>  /* Alpha used to define SysV ipc shmat syscall with a different name.  */
>  #ifndef __NR_shmat
> diff --git a/sysdeps/unix/sysv/linux/ia64/kernel-features.h b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> index 0f4948b8e0..333947931d 100644
> --- a/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> @@ -26,8 +26,10 @@
>  #define __ASSUME_SEND_SYSCALL		1
>  #define __ASSUME_ACCEPT4_SYSCALL	1
>  
> -/* No statx system call on ia64 yet.  */
> -#undef __ASSUME_STATX
> +/* Support for statx was added in 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_STATX
> +#endif
>  
>  #undef __ASSUME_CLONE_DEFAULT
>  #define __ASSUME_CLONE2

Ok (commit 7349ee3a97edbec60ada97e81b26b9c20e96156b).

> diff --git a/sysdeps/unix/sysv/linux/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h
> index 767df721b8..b11a5cb544 100644
> --- a/sysdeps/unix/sysv/linux/sh/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h
> @@ -52,7 +52,9 @@
>  # undef __ASSUME_COPY_FILE_RANGE
>  #endif
>  
> -/* sh does not support the statx system call.  */
> -#undef __ASSUME_STATX
> +/* sh does not support the statx system call before 5.1.  */
> +#if __LINUX_KERNEL_VERSION < 0x050100
> +# undef __ASSUME_STATX
> +#endif
>  
>  #endif
> 

Ok (commit d25a122afd4374071bb8489a980051da37136ee1).
Stepan Golosunov May 16, 2019, 7:41 p.m. UTC | #15
16.05.2019 в 09:59:40 +0200 Arnd Bergmann написал:
> On Fri, May 10, 2019 at 3:19 PM Stepan Golosunov <stepan@golosunov.pp.ru> wrote:
> > > (I also think that ipc with IPCOP_semtimedop was accidentally made to
> > > behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> > > would be a kernel bug.)
> 
> Can you elaborate? The code I see in mainline is
> 
>         case SEMTIMEDOP:
>                 if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
>                         return ksys_semtimedop(first, ptr, second,
>                                 (const struct __kernel_timespec __user *)fifth);
>                 else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
>                         return compat_ksys_semtimedop(first, ptr, second,
>                                 (const struct old_timespec32 __user *)fifth);
>                 else
>                         return -ENOSYS;
> 
> Since both CONFIG_64BIT_TIME and CONFIG_COMPAT_32BIT_TIME
> are always set on 32-bit architectures, SEMTIMEDOP passes
> an old_timespec32 argument here. Am I missing something?

If CONFIG_64BIT_TIME is set then there is no problem.  But I do not
see where it is set.  (The patch to set it to y was merged only now
and is not in 5.1.)  And if it's not set, then ipc and socketcall are
broken.
Arnd Bergmann May 16, 2019, 8:56 p.m. UTC | #16
On Thu, May 16, 2019 at 9:41 PM Stepan Golosunov <stepan@golosunov.pp.ru> wrote:
>
> 16.05.2019 в 09:59:40 +0200 Arnd Bergmann написал:
> > On Fri, May 10, 2019 at 3:19 PM Stepan Golosunov <stepan@golosunov.pp.ru> wrote:
> > > > (I also think that ipc with IPCOP_semtimedop was accidentally made to
> > > > behave like semtimedop_time64 in 32-bit builds of linux 5.1.  But that
> > > > would be a kernel bug.)
> >
> > Can you elaborate? The code I see in mainline is
> >
> >         case SEMTIMEDOP:
> >                 if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
> >                         return ksys_semtimedop(first, ptr, second,
> >                                 (const struct __kernel_timespec __user *)fifth);
> >                 else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
> >                         return compat_ksys_semtimedop(first, ptr, second,
> >                                 (const struct old_timespec32 __user *)fifth);
> >                 else
> >                         return -ENOSYS;
> >
> > Since both CONFIG_64BIT_TIME and CONFIG_COMPAT_32BIT_TIME
> > are always set on 32-bit architectures, SEMTIMEDOP passes
> > an old_timespec32 argument here. Am I missing something?
>
> If CONFIG_64BIT_TIME is set then there is no problem.  But I do not
> see where it is set.  (The patch to set it to y was merged only now
> and is not in 5.1.)  And if it's not set, then ipc and socketcall are
> broken.

Oh, I see it now. So the bug was actually much worse than I thought, since
we did not enable CONFIG_64BIT_TIME at all, only
CONFIG_COMPAT_32BIT_TIME. I assumed that only the nanosecond
mangling in compat mode was broken.

The problem is that in commit 00bf25d693e7 ("y2038: use time32 syscall
names on 32-bit"), I turned on CONFIG_COMPAT_32BIT_TIME
unconditionally, when I should have turned on CONFIG_64BIT_TIME
or ARCH_HAS_64BIT_TIME instead.

So indeed both ipc(SEMTIMEDOP, ...) and socketcall(SYS_RECVMMSG, ...)
are broken in linux-5.1 with 32-bit architectures. My testing failed to
catch those because I used a musl libc as a base that was already using
semtimedop() and recvmmsg() as direct syscalls, and those are not
affected.

The fix has made it into mainline now for v5.2-rc1, but not yet v5.1.y.

Greg, can you add this commit for the next v5.1.y stable kernel to
fix the regression?

f3d964673b2f ("y2038: Make CONFIG_64BIT_TIME unconditional")

      Arnd
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
index f3298b234e..4a5d029c1d 100644
--- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
@@ -22,9 +22,11 @@ 
 
 #include_next <kernel-features.h>
 
-/* There never has been support for fstat64.  */
-#undef __ASSUME_STATFS64
-#define __ASSUME_STATFS64 0
+/* Support for statfs64 was added in 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_STATFS64
+# define __ASSUME_STATFS64 0
+#endif
 
 /* Alpha used to define SysV ipc shmat syscall with a different name.  */
 #ifndef __NR_shmat
diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h
index 3ac725b5a2..8610651346 100644
--- a/sysdeps/unix/sysv/linux/i386/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h
@@ -43,8 +43,10 @@ 
 # undef __ASSUME_SENDTO_SYSCALL
 #endif
 
-/* i686 only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* i686 only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#endif
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE_BACKWARDS	1
diff --git a/sysdeps/unix/sysv/linux/ia64/kernel-features.h b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
index 0f4948b8e0..333947931d 100644
--- a/sysdeps/unix/sysv/linux/ia64/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
@@ -26,8 +26,10 @@ 
 #define __ASSUME_SEND_SYSCALL		1
 #define __ASSUME_ACCEPT4_SYSCALL	1
 
-/* No statx system call on ia64 yet.  */
-#undef __ASSUME_STATX
+/* Support for statx was added in 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_STATX
+#endif
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE2
diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
index 1976724362..1467474b8a 100644
--- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
@@ -50,5 +50,7 @@ 
 # undef __ASSUME_SET_ROBUST_LIST
 #endif
 
-/* m68k only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* m68k only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
index c341c3fa10..8114090913 100644
--- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
@@ -31,8 +31,10 @@ 
    pairs to start with an even-number register.  */
 #if _MIPS_SIM == _ABIO32
 # define __ASSUME_ALIGNED_REGISTER_PAIRS	1
-/* mips32 only supports ipc syscall.  */
-# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* mips32 only supports ipc syscall before 5.1.  */
+# if __LINUX_KERNEL_VERSION < 0x050100
+#  undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# endif
 
 /* The o32 MIPS fadvise64 syscall behaves as fadvise64_64.  */
 # define __ASSUME_FADVISE64_AS_64_64		1
diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
index 413a185db3..5924534c22 100644
--- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
@@ -44,8 +44,10 @@ 
 
 #include_next <kernel-features.h>
 
-/* powerpc only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* powerpc only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#endif
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE_BACKWARDS	1
diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h
index 8fdf38c454..dcbf1c7c53 100644
--- a/sysdeps/unix/sysv/linux/s390/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h
@@ -45,8 +45,10 @@ 
 # undef __ASSUME_SENDTO_SYSCALL
 #endif
 
-/* s390 only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* s390 only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#endif
 
 #undef __ASSUME_CLONE_DEFAULT
 #define __ASSUME_CLONE_BACKWARDS2
diff --git a/sysdeps/unix/sysv/linux/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h
index 767df721b8..8532cccadd 100644
--- a/sysdeps/unix/sysv/linux/sh/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h
@@ -41,8 +41,10 @@ 
    before the offset.  */
 #define __ASSUME_PRW_DUMMY_ARG	1
 
-/* sh only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* sh only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#endif
 
 /* Support for several syscalls was added in 4.8.  */
 #if __LINUX_KERNEL_VERSION < 0x040800
@@ -52,7 +54,9 @@ 
 # undef __ASSUME_COPY_FILE_RANGE
 #endif
 
-/* sh does not support the statx system call.  */
-#undef __ASSUME_STATX
+/* sh does not support the statx system call before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_STATX
+#endif
 
 #endif
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
index f441bd811d..7b5db4af17 100644
--- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
@@ -58,8 +58,10 @@ 
 # undef __NR_pause
 #endif
 
-/* sparc only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+/* sparc only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+#endif
 
 /* Support for the renameat2 syscall was added in 3.16.  */
 #if __LINUX_KERNEL_VERSION < 0x031000