about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
authorStefan Liebler <stli@linux.vnet.ibm.com>2015-11-09 16:14:49 +0100
committerAndreas Krebbel <krebbel@linux.vnet.ibm.com>2015-11-09 16:14:49 +0100
commit016495b818cb61df7d0d10e6db54074271b3e3a5 (patch)
treef03b894ace447f55bd43c2719a2d3bf9b31b88e3 /sysdeps/unix/sysv/linux
parent2eecc8afd02d8c65cf098cbae4de87f332dc21bd (diff)
downloadglibc-016495b818cb61df7d0d10e6db54074271b3e3a5.tar.gz
glibc-016495b818cb61df7d0d10e6db54074271b3e3a5.tar.xz
glibc-016495b818cb61df7d0d10e6db54074271b3e3a5.zip
S390: Call direct system calls for socket operations.
this patch calls direct system calls for socket operations in the same way as power does. The system calls were introduced in kernel commit https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=977108f89c989b1eeb5c8d938e1e71913391eb5f.
There are no direct recv, send, accept syscalls available on s390. Thus
recvfrom, sendto, accept4 are called instead of the socketcall by defining __ASSUME_*_FOR_*_SYSCALL macros. See recv.c, send.c, accept.c in sysdeps/unix/sysv/linux/ folder.

The socketcalls in syscalls.list for s390-64 are removed. They were never used on s390x.

ChangeLog:

	* sysdeps/unix/sysv/linux/s390/kernel-features.h:
	(__ASSUME_*_SYSCALL) Define new macros.
	* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list:
	Remove socketcall syscalls.
	* sysdeps/unix/sysv/linux/accept.c (__libc_accept):
	Use accept4 if defined __ASSUME_ACCEPT4_FOR_ACCEPT_SYSCALL.
	* sysdeps/unix/sysv/linux/recv.c (__libc_recv):
	Use recvfrom if defined __ASSUME_RECVFROM_FOR_RECV_SYSCALL.
	* sysdeps/unix/sysv/linux/send.c (__libc_send):
	Use sendto if defined __ASSUME_SENDTO_FOR_SEND_SYSCALL.
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/accept.c2
-rw-r--r--sysdeps/unix/sysv/linux/recv.c2
-rw-r--r--sysdeps/unix/sysv/linux/s390/kernel-features.h24
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list19
-rw-r--r--sysdeps/unix/sysv/linux/send.c2
5 files changed, 30 insertions, 19 deletions
diff --git a/sysdeps/unix/sysv/linux/accept.c b/sysdeps/unix/sysv/linux/accept.c
index 8b4fff084d..f53613306b 100644
--- a/sysdeps/unix/sysv/linux/accept.c
+++ b/sysdeps/unix/sysv/linux/accept.c
@@ -29,6 +29,8 @@ __libc_accept (int fd, __SOCKADDR_ARG addr, socklen_t *len)
 {
 #ifdef __ASSUME_ACCEPT_SYSCALL
   return SYSCALL_CANCEL (accept, fd, addr.__sockaddr__, len);
+#elif defined __ASSUME_ACCEPT4_FOR_ACCEPT_SYSCALL
+  return SYSCALL_CANCEL (accept4, fd, addr.__sockaddr__, len, 0);
 #else
   return SOCKETCALL_CANCEL (accept, fd, addr.__sockaddr__, len);
 #endif
diff --git a/sysdeps/unix/sysv/linux/recv.c b/sysdeps/unix/sysv/linux/recv.c
index 12be89053d..ce701b59c5 100644
--- a/sysdeps/unix/sysv/linux/recv.c
+++ b/sysdeps/unix/sysv/linux/recv.c
@@ -29,6 +29,8 @@ __libc_recv (int fd, void *buf, size_t len, int flags)
 {
 #ifdef __ASSUME_RECV_SYSCALL
   return SYSCALL_CANCEL (recv, fd, buf, len, flags);
+#elif defined __ASSUME_RECVFROM_FOR_RECV_SYSCALL
+  return SYSCALL_CANCEL (recvfrom, fd, buf, len, flags, NULL, NULL);
 #else
   return SOCKETCALL_CANCEL (recv, fd, buf, len, flags);
 #endif
diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h
index 96f73ef959..eaa348361b 100644
--- a/sysdeps/unix/sysv/linux/s390/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h
@@ -20,4 +20,28 @@
 /* S/390 uses socketcall.  */
 #define __ASSUME_SOCKETCALL		1
 
+/* Direct socketcalls available with kernel 4.3.  */
+#if __LINUX_KERNEL_VERSION >= 0x040300
+# define __ASSUME_RECVMMSG_SYSCALL           1
+# define __ASSUME_SENDMMSG_SYSCALL           1
+# define __ASSUME_SOCKET_SYSCALL             1
+# define __ASSUME_SOCKETPAIR_SYSCALL         1
+# define __ASSUME_BIND_SYSCALL               1
+# define __ASSUME_CONNECT_SYSCALL            1
+# define __ASSUME_LISTEN_SYSCALL             1
+# define __ASSUME_ACCEPT4_SYSCALL            1
+# define __ASSUME_ACCEPT4_FOR_ACCEPT_SYSCALL 1
+# define __ASSUME_GETSOCKOPT_SYSCALL         1
+# define __ASSUME_SETSOCKOPT_SYSCALL         1
+# define __ASSUME_GETSOCKNAME_SYSCALL        1
+# define __ASSUME_GETPEERNAME_SYSCALL        1
+# define __ASSUME_SENDTO_SYSCALL             1
+# define __ASSUME_SENDTO_FOR_SEND_SYSCALL    1
+# define __ASSUME_SENDMSG_SYSCALL            1
+# define __ASSUME_RECVFROM_SYSCALL           1
+# define __ASSUME_RECVFROM_FOR_RECV_SYSCALL  1
+# define __ASSUME_RECVMSG_SYSCALL            1
+# define __ASSUME_SHUTDOWN_SYSCALL           1
+#endif
+
 #include_next <kernel-features.h>
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list b/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
index 5b8c1024ac..9f03d26fea 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list
@@ -12,22 +12,3 @@ shmget		-	shmget		i:iii	__shmget	shmget
 semop		-	semop		i:ipi	__semop		semop
 semget		-	semget		i:iii	__semget	semget
 semctl		-	semctl		i:iiii	__semctl	semctl
-
-# proper socket implementations:
-accept		-	accept		Ci:iBN	__libc_accept	__accept accept
-bind		-	bind		i:ipi	__bind		bind
-connect		-	connect		Ci:ipi	__libc_connect	__connect connect
-getpeername	-	getpeername	i:ipp	__getpeername	getpeername
-getsockname	-	getsockname	i:ipp	__getsockname	getsockname
-getsockopt	-	getsockopt	i:iiiBN	__getsockopt	getsockopt
-listen		-	listen		i:ii	__listen	listen
-recv		-	recv		Ci:ibni	__libc_recv	__recv recv
-recvfrom	-	recvfrom	Ci:ibniBN	__libc_recvfrom	__recvfrom recvfrom
-recvmsg		-	recvmsg		Ci:ipi	__libc_recvmsg	__recvmsg recvmsg
-send		-	send		Ci:ibni	__libc_send	__send send
-sendmsg		-	sendmsg		Ci:ipi	__libc_sendmsg	__sendmsg sendmsg
-sendto		-	sendto		Ci:ibnibn	__libc_sendto	__sendto sendto
-setsockopt	-	setsockopt	i:iiibn	__setsockopt	setsockopt
-shutdown	-	shutdown	i:ii	__shutdown	shutdown
-socket		-	socket		i:iii	__socket	socket
-socketpair	-	socketpair	i:iiif	__socketpair	socketpair
diff --git a/sysdeps/unix/sysv/linux/send.c b/sysdeps/unix/sysv/linux/send.c
index d917e4d900..529c27d155 100644
--- a/sysdeps/unix/sysv/linux/send.c
+++ b/sysdeps/unix/sysv/linux/send.c
@@ -29,6 +29,8 @@ __libc_send (int fd, const void *buf, size_t len, int flags)
 {
 #ifdef __ASSUME_SEND_SYSCALL
   return SYSCALL_CANCEL (send, fd, buf, len, flags);
+#elif defined __ASSUME_SENDTO_FOR_SEND_SYSCALL
+  return SYSCALL_CANCEL (sendto, fd, buf, len, flags, NULL, 0);
 #else
   return SOCKETCALL_CANCEL (send, fd, buf, len, flags);
 #endif