This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Fix __ASSUME_SENDMMSG issues (bug 16611)
- From: "Carlos O'Donell" <carlos at redhat dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, libc-alpha at sourceware dot org
- Date: Thu, 20 Feb 2014 10:40:46 -0500
- Subject: Re: Fix __ASSUME_SENDMMSG issues (bug 16611)
- Authentication-results: sourceware.org; auth=none
- References: <Pine dot LNX dot 4 dot 64 dot 1402200231530 dot 5004 at digraph dot polyomino dot org dot uk>
On 02/19/2014 09:34 PM, Joseph S. Myers wrote:
> Similar to the issues for accept4 and recvmmsg, __ASSUME_SENDMMSG is
> also confused about whether it relates to function availability or
> socketcall operation availability, and the conditions for the
> definition are always wrong (sendmmsg appeared in Linux kernel 3.0,
> not 2.6.39); this is now bug 16611.
>
> This patch, relative to a tree with
> <https://sourceware.org/ml/libc-alpha/2014-02/msg00553.html> and
> <https://sourceware.org/ml/libc-alpha/2014-02/msg00556.html> applied,
> splits the macro into separate macros like those for accept4 and
> recvmmsg, defining them for appropriate kernel versions.
>
> Tested x86_64, including that disassembly of the installed shared
> libraries is unchanged by this patch.
This looks good to me.
It took me a while to understand some of the conditionals
because they are present in their inverse form to undef
the appropriate defines, but they appear correct.
> 2014-02-20 Joseph Myers <joseph@codesourcery.com>
>
> [BZ #16611]
> * sysdeps/unix/sysv/linux/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030000 && __ASSUME_SOCKETCALL]
> (__ASSUME_SENDMMSG_SOCKETCALL): Define.
> [__LINUX_KERNEL_VERSION >= 0x030000 && (__i386__ || __x86_64__ ||
> __powerpc__ || __sh__ || __sparc__)] (__ASSUME_SENDMMSG_SYSCALL):
> Likewise.
> [__i386__ || __powerpc__ || __sh__ || __sparc__]
> (__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL): Likewise.
> [__ASSUME_SENDMMSG_SOCKETCALL || __ASSUME_SENDMMSG_SYSCALL]
> (__ASSUME_SENDMMSG): Define instead of using previous
> [__LINUX_KERNEL_VERSION >= 0x020627] condition.
> * sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> (__ASSUME_SENDMMSG_SYSCALL): Define.
> * sysdeps/unix/sysv/linux/alpha/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030200] (__ASSUME_SENDMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/arm/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/ia64/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/internal_sendmmsg.S [__ASSUME_SOCKETCALL
> && !__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL &&
> !__ASSUME_SENDMMSG_SYSCALL] (__NR_sendmmsg): Undefine.
> [__ASSUME_SENDMMSG]: Change conditionals to
> [__ASSUME_SENDMMSG_SOCKETCALL].
> * sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030300] (__ASSUME_SENDMMSG_SYSCALL):
> Define.
> * sysdeps/unix/sysv/linux/mips/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030100] (__ASSUME_SENDMMSG_SYSCALL):
> Likewise.
> * sysdeps/unix/sysv/linux/sendmmsg.c [__ASSUME_SOCKETCALL &&
> !__ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL &&
> !__ASSUME_SENDMMSG_SYSCALL] (__NR_sendmmsg): Undefine.
> [!__ASSUME_SENDMMSG]: Change conditional to
> [!__ASSUME_SENDMMSG_SOCKETCALL].
> * sysdeps/unix/sysv/linux/tile/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030000] (__ASSUME_SENDMMSG_SYSCALL):
> Define.
>
> ports/ChangeLog.hppa:
> 2014-02-20 Joseph Myers <joseph@codesourcery.com>
>
> [BZ #16611]
> * sysdeps/unix/sysv/linux/hppa/kernel-features.h
> [__LINUX_KERNEL_VERSION >= 0x030100] (__ASSUME_SENDMMSG_SYSCALL):
> Define.
OK.
>
> diff --git a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> index 75e1999..e869c14 100644
> --- a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> +++ b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
> @@ -36,4 +36,9 @@
> # define __ASSUME_RECVMMSG_SYSCALL 1
> #endif
>
> +/* Support for the sendmmsg syscall was added in 3.1. */
> +#if __LINUX_KERNEL_VERSION >= 0x030100
> +# define __ASSUME_SENDMMSG_SYSCALL 1
> +#endif
OK.
> +
> #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 3f9cd04..417f89b 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
> @@ -31,6 +31,7 @@
> #define __ASSUME_O_CLOEXEC 1
> #define __ASSUME_PIPE2 1
> #define __ASSUME_RECVMMSG_SYSCALL 1
> +#define __ASSUME_SENDMMSG_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 6e4a515..e691bb0 100644
> --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h
> @@ -47,9 +47,10 @@
> # define __ASSUME_RECVMMSG_SYSCALL 1
> #endif
>
> -/* Support for accept4 was added for alpha in 3.2. */
> +/* Support for accept4 and sendmmsg was added for alpha in 3.2. */
> #if __LINUX_KERNEL_VERSION >= 0x030200
> # define __ASSUME_ACCEPT4_SYSCALL 1
> +# define __ASSUME_SENDMMSG_SYSCALL 1
> #endif
>
> #include_next <kernel-features.h>
> diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> index 7b43e36..401343b 100644
> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
> @@ -41,6 +41,11 @@
> # define __ASSUME_ACCEPT4_SYSCALL 1
> #endif
>
> +/* Support for the sendmmsg syscall was added in 3.0. */
> +#if __LINUX_KERNEL_VERSION >= 0x030000
> +# define __ASSUME_SENDMMSG_SYSCALL 1
> +#endif
> +
> #include_next <kernel-features.h>
>
> /* Support for pselect6, ppoll and epoll_pwait was added in 2.6.32. */
> diff --git a/sysdeps/unix/sysv/linux/ia64/kernel-features.h b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> index b4955d9..dd4de39 100644
> --- a/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
> @@ -52,6 +52,11 @@
> # define __ASSUME_RECVMMSG_SYSCALL 1
> #endif
>
> +/* Support for the sendmmsg syscall was added in 3.0. */
> +#if __LINUX_KERNEL_VERSION >= 0x030000
> +# define __ASSUME_SENDMMSG_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_sendmmsg.S b/sysdeps/unix/sysv/linux/internal_sendmmsg.S
> index e6681f0..4d903ea 100644
> --- a/sysdeps/unix/sysv/linux/internal_sendmmsg.S
> +++ b/sysdeps/unix/sysv/linux/internal_sendmmsg.S
> @@ -1,15 +1,25 @@
> #include <kernel-features.h>
> #include <sys/syscall.h>
> +
> +/* Do not use the sendmmsg 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_SENDMMSG_SYSCALL_WITH_SOCKETCALL \
> + && !defined __ASSUME_SENDMMSG_SYSCALL
> +# undef __NR_sendmmsg
> +#endif
OK (Though it took me a while to parse the inverse of this conditional).
> +
> #if !defined __NR_sendmmsg && defined __NR_socketcall
> # define socket sendmmsg
> -# ifndef __ASSUME_SENDMMSG
> +# ifndef __ASSUME_SENDMMSG_SOCKETCALL
> # define __socket __internal_sendmmsg
> # define NO_WEAK_ALIAS
> # endif
> # define NARGS 4
> # define NEED_CANCELLATION
> # include <socket.S>
> -# ifdef __ASSUME_SENDMMSG
> +# ifdef __ASSUME_SENDMMSG_SOCKETCALL
> libc_hidden_def (__sendmmsg)
> # endif
> #endif
> diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
> index 034257e..555b82c 100644
> --- a/sysdeps/unix/sysv/linux/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/kernel-features.h
> @@ -271,8 +271,25 @@
> # define __ASSUME_PRLIMIT64 1
> #endif
>
> -/* sendmmsg is available in 2.6.39. */
> -#if __LINUX_KERNEL_VERSION >= 0x020627
> +/* Support for sendmmsg functionality was added in 3.0. The macros
> + defined correspond to those for accept4 and recvmmsg. */
> +#if __LINUX_KERNEL_VERSION >= 0x030000 && defined __ASSUME_SOCKETCALL
> +# define __ASSUME_SENDMMSG_SOCKETCALL 1
> +#endif
OK.
> +
> +/* The sendmmsg syscall was added for i386, x86_64, PowerPC, SH and
> + SPARC in 3.0. */
> +#if __LINUX_KERNEL_VERSION >= 0x030000 \
> + && (defined __i386__ || defined __x86_64__ || defined __powerpc__ \
> + || defined __sh__ || defined __sparc__)
> +# define __ASSUME_SENDMMSG_SYSCALL 1
> +#endif
> +#if defined __i386__ || defined __powerpc__ || defined __sh__ \
> + || defined __sparc__
> +# define __ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL 1
> +#endif
> +
> +#if defined __ASSUME_SENDMMSG_SOCKETCALL || defined __ASSUME_SENDMMSG_SYSCALL
> # define __ASSUME_SENDMMSG 1
> #endif
>
> diff --git a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> index ec3c3a2..886dcd1 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
> @@ -36,4 +36,9 @@
> # define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL 1
> #endif
>
> +/* Support for the sendmmsg syscall was added in 3.3. */
> +#if __LINUX_KERNEL_VERSION >= 0x030300
> +# define __ASSUME_SENDMMSG_SYSCALL 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 22064d9..52cbf3a 100644
> --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
> @@ -41,6 +41,11 @@
> # define __ASSUME_RECVMMSG_SYSCALL 1
> #endif
>
> +/* Support for the sendmmsg syscall was added in 3.1. */
> +#if __LINUX_KERNEL_VERSION >= 0x030100
> +# define __ASSUME_SENDMMSG_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/sendmmsg.c b/sysdeps/unix/sysv/linux/sendmmsg.c
> index f8494be..3074066 100644
> --- a/sysdeps/unix/sysv/linux/sendmmsg.c
> +++ b/sysdeps/unix/sysv/linux/sendmmsg.c
> @@ -23,6 +23,14 @@
> #include <sys/syscall.h>
> #include <kernel-features.h>
>
> +/* Do not use the sendmmsg 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_SENDMMSG_SYSCALL_WITH_SOCKETCALL \
> + && !defined __ASSUME_SENDMMSG_SYSCALL
> +# undef __NR_sendmmsg
> +#endif
OK.
>
> #ifdef __NR_sendmmsg
> int
> @@ -42,7 +50,7 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
> libc_hidden_def (__sendmmsg)
> weak_alias (__sendmmsg, sendmmsg)
> #elif defined __NR_socketcall
> -# ifndef __ASSUME_SENDMMSG
> +# ifndef __ASSUME_SENDMMSG_SOCKETCALL
> extern int __internal_sendmmsg (int fd, struct mmsghdr *vmessages,
> unsigned int vlen, int flags)
> attribute_hidden;
> @@ -86,7 +94,8 @@ __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
> libc_hidden_def (__sendmmsg)
> weak_alias (__sendmmsg, sendmmsg)
> # else
> -/* When __ASSUME_SENDMMSG sendmmsg is defined in internal_sendmmsg.S. */
> +/* When __ASSUME_SENDMMSG_SOCKETCALL sendmmsg is defined in
> + internal_sendmmsg.S. */
> # endif
> #else
> # include <socket/sendmmsg.c>
> diff --git a/sysdeps/unix/sysv/linux/tile/kernel-features.h b/sysdeps/unix/sysv/linux/tile/kernel-features.h
> index b415d8f..bf7bddc 100644
> --- a/sysdeps/unix/sysv/linux/tile/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/tile/kernel-features.h
> @@ -29,6 +29,11 @@
> #define __ASSUME_DUP3 1
> #define __ASSUME_RECVMMSG_SYSCALL 1
>
> +/* Support for the sendmmsg syscall was added in 3.0. */
> +#if __LINUX_KERNEL_VERSION >= 0x030000
> +# define __ASSUME_SENDMMSG_SYSCALL 1
> +#endif
> +
> #include_next <kernel-features.h>
>
> /* Define this if your 32-bit syscall API requires 64-bit register
>
Cheers,
Carlos.