Re: [PATCH] Add MSG_WAITFORONE flag to recvmmsg
From: Eric Dumazet <hidden>
Date: 2010-03-26 22:44:38
Also in:
lkml
Le vendredi 26 mars 2010 à 17:35 -0500, Brandon L Black a écrit :
From: Brandon L Black <redacted> Add new flag MSG_WAITFORONE for the recvmmsg() syscall. When this flag is specified for a blocking socket, recvmmsg() will only block until at least 1 packet is available. The default behavior is to block until all vlen packets are available. This flag has no effect on non-blocking sockets or when used in combination with MSG_DONTWAIT. Signed-off-by: Brandon L Black <redacted>
quoted hunk ↗ jump to hunk
---diff --git a/include/linux/socket.h b/include/linux/socket.h index 7b3aae2..354cc56 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h@@ -255,6 +255,7 @@ struct ucred { #define MSG_ERRQUEUE 0x2000 /* Fetch message from error queue */ #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ #define MSG_MORE 0x8000 /* Sender will send more */ +#define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ #define MSG_EOF MSG_FINdiff --git a/net/socket.c b/net/socket.c index 769c386..33304d1 100644 --- a/net/socket.c +++ b/net/socket.c@@ -2133,7 +2133,10 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, if (err) break; - ++datagrams; + + /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */ + if (!datagrams++ && (flags & MSG_WAITFORONE)) + flags |= MSG_DONTWAIT;
Hmmm, no need to test !datagram, just do : ++datagrams; if (flags & MSG_WAITFORONE) flags |= MSG_DONTWAIT;