Update kernel-features.h files for Linux 5.1
diff mbox series

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
Related show

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

Patch
diff mbox series

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