diff mbox

[PATCHv4] Call direct system calls for socket operations

Message ID 1439532720-4720-1-git-send-email-raji@linux.vnet.ibm.com
State New
Headers show

Commit Message

Rajalakshmi Srinivasaraghavan Aug. 14, 2015, 6:12 a.m. UTC
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.
---
 sysdeps/unix/sysv/linux/accept.c                  |  6 ++++++
 sysdeps/unix/sysv/linux/bind.c                    |  6 ++++++
 sysdeps/unix/sysv/linux/connect.c                 |  6 ++++++
 sysdeps/unix/sysv/linux/getpeername.c             |  6 ++++++
 sysdeps/unix/sysv/linux/getsockname.c             |  6 ++++++
 sysdeps/unix/sysv/linux/getsockopt.c              |  6 ++++++
 sysdeps/unix/sysv/linux/listen.c                  |  6 ++++++
 sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 21 +++++++++++++++++++++
 sysdeps/unix/sysv/linux/recv.c                    |  6 ++++++
 sysdeps/unix/sysv/linux/recvfrom.c                |  7 +++++++
 sysdeps/unix/sysv/linux/recvmsg.c                 |  6 ++++++
 sysdeps/unix/sysv/linux/send.c                    |  6 ++++++
 sysdeps/unix/sysv/linux/sendmsg.c                 |  6 ++++++
 sysdeps/unix/sysv/linux/sendto.c                  |  7 +++++++
 sysdeps/unix/sysv/linux/setsockopt.c              |  6 ++++++
 sysdeps/unix/sysv/linux/shutdown.c                |  6 ++++++
 sysdeps/unix/sysv/linux/socket.c                  |  6 ++++++
 sysdeps/unix/sysv/linux/socketpair.c              |  6 ++++++
 18 files changed, 125 insertions(+)

Comments

Steven Munroe Aug. 18, 2015, 6:51 p.m. UTC | #1
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
Tulio Magno Quites Machado Filho Aug. 24, 2015, 6:46 p.m. UTC | #2
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?
Andreas Schwab Aug. 25, 2015, 7:14 a.m. UTC | #3
No further comments, please go ahead.

Andreas.
Tulio Magno Quites Machado Filho Aug. 25, 2015, 4:33 p.m. UTC | #4
Andreas Schwab <schwab@suse.de> writes:

> No further comments, please go ahead.
>
> Andreas.

I'm pushing it.

Thanks!!
Andreas Schwab Aug. 31, 2015, 9:56 a.m. UTC | #5
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.
Adhemerval Zanella Aug. 31, 2015, 8:23 p.m. UTC | #6
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.
>
Andreas Schwab Sept. 1, 2015, 4:10 p.m. UTC | #7
https://build.opensuse.org/project/monitor/home:Andreas_Schwab:glibc

Andreas.
Tulio Magno Quites Machado Filho Sept. 1, 2015, 4:22 p.m. UTC | #8
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
Joseph Myers Sept. 1, 2015, 5:18 p.m. UTC | #9
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 mbox

Patch

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)