Skip to content

Commit

Permalink
Call direct system calls for socket operations
Browse files Browse the repository at this point in the history
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  <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.
  • Loading branch information
Rajalakshmi Srinivasaraghavan authored and Tulio Magno Quites Machado Filho committed Aug 25, 2015
1 parent 1817355 commit f449141
Show file tree
Hide file tree
Showing 19 changed files with 146 additions and 0 deletions.
21 changes: 21 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
2015-08-25 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.

2015-08-25 Paul E. Murphy <murphyp@linux.vnet.ibm.com>

* sysdeps/powerpc/powerpc32/sysdep.h (ABORT_TRANSACTION): Use
Expand Down
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/accept.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/bind.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/getpeername.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/getsockname.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/getsockopt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/listen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
21 changes: 21 additions & 0 deletions sysdeps/unix/sysv/linux/powerpc/kernel-features.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/recv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions sysdeps/unix/sysv/linux/recvfrom.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/recvmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/send.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/sendmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
7 changes: 7 additions & 0 deletions sysdeps/unix/sysv/linux/sendto.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/setsockopt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/shutdown.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/socketpair.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit f449141

Please sign in to comment.