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_RECVMMSG issues (bug 16610)


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


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