This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix __ASSUME_SENDMMSG issues (bug 16611)


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]