From f4491417cc80b4a01e72e9d218af137765ee5918 Mon Sep 17 00:00:00 2001 From: Rajalakshmi Srinivasaraghavan Date: Tue, 25 Aug 2015 10:23:47 -0300 Subject: Call direct system calls for socket operations 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-25 Rajalakshmi Srinivasaraghavan * 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. --- ChangeLog | 21 +++++++++++++++++++++ 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 ++++++ 19 files changed, 146 insertions(+) diff --git a/ChangeLog b/ChangeLog index 6e55d886a6..5c115bfde5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2015-08-25 Rajalakshmi Srinivasaraghavan + + * 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. + 2015-08-25 Paul E. Murphy * sysdeps/powerpc/powerpc32/sysdep.h (ABORT_TRANSACTION): Use diff --git a/sysdeps/unix/sysv/linux/accept.c b/sysdeps/unix/sysv/linux/accept.c index 72d42a7d85..8b4fff084d 100644 --- a/sysdeps/unix/sysv/linux/accept.c +++ b/sysdeps/unix/sysv/linux/accept.c @@ -21,11 +21,17 @@ #include #include +#include +#include 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 db72df6c77..4c13b09435 100644 --- a/sysdeps/unix/sysv/linux/bind.c +++ b/sysdeps/unix/sysv/linux/bind.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 dd17e8ca97..d62e4d7c9e 100644 --- a/sysdeps/unix/sysv/linux/connect.c +++ b/sysdeps/unix/sysv/linux/connect.c @@ -21,11 +21,17 @@ #include #include +#include +#include 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 05fd2e8e31..cd5725b647 100644 --- a/sysdeps/unix/sysv/linux/getpeername.c +++ b/sysdeps/unix/sysv/linux/getpeername.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 6c84acec25..78b6050a98 100644 --- a/sysdeps/unix/sysv/linux/getsockname.c +++ b/sysdeps/unix/sysv/linux/getsockname.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 ba5681b410..b194551d15 100644 --- a/sysdeps/unix/sysv/linux/getsockopt.c +++ b/sysdeps/unix/sysv/linux/getsockopt.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 2e387a492c..cf77c688aa 100644 --- a/sysdeps/unix/sysv/linux/listen.c +++ b/sysdeps/unix/sysv/linux/listen.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 7201cb4f66..8a536cfa1e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h @@ -30,6 +30,27 @@ # define __ASSUME_RECVMMSG_SYSCALL 1 #endif +/* 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 + /* The sendmmsg syscall was added for PowerPC in 3.0. */ #if __LINUX_KERNEL_VERSION >= 0x030000 # define __ASSUME_SENDMMSG_SYSCALL 1 diff --git a/sysdeps/unix/sysv/linux/recv.c b/sysdeps/unix/sysv/linux/recv.c index cd2bc1e101..12be89053d 100644 --- a/sysdeps/unix/sysv/linux/recv.c +++ b/sysdeps/unix/sysv/linux/recv.c @@ -21,11 +21,17 @@ #include #include +#include +#include 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 90eb40d603..19f59a7074 100644 --- a/sysdeps/unix/sysv/linux/recvfrom.c +++ b/sysdeps/unix/sysv/linux/recvfrom.c @@ -21,13 +21,20 @@ #include #include +#include +#include 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 cd7c9ca581..952a0f2eb1 100644 --- a/sysdeps/unix/sysv/linux/recvmsg.c +++ b/sysdeps/unix/sysv/linux/recvmsg.c @@ -21,11 +21,17 @@ #include #include +#include +#include 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 f87ea86672..d917e4d900 100644 --- a/sysdeps/unix/sysv/linux/send.c +++ b/sysdeps/unix/sysv/linux/send.c @@ -21,11 +21,17 @@ #include #include +#include +#include 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 e69ac3e1b7..21ee009c4c 100644 --- a/sysdeps/unix/sysv/linux/sendmsg.c +++ b/sysdeps/unix/sysv/linux/sendmsg.c @@ -21,11 +21,17 @@ #include #include +#include +#include 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 d2896a60ec..d7a2e535b4 100644 --- a/sysdeps/unix/sysv/linux/sendto.c +++ b/sysdeps/unix/sysv/linux/sendto.c @@ -21,13 +21,20 @@ #include #include +#include +#include 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 626c55b5a5..1e87f42553 100644 --- a/sysdeps/unix/sysv/linux/setsockopt.c +++ b/sysdeps/unix/sysv/linux/setsockopt.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 8b3a3d87f5..21ec4ccb23 100644 --- a/sysdeps/unix/sysv/linux/shutdown.c +++ b/sysdeps/unix/sysv/linux/shutdown.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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 3b2c7fea26..4628d15a7e 100644 --- a/sysdeps/unix/sysv/linux/socket.c +++ b/sysdeps/unix/sysv/linux/socket.c @@ -20,11 +20,17 @@ #include #include +#include +#include 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 cb70bcf1f0..5c68970e6f 100644 --- a/sysdeps/unix/sysv/linux/socketpair.c +++ b/sysdeps/unix/sysv/linux/socketpair.c @@ -20,10 +20,16 @@ #include #include +#include +#include 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) -- cgit 1.4.1