This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Fix __ASSUME_RECVMMSG issues (bug 16610)
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, libc-alpha at sourceware dot org
- Cc: Chris Metcalf <cmetcalf at tilera dot com>
- Date: Thu, 20 Feb 2014 11:09:59 -0300
- Subject: Re: Fix __ASSUME_RECVMMSG issues (bug 16610)
- Authentication-results: sourceware.org; auth=none
- References: <Pine dot LNX dot 4 dot 64 dot 1402200038330 dot 5004 at digraph dot polyomino dot org dot uk>
This patch is ok, at least of powerpc. Thanks.
On 19-02-2014 21:42, Joseph S. Myers wrote:
> Similar to the issues for accept4, __ASSUME_RECVMMSG is also confused
> about whether it relates to function availability or socketcall
> operation availability; this is now bug 16610.
>
> Nothing actually tests __ASSUME_RECVMMSG for function availability,
> but implicit in the definition in kernel-features.h is the idea that
> it makes sense when the syscall is available and socketcall is not
> being used. As with accept4, there are architectures where the
> syscall was added later than the socketcall operation, meaning that
> assuming glibc is built with recent enough kernel headers, it does not
> attempt to use socketcall for these operations and __ASSUME_RECVMMSG
> gets defined for kernels >= 2.6.33 even when the syscall was only
> added later.
>
> This patch, relative to a tree with
> <https://sourceware.org/ml/libc-alpha/2014-02/msg00553.html> applied,
> splits the macro into separate macros like those used for accept4;
> having similar macro structure in both cases (and for sendmmsg once
> I've dealt with that) seems likely to be less confusing than having a
> different structure on the basis of nothing actually needing to assume
> the recvmmsg function works. Appropriate definitions are added for
> all architectures.
>
> Architecture-specific note: Tile's kernel-features.h says "TILE glibc
> support starts with 2.6.36", which is accurate in that 2.6.36 was the
> first kernel version with Tile support, and on that basis I've made
> that header define __ASSUME_RECVMMSG_SYSCALL unconditionally.
> However, Tile's configure.ac has arch_minimum_kernel=2.6.32. Since
> arch_minimum_kernel is meant to reflect only kernel.org kernel
> versions, I think that should change to 2.6.36. (If using glibc with
> kernel versions from before a port went in kernel.org, it's your
> responsibility to change arch_minimum_kernel in a local patch, and at
> the same time to adjust any __ASSUME_* definitions that may not be
> correct for your older kernel; for developing the official glibc it
> should only ever be necessary to consider what official kernel.org
> releases support.)
>
> Tested x86_64, including that disassembly of the installed shared
> libraries is unchanged by this patch.
>
> 2014-02-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020621 && __ASSUME_SOCKETCALL]
> (__ASSUME_RECVMMSG_SOCKETCALL): Define.
> [(__LINUX_KERNEL_VERSION >= 0x020621 && (__i386__ || __x86_64__ ||
> __sparc__)) || (__LINUX_KERNEL_VERSION >= 0x020625 && (__powerpc__
> || __sh__))] (__ASSUME_RECVMMSG_SYSCALL): Likewise.
> [__i386__ || __sparc__]
> (__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
> [__ASSUME_RECVMMSG_SOCKETCALL || __ASSUME_RECVMMSG_SYSCALL]
> (__ASSUME_RECVMMSG): Define instead of using previous
> [__LINUX_KERNEL_VERSION >= 0x020621] condition.
> * sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> (__ASSUME_RECVMMSG_SYSCALL): Define.
> * sysdeps/unix/sysv/linux/alpha/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/arm/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/ia64/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/internal_recvmmsg.S [__ASSUME_SOCKETCALL
> && !__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL &&
> !__ASSUME_RECVMMSG_SYSCALL] (__NR_recvmmsg): Undefine.
> [__ASSUME_RECVMMSG]: Change condition to
> [__ASSUME_RECVMMSG_SOCKETCALL].
> * sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
> Define.
> (__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
> * sysdeps/unix/sysv/linux/mips/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020621] (__ASSUME_RECVMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/recvmmsg.c [__ASSUME_SOCKETCALL &&
> !__ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL &&
> !__ASSUME_RECVMMSG_SYSCALL] (__NR_recvmmsg): Undefine.
> [!__ASSUME_RECVMMSG]: Change condition to
> [!__ASSUME_RECVMMSG_SOCKETCALL].
> * sysdeps/unix/sysv/linux/tile/kernel-features.h
> (__ASSUME_RECVMMSG_SYSCALL): Define.
>
> ports/ChangeLog.hppa:
> 2014-02-20 Joseph Myers <joseph@codesourcery.com>
>
> * sysdeps/unix/sysv/linux/hppa/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x020622] (__ASSUME_RECVMMSG_SYSCALL):
> Define.
>
> diff --git a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> index b8abd08..75e1999 100644
> --- a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> +++ b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> @@ -30,9 +30,10 @@
> /* PA-RISC 2.6.9 kernels had the first LWS CAS support */
> #define __ASSUME_LWS_CAS 1
>
> -/* Support for the accept4 syscall was added in 2.6.34. */
> +/* Support for the accept4 and recvmmsg syscalls was added in 2.6.34. */
> #if __LINUX_KERNEL_VERSION >= 0x020622
> # define __ASSUME_ACCEPT4_SYSCALL 1
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> #endif
>
> #include_next <kernel-features.h>
> diff --git a/sysdeps/unix/sysv/linux/aarch64/kernel-features.h b/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> index 222b61c..3f9cd04 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> @@ -30,6 +30,7 @@
> #define __ASSUME_IN_NONBLOCK 1
> #define __ASSUME_O_CLOEXEC 1
> #define __ASSUME_PIPE2 1
> +#define __ASSUME_RECVMMSG_SYSCALL 1
> #define __ASSUME_SIGNALFD4 1
> #define __ASSUME_SOCK_CLOEXEC 1
> #define __ASSUME_UTIMES 1
> diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> index 8cceb34..6e4a515 100644
> --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> @@ -42,6 +42,11 @@
> # define __ASSUME_SIGNALFD4 1
> #endif
>
> +/* Support for recvmmsg was added for alpha in 2.6.33. */
> +#if __LINUX_KERNEL_VERSION >= 0x020621
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> +#endif
> +
> /* Support for accept4 was added for alpha in 3.2. */
> #if __LINUX_KERNEL_VERSION >= 0x030200
> # define __ASSUME_ACCEPT4_SYSCALL 1
> diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> index 304f88d..7b43e36 100644
> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> @@ -31,6 +31,11 @@
> # define __ASSUME_SIGNALFD4 1
> #endif
>
> +/* Support for the recvmmsg syscall was added in 2.6.33. */
> +#if __LINUX_KERNEL_VERSION >= 0x020621
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> +#endif
> +
> /* Support for the accept4 syscall was added in 2.6.36. */
> #if __LINUX_KERNEL_VERSION >= 0x020624
> # define __ASSUME_ACCEPT4_SYSCALL 1
> diff --git a/sysdeps/unix/sysv/linux/ia64/kernel-features.h b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> index 5c7c4eb..b4955d9 100644
> --- a/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> @@ -47,6 +47,11 @@
> # define __ASSUME_DUP3 1
> #endif
>
> +/* Support for the recvmmsg syscall was added in 2.6.33. */
> +#if __LINUX_KERNEL_VERSION >= 0x020621
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> +#endif
> +
> /* Support for the accept4 syscall was added in 3.3. */
> #if __LINUX_KERNEL_VERSION >= 0x030300
> # define __ASSUME_ACCEPT4_SYSCALL 1
> diff --git a/sysdeps/unix/sysv/linux/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/internal_recvmmsg.S
> index 66c1357..6b776b9 100644
> --- a/sysdeps/unix/sysv/linux/internal_recvmmsg.S
> +++ b/sysdeps/unix/sysv/linux/internal_recvmmsg.S
> @@ -1,8 +1,18 @@
> #include <kernel-features.h>
> #include <sys/syscall.h>
> +
> +/* Do not use the recvmmsg syscall on socketcall architectures unless
> + it was added at the same time as the socketcall support or can be
> + assumed to be present. */
> +#if defined __ASSUME_SOCKETCALL \
> + && !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \
> + && !defined __ASSUME_RECVMMSG_SYSCALL
> +# undef __NR_recvmmsg
> +#endif
> +
> #if !defined __NR_recvmmsg && defined __NR_socketcall
> # define socket recvmmsg
> -# ifdef __ASSUME_RECVMMSG
> +# ifdef __ASSUME_RECVMMSG_SOCKETCALL
> # define __socket recvmmsg
> # else
> # define __socket __internal_recvmmsg
> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
> index b6d7714..034257e 100644
> --- a/sysdeps/unix/sysv/linux/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
> @@ -233,8 +233,25 @@
> # define __ASSUME_F_GETOWN_EX 1
> #endif
>
> -/* Support for the recvmmsg syscall was added in 2.6.33. */
> -#if __LINUX_KERNEL_VERSION >= 0x020621
> +/* Support for recvmmsg functionality was added in 2.6.33. The macros
> + defined correspond to those for accept4. */
> +#if __LINUX_KERNEL_VERSION >= 0x020621 && defined __ASSUME_SOCKETCALL
> +# define __ASSUME_RECVMMSG_SOCKETCALL 1
> +#endif
> +
> +/* The recvmmsg syscall was added for i386, x86_64 and SPARC in
> + 2.6.33, and for PowerPC and SH in 2.6.37. */
> +#if (__LINUX_KERNEL_VERSION >= 0x020621 \
> + && (defined __i386__ || defined __x86_64__ || defined __sparc__)) \
> + || (__LINUX_KERNEL_VERSION >= 0x020625 \
> + && (defined __powerpc__ || defined __sh__))
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> +#endif
> +#if defined __i386__ || defined __sparc__
> +# define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL 1
> +#endif
> +
> +#if defined __ASSUME_RECVMMSG_SOCKETCALL || defined __ASSUME_RECVMMSG_SYSCALL
> # define __ASSUME_RECVMMSG 1
> #endif
>
> diff --git a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> index 413b4a0..ec3c3a2 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> @@ -29,9 +29,11 @@
> #define __ASSUME_SIGNALFD4 1
> #define __ASSUME_DUP3 1
>
> -/* Support for the accept4 syscall was added in 2.6.33. */
> +/* Support for the accept4 and recvmmsg syscalls was added in 2.6.33. */
> #if __LINUX_KERNEL_VERSION >= 0x020621
> # define __ASSUME_ACCEPT4_SYSCALL 1
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> +# define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL 1
> #endif
>
> #include_next <kernel-features.h>
> diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> index 94deaf9..22064d9 100644
> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> @@ -36,6 +36,11 @@
> # define __ASSUME_ACCEPT4_SYSCALL 1
> #endif
>
> +/* Support for the recvmmsg syscall was added in 2.6.33. */
> +#if __LINUX_KERNEL_VERSION >= 0x020621
> +# define __ASSUME_RECVMMSG_SYSCALL 1
> +#endif
> +
> #include_next <kernel-features.h>
>
> /* The n32 syscall ABI did not have a getdents64 syscall until
> diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c
> index 04ff42e..57ddf31 100644
> --- a/sysdeps/unix/sysv/linux/recvmmsg.c
> +++ b/sysdeps/unix/sysv/linux/recvmmsg.c
> @@ -23,6 +23,14 @@
> #include <sys/syscall.h>
> #include <kernel-features.h>
>
> +/* Do not use the recvmmsg syscall on socketcall architectures unless
> + it was added at the same time as the socketcall support or can be
> + assumed to be present. */
> +#if defined __ASSUME_SOCKETCALL \
> + && !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \
> + && !defined __ASSUME_RECVMMSG_SYSCALL
> +# undef __NR_recvmmsg
> +#endif
>
> #ifdef __NR_recvmmsg
> int
> @@ -41,7 +49,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
> return result;
> }
> #elif defined __NR_socketcall
> -# ifndef __ASSUME_RECVMMSG
> +# ifndef __ASSUME_RECVMMSG_SOCKETCALL
> extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages,
> unsigned int vlen, int flags,
> const struct timespec *tmo)
> @@ -85,7 +93,8 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
> return -1;
> }
> # else
> -/* When __ASSUME_RECVMMSG recvmmsg is defined in internal_recvmmsg.S. */
> +/* When __ASSUME_RECVMMSG_SOCKETCALL recvmmsg is defined in
> + internal_recvmmsg.S. */
> # endif
> #else
> # include <socket/recvmmsg.c>
> diff --git a/sysdeps/unix/sysv/linux/tile/kernel-features.h b/sysdeps/unix/sysv/linux/tile/kernel-features.h
> index e339e7a..b415d8f 100644
> --- a/sysdeps/unix/sysv/linux/tile/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/tile/kernel-features.h
> @@ -27,6 +27,7 @@
> #define __ASSUME_SIGNALFD4 1
> #define __ASSUME_ACCEPT4_SYSCALL 1
> #define __ASSUME_DUP3 1
> +#define __ASSUME_RECVMMSG_SYSCALL 1
>
> #include_next <kernel-features.h>
>
>