net: Add sendmmsg socket system call
This patch adds a multiple message send syscall and is the send version of the existing recvmmsg syscall. This is heavily based on the patch by Arnaldo that added recvmmsg. I wrote a microbenchmark to test the performance gains of using this new syscall: http://ozlabs.org/~anton/junkcode/sendmmsg_test.c The test was run on a ppc64 box with a 10 Gbit network card. The benchmark can send both UDP and RAW ethernet packets. 64B UDP batch pkts/sec 1 804570 2 872800 (+ 8 %) 4 916556 (+14 %) 8 939712 (+17 %) 16 952688 (+18 %) 32 956448 (+19 %) 64 964800 (+20 %) 64B raw socket batch pkts/sec 1 1201449 2 1350028 (+12 %) 4 1461416 (+22 %) 8 1513080 (+26 %) 16 1541216 (+28 %) 32 1553440 (+29 %) 64 1557888 (+30 %) We see a 20% improvement in throughput on UDP send and 30% on raw socket send. [ Add sparc syscall entries. -DaveM ] Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
1c5cae815d
commit
228e548e60
16
net/compat.c
16
net/compat.c
@@ -722,11 +722,11 @@ EXPORT_SYMBOL(compat_mc_getsockopt);
|
||||
|
||||
/* Argument list sizes for compat_sys_socketcall */
|
||||
#define AL(x) ((x) * sizeof(u32))
|
||||
static unsigned char nas[20] = {
|
||||
static unsigned char nas[21] = {
|
||||
AL(0), AL(3), AL(3), AL(3), AL(2), AL(3),
|
||||
AL(3), AL(3), AL(4), AL(4), AL(4), AL(6),
|
||||
AL(6), AL(2), AL(5), AL(5), AL(3), AL(3),
|
||||
AL(4), AL(5)
|
||||
AL(4), AL(5), AL(4)
|
||||
};
|
||||
#undef AL
|
||||
|
||||
@@ -735,6 +735,13 @@ asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, uns
|
||||
return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||
unsigned vlen, unsigned int flags)
|
||||
{
|
||||
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)
|
||||
{
|
||||
return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
@@ -780,7 +787,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
|
||||
u32 a[6];
|
||||
u32 a0, a1;
|
||||
|
||||
if (call < SYS_SOCKET || call > SYS_RECVMMSG)
|
||||
if (call < SYS_SOCKET || call > SYS_SENDMMSG)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(a, args, nas[call]))
|
||||
return -EFAULT;
|
||||
@@ -839,6 +846,9 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
|
||||
case SYS_SENDMSG:
|
||||
ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
|
||||
break;
|
||||
case SYS_SENDMMSG:
|
||||
ret = compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]);
|
||||
break;
|
||||
case SYS_RECVMSG:
|
||||
ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user