net: Introduce recvmmsg socket syscall
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 13 Oct 2009 06:40:10 +0000 (23:40 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Oct 2009 06:40:10 +0000 (23:40 -0700)
commita2e2725541fad72416326798c2d7fa4dafb7d337
tree6174be11da607e83eb8efb3775114ad4d6e0ca3a
parentc05e85a06e376f6b6d59e71e5333d707e956d78b
net: Introduce recvmmsg socket syscall

Meaning receive multiple messages, reducing the number of syscalls and
net stack entry/exit operations.

Next patches will introduce mechanisms where protocols that want to
optimize this operation will provide an unlocked_recvmsg operation.

This takes into account comments made by:

. Paul Moore: sock_recvmsg is called only for the first datagram,
  sock_recvmsg_nosec is used for the rest.

. Caitlin Bestler: recvmmsg now has a struct timespec timeout, that
  works in the same fashion as the ppoll one.

  If the underlying protocol returns a datagram with MSG_OOB set, this
  will make recvmmsg return right away with as many datagrams (+ the OOB
  one) it has received so far.

. RĂ©mi Denis-Courmont & Steven Whitehouse: If we receive N < vlen
  datagrams and then recvmsg returns an error, recvmmsg will return
  the successfully received datagrams, store the error and return it
  in the next call.

This paves the way for a subsequent optimization, sk_prot->unlocked_recvmsg,
where we will be able to acquire the lock only at batch start and end, not at
every underlying recvmsg call.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
25 files changed:
arch/alpha/kernel/systbls.S
arch/arm/kernel/calls.S
arch/avr32/kernel/syscall_table.S
arch/blackfin/mach-common/entry.S
arch/ia64/kernel/entry.S
arch/microblaze/kernel/syscall_table.S
arch/mips/kernel/scall32-o32.S
arch/mips/kernel/scall64-64.S
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/sh/kernel/syscalls_64.S
arch/sparc/kernel/systbls_32.S
arch/sparc/kernel/systbls_64.S
arch/x86/ia32/ia32entry.S
arch/x86/include/asm/unistd_32.h
arch/x86/include/asm/unistd_64.h
arch/x86/kernel/syscall_table_32.S
arch/xtensa/include/asm/unistd.h
include/linux/net.h
include/linux/socket.h
include/linux/syscalls.h
include/net/compat.h
kernel/sys_ni.c
net/compat.c
net/socket.c