Message ID | 1439532720-4720-1-git-send-email-raji@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On Fri, 2015-08-14 at 11:42 +0530, Rajalakshmi Srinivasaraghavan wrote: > Explicit system calls for the socket operations were added in Linux kernel > in commit 86250b9d12ca for powerpc. This patch make use of those instead of > calling socketcall to save number of cycles on networking syscalls. > > 2015-08-14 Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> > > * sysdeps/unix/sysv/linux/powerpc/kernel-features.h: Define new macros. > * sysdeps/unix/sysv/linux/accept.c: Call direct system call. > * sysdeps/unix/sysv/linux/bind.c: Call direct system call. > * sysdeps/unix/sysv/linux/connect.c: Call direct system call. > * sysdeps/unix/sysv/linux/getpeername.c: Call direct system call. > * sysdeps/unix/sysv/linux/getsockname.c: Call direct system call. > * sysdeps/unix/sysv/linux/getsockopt.c: Call direct system call. > * sysdeps/unix/sysv/linux/listen.c: Call direct system call. > * sysdeps/unix/sysv/linux/recv.c: Call direct system call. > * sysdeps/unix/sysv/linux/recvfrom.c: Call direct system call. > * sysdeps/unix/sysv/linux/recvmsg.c: Call direct system call. > * sysdeps/unix/sysv/linux/send.c: Call direct system call. > * sysdeps/unix/sysv/linux/sendmsg.c: Call direct system call. > * sysdeps/unix/sysv/linux/sendto.c: Call direct system call. > * sysdeps/unix/sysv/linux/setsockopt.c: Call direct system call. > * sysdeps/unix/sysv/linux/shutdown.c: Call direct system call. > * sysdeps/unix/sysv/linux/socket.c: Call direct system call. > * sysdeps/unix/sysv/linux/socketpair.c: Call direct system call. > --- LGTM
Steven Munroe <munroesj@linux.vnet.ibm.com> writes: > On Fri, 2015-08-14 at 11:42 +0530, Rajalakshmi Srinivasaraghavan wrote: >> Explicit system calls for the socket operations were added in Linux kernel >> in commit 86250b9d12ca for powerpc. This patch make use of those instead of >> calling socketcall to save number of cycles on networking syscalls. >> >> 2015-08-14 Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> >> >> * sysdeps/unix/sysv/linux/powerpc/kernel-features.h: Define new macros. >> * sysdeps/unix/sysv/linux/accept.c: Call direct system call. >> * sysdeps/unix/sysv/linux/bind.c: Call direct system call. >> * sysdeps/unix/sysv/linux/connect.c: Call direct system call. >> * sysdeps/unix/sysv/linux/getpeername.c: Call direct system call. >> * sysdeps/unix/sysv/linux/getsockname.c: Call direct system call. >> * sysdeps/unix/sysv/linux/getsockopt.c: Call direct system call. >> * sysdeps/unix/sysv/linux/listen.c: Call direct system call. >> * sysdeps/unix/sysv/linux/recv.c: Call direct system call. >> * sysdeps/unix/sysv/linux/recvfrom.c: Call direct system call. >> * sysdeps/unix/sysv/linux/recvmsg.c: Call direct system call. >> * sysdeps/unix/sysv/linux/send.c: Call direct system call. >> * sysdeps/unix/sysv/linux/sendmsg.c: Call direct system call. >> * sysdeps/unix/sysv/linux/sendto.c: Call direct system call. >> * sysdeps/unix/sysv/linux/setsockopt.c: Call direct system call. >> * sysdeps/unix/sysv/linux/shutdown.c: Call direct system call. >> * sysdeps/unix/sysv/linux/socket.c: Call direct system call. >> * sysdeps/unix/sysv/linux/socketpair.c: Call direct system call. >> --- > > LGTM I see we have a green flag for this patch on POWER. Andreas, any other comments?
No further comments, please go ahead. Andreas.
Andreas Schwab <schwab@suse.de> writes: > No further comments, please go ahead. > > Andreas. I'm pushing it. Thanks!!
In file included from ../sysdeps/powerpc/nptl/tls.h:48:0, from ../include/errno.h:27, from ../sysdeps/unix/sysv/linux/socketpair.c:18: ../sysdeps/unix/sysv/linux/socketpair.c: In function '__socketpair': ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:198:54: error: 'sizeof' on array function parameter 'sv' will return size of 'int *' [-Werror=sizeof-array-argument] if (__builtin_classify_type (__arg4) != 5 && sizeof (__arg4) > 4) \ ^ ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:128:5: note: in expansion of macro 'LOADARGS_4' LOADARGS_##nr(name, args); \ ^ ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:142:3: note: in expansion of macro 'INTERNAL_SYSCALL_NCS' INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args) ^ ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:94:23: note: in expansion of macro 'INTERNAL_SYSCALL' long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \ ^ ../sysdeps/unix/sysv/linux/socketpair.c:30:10: note: in expansion of macro 'INLINE_SYSCALL' return INLINE_SYSCALL (socketpair, 4, domain, type, protocol, sv); ^ ../sysdeps/unix/sysv/linux/socketpair.c:27:55: note: declared here __socketpair (int domain, int type, int protocol, int sv[2]) ^ Andreas.
I am not seeing this with GCC 4.9, so I assume it is with a new release. Which version did you use? On 31-08-2015 06:56, Andreas Schwab wrote: > In file included from ../sysdeps/powerpc/nptl/tls.h:48:0, > from ../include/errno.h:27, > from ../sysdeps/unix/sysv/linux/socketpair.c:18: > ../sysdeps/unix/sysv/linux/socketpair.c: In function '__socketpair': > ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:198:54: error: 'sizeof' on array function parameter 'sv' will return size of 'int *' [-Werror=sizeof-array-argument] > if (__builtin_classify_type (__arg4) != 5 && sizeof (__arg4) > 4) \ > ^ > ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:128:5: note: in expansion of macro 'LOADARGS_4' > LOADARGS_##nr(name, args); \ > ^ > ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:142:3: note: in expansion of macro 'INTERNAL_SYSCALL_NCS' > INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args) > ^ > ../sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h:94:23: note: in expansion of macro 'INTERNAL_SYSCALL' > long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \ > ^ > ../sysdeps/unix/sysv/linux/socketpair.c:30:10: note: in expansion of macro 'INLINE_SYSCALL' > return INLINE_SYSCALL (socketpair, 4, domain, type, protocol, sv); > ^ > ../sysdeps/unix/sysv/linux/socketpair.c:27:55: note: declared here > __socketpair (int domain, int type, int protocol, int sv[2]) > ^ > > Andreas. >
https://build.opensuse.org/project/monitor/home:Andreas_Schwab:glibc Andreas.
Andreas Schwab <schwab@suse.de> writes:
> https://build.opensuse.org/project/monitor/home:Andreas_Schwab:glibc
Extracting details from this log:
gcc version 5.1.1 20150713 [gcc-5-branch revision 225736]
glibc configured with:
../configure 'CFLAGS=-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -U_FORTIFY_SOURCE -g' 'BUILD_CFLAGS=-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -U_FORTIFY_SOURCE -g' CC=gcc CXX=g++ --prefix=/usr --libexecdir=/usr/lib --infodir=/usr/share/info --enable-add-ons=libidn --enable-profile --enable-lock-elision --enable-stackguard-randomization --build=ppc64le-suse-linux --host=ppc64le-suse-linux --enable-multi-arch --enable-kernel=3.0 --with-bugurl=http://bugs.opensuse.org --enable-bind-now --enable-obsolete-rpc
On Mon, 31 Aug 2015, Andreas Schwab wrote: > ../sysdeps/unix/sysv/linux/socketpair.c:27:55: note: declared here > __socketpair (int domain, int type, int protocol, int sv[2]) Presumably the same fix should be used as in commit dd6e8af6ba1b8a95a7f1dc7422e5ea4ccc7fbd93 (using &array_argument[0] in calls to macros that end up passing the array argument to syscalls, to avoid this warning).
diff --git a/sysdeps/unix/sysv/linux/accept.c b/sysdeps/unix/sysv/linux/accept.c index 72d42a7..8b4fff0 100644 --- a/sysdeps/unix/sysv/linux/accept.c +++ b/sysdeps/unix/sysv/linux/accept.c @@ -21,11 +21,17 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <sys/syscall.h> +#include <kernel-features.h> int __libc_accept (int fd, __SOCKADDR_ARG addr, socklen_t *len) { +#ifdef __ASSUME_ACCEPT_SYSCALL + return SYSCALL_CANCEL (accept, fd, addr.__sockaddr__, len); +#else return SOCKETCALL_CANCEL (accept, fd, addr.__sockaddr__, len); +#endif } weak_alias (__libc_accept, accept) libc_hidden_def (accept) diff --git a/sysdeps/unix/sysv/linux/bind.c b/sysdeps/unix/sysv/linux/bind.c index db72df6..4c13b09 100644 --- a/sysdeps/unix/sysv/linux/bind.c +++ b/sysdeps/unix/sysv/linux/bind.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __bind (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { +#ifdef __ASSUME_BIND_SYSCALL + return INLINE_SYSCALL (bind, 3, fd, addr.__sockaddr__, len); +#else return SOCKETCALL (bind, fd, addr.__sockaddr__, len, 0, 0, 0); +#endif } weak_alias (__bind, bind) diff --git a/sysdeps/unix/sysv/linux/connect.c b/sysdeps/unix/sysv/linux/connect.c index dd17e8c..d62e4d7 100644 --- a/sysdeps/unix/sysv/linux/connect.c +++ b/sysdeps/unix/sysv/linux/connect.c @@ -21,11 +21,17 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __libc_connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) { +#ifdef __ASSUME_CONNECT_SYSCALL + return SYSCALL_CANCEL (connect, fd, addr.__sockaddr__, len); +#else return SOCKETCALL_CANCEL (connect, fd, addr.__sockaddr__, len); +#endif } weak_alias (__libc_connect, connect) weak_alias (__libc_connect, __connect) diff --git a/sysdeps/unix/sysv/linux/getpeername.c b/sysdeps/unix/sysv/linux/getpeername.c index 05fd2e8..cd5725b 100644 --- a/sysdeps/unix/sysv/linux/getpeername.c +++ b/sysdeps/unix/sysv/linux/getpeername.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __getpeername (int fd, __SOCKADDR_ARG addr, socklen_t *len) { +#ifdef __ASSUME_GETPEERNAME_SYSCALL + return INLINE_SYSCALL (getpeername, 3, fd, addr.__sockaddr__, len); +#else return SOCKETCALL (getpeername, fd, addr.__sockaddr__, len); +#endif } weak_alias (__getpeername, getpeername) diff --git a/sysdeps/unix/sysv/linux/getsockname.c b/sysdeps/unix/sysv/linux/getsockname.c index 6c84ace..78b6050 100644 --- a/sysdeps/unix/sysv/linux/getsockname.c +++ b/sysdeps/unix/sysv/linux/getsockname.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __getsockname (int fd, __SOCKADDR_ARG addr, socklen_t *len) { +#ifdef __ASSUME_GETSOCKNAME_SYSCALL + return INLINE_SYSCALL (getsockname, 3, fd, addr.__sockaddr__, len); +#else return SOCKETCALL (getsockname, fd, addr.__sockaddr__, len); +#endif } weak_alias (__getsockname, getsockname) diff --git a/sysdeps/unix/sysv/linux/getsockopt.c b/sysdeps/unix/sysv/linux/getsockopt.c index ba5681b..b194551 100644 --- a/sysdeps/unix/sysv/linux/getsockopt.c +++ b/sysdeps/unix/sysv/linux/getsockopt.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __getsockopt (int fd, int level, int optname, void *optval, socklen_t *len) { +#ifdef __ASSUME_GETSOCKOPT_SYSCALL + return INLINE_SYSCALL (getsockopt, 5, fd, level, optname, optval, len); +#else return SOCKETCALL (getsockopt, fd, level, optname, optval, len); +#endif } weak_alias (__getsockopt, getsockopt) diff --git a/sysdeps/unix/sysv/linux/listen.c b/sysdeps/unix/sysv/linux/listen.c index 2e387a4..cf77c68 100644 --- a/sysdeps/unix/sysv/linux/listen.c +++ b/sysdeps/unix/sysv/linux/listen.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int listen (int fd, int backlog) { +#ifdef __ASSUME_LISTEN_SYSCALL + return INLINE_SYSCALL (listen, 2, fd, backlog); +#else return SOCKETCALL (listen, fd, backlog); +#endif } weak_alias (listen, __listen); diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h index 6d93491..46bd53f 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h @@ -36,6 +36,27 @@ #endif #define __ASSUME_SENDMMSG_SYSCALL_WITH_SOCKETCALL 1 +/* New syscalls added for PowerPC in 2.6.37. */ +#if __LINUX_KERNEL_VERSION >= 0x020625 +# define __ASSUME_SOCKET_SYSCALL 1 +# define __ASSUME_BIND_SYSCALL 1 +# define __ASSUME_CONNECT_SYSCALL 1 +# define __ASSUME_LISTEN_SYSCALL 1 +# define __ASSUME_ACCEPT_SYSCALL 1 +# define __ASSUME_GETSOCKNAME_SYSCALL 1 +# define __ASSUME_GETPEERNAME_SYSCALL 1 +# define __ASSUME_SOCKETPAIR_SYSCALL 1 +# define __ASSUME_SEND_SYSCALL 1 +# define __ASSUME_SENDTO_SYSCALL 1 +# define __ASSUME_RECV_SYSCALL 1 +# define __ASSUME_RECVFROM_SYSCALL 1 +# define __ASSUME_SHUTDOWN_SYSCALL 1 +# define __ASSUME_GETSOCKOPT_SYSCALL 1 +# define __ASSUME_SETSOCKOPT_SYSCALL 1 +# define __ASSUME_SENDMSG_SYSCALL 1 +# define __ASSUME_RECVMSG_SYSCALL 1 +#endif + #include_next <kernel-features.h> /* PowerPC64 IPC is always 64-bit and does not use __IPC_64. */ diff --git a/sysdeps/unix/sysv/linux/recv.c b/sysdeps/unix/sysv/linux/recv.c index cd2bc1e..12be890 100644 --- a/sysdeps/unix/sysv/linux/recv.c +++ b/sysdeps/unix/sysv/linux/recv.c @@ -21,11 +21,17 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> ssize_t __libc_recv (int fd, void *buf, size_t len, int flags) { +#ifdef __ASSUME_RECV_SYSCALL + return SYSCALL_CANCEL (recv, fd, buf, len, flags); +#else return SOCKETCALL_CANCEL (recv, fd, buf, len, flags); +#endif } weak_alias (__libc_recv, recv) weak_alias (__libc_recv, __recv) diff --git a/sysdeps/unix/sysv/linux/recvfrom.c b/sysdeps/unix/sysv/linux/recvfrom.c index 90eb40d..19f59a7 100644 --- a/sysdeps/unix/sysv/linux/recvfrom.c +++ b/sysdeps/unix/sysv/linux/recvfrom.c @@ -21,13 +21,20 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> ssize_t __libc_recvfrom (int fd, void *buf, size_t len, int flags, __SOCKADDR_ARG addr, socklen_t *addrlen) { +#ifdef __ASSUME_RECVFROM_SYSCALL + return SYSCALL_CANCEL (recvfrom, fd, buf, len, flags, addr.__sockaddr__, + addrlen); +#else return SOCKETCALL_CANCEL (recvfrom, fd, buf, len, flags, addr.__sockaddr__, addrlen); +#endif } weak_alias (__libc_recvfrom, recvfrom) weak_alias (__libc_recvfrom, __recvfrom) diff --git a/sysdeps/unix/sysv/linux/recvmsg.c b/sysdeps/unix/sysv/linux/recvmsg.c index cd7c9ca..952a0f2 100644 --- a/sysdeps/unix/sysv/linux/recvmsg.c +++ b/sysdeps/unix/sysv/linux/recvmsg.c @@ -21,11 +21,17 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> ssize_t __libc_recvmsg (int fd, struct msghdr *msg, int flags) { +#ifdef __ASSUME_RECVMSG_SYSCALL + return SYSCALL_CANCEL (recvmsg, fd, msg, flags); +#else return SOCKETCALL_CANCEL (recvmsg, fd, msg, flags); +#endif } weak_alias (__libc_recvmsg, recvmsg) weak_alias (__libc_recvmsg, __recvmsg) diff --git a/sysdeps/unix/sysv/linux/send.c b/sysdeps/unix/sysv/linux/send.c index f87ea86..d917e4d 100644 --- a/sysdeps/unix/sysv/linux/send.c +++ b/sysdeps/unix/sysv/linux/send.c @@ -21,11 +21,17 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> ssize_t __libc_send (int fd, const void *buf, size_t len, int flags) { +#ifdef __ASSUME_SEND_SYSCALL + return SYSCALL_CANCEL (send, fd, buf, len, flags); +#else return SOCKETCALL_CANCEL (send, fd, buf, len, flags); +#endif } weak_alias (__libc_send, send) weak_alias (__libc_send, __send) diff --git a/sysdeps/unix/sysv/linux/sendmsg.c b/sysdeps/unix/sysv/linux/sendmsg.c index e69ac3e..21ee009 100644 --- a/sysdeps/unix/sysv/linux/sendmsg.c +++ b/sysdeps/unix/sysv/linux/sendmsg.c @@ -21,11 +21,17 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> ssize_t __libc_sendmsg (int fd, const struct msghdr *msg, int flags) { +#ifdef __ASSUME_SENDMSG_SYSCALL + return SYSCALL_CANCEL (sendmsg, fd, msg, flags); +#else return SOCKETCALL_CANCEL (sendmsg, fd, msg, flags); +#endif } weak_alias (__libc_sendmsg, sendmsg) weak_alias (__libc_sendmsg, __sendmsg) diff --git a/sysdeps/unix/sysv/linux/sendto.c b/sysdeps/unix/sysv/linux/sendto.c index d2896a6..d7a2e53 100644 --- a/sysdeps/unix/sysv/linux/sendto.c +++ b/sysdeps/unix/sysv/linux/sendto.c @@ -21,13 +21,20 @@ #include <sysdep-cancel.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> ssize_t __libc_sendto (int fd, const void *buf, size_t len, int flags, __CONST_SOCKADDR_ARG addr, socklen_t addrlen) { +#ifdef __ASSUME_SENDTO_SYSCALL + return SYSCALL_CANCEL (sendto, fd, buf, len, flags, addr.__sockaddr__, + addrlen); +#else return SOCKETCALL_CANCEL (sendto, fd, buf, len, flags, addr.__sockaddr__, addrlen); +#endif } weak_alias (__libc_sendto, sendto) weak_alias (__libc_sendto, __sendto) diff --git a/sysdeps/unix/sysv/linux/setsockopt.c b/sysdeps/unix/sysv/linux/setsockopt.c index 626c55b..1e87f42 100644 --- a/sysdeps/unix/sysv/linux/setsockopt.c +++ b/sysdeps/unix/sysv/linux/setsockopt.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int setsockopt (int fd, int level, int optname, const void *optval, socklen_t len) { +#ifdef __ASSUME_SETSOCKOPT_SYSCALL + return INLINE_SYSCALL (setsockopt, 5, fd, level, optname, optval, len); +#else return SOCKETCALL (setsockopt, fd, level, optname, optval, len); +#endif } weak_alias (setsockopt, __setsockopt) diff --git a/sysdeps/unix/sysv/linux/shutdown.c b/sysdeps/unix/sysv/linux/shutdown.c index 8b3a3d8..21ec4cc 100644 --- a/sysdeps/unix/sysv/linux/shutdown.c +++ b/sysdeps/unix/sysv/linux/shutdown.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __shutdown (int fd, int how) { +#ifdef __ASSUME_SHUTDOWN_SYSCALL + return INLINE_SYSCALL (shutdown, 2, fd, how); +#else return SOCKETCALL (shutdown, fd, how); +#endif } weak_alias (__shutdown, shutdown) diff --git a/sysdeps/unix/sysv/linux/socket.c b/sysdeps/unix/sysv/linux/socket.c index 3b2c7fe..4628d15 100644 --- a/sysdeps/unix/sysv/linux/socket.c +++ b/sysdeps/unix/sysv/linux/socket.c @@ -20,11 +20,17 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __socket (int fd, int type, int domain) { +#ifdef __ASSUME_SOCKET_SYSCALL + return INLINE_SYSCALL (socket, 3, fd, type, domain); +#else return SOCKETCALL (socket, fd, type, domain); +#endif } libc_hidden_def (__socket) weak_alias (__socket, socket) diff --git a/sysdeps/unix/sysv/linux/socketpair.c b/sysdeps/unix/sysv/linux/socketpair.c index cb70bcf..5c68970 100644 --- a/sysdeps/unix/sysv/linux/socketpair.c +++ b/sysdeps/unix/sysv/linux/socketpair.c @@ -20,10 +20,16 @@ #include <sys/socket.h> #include <socketcall.h> +#include <kernel-features.h> +#include <sys/syscall.h> int __socketpair (int domain, int type, int protocol, int sv[2]) { +#ifdef __ASSUME_SOCKETPAIR_SYSCALL + return INLINE_SYSCALL (socketpair, 4, domain, type, protocol, sv); +#else return SOCKETCALL (socketpair, domain, type, protocol, sv); +#endif } weak_alias (__socketpair, socketpair)