diff --git a/[refs] b/[refs] index c4ad08e00a06..cd1226efb5de 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f49c57e141c7f53353e4265a31dc2324e6215037 +refs/heads/master: 71c5c1595c04852d6fbf3c4882b47b30b61a4d32 diff --git a/trunk/include/linux/socket.h b/trunk/include/linux/socket.h index 7b3aae2052a6..354cc5617f8b 100644 --- a/trunk/include/linux/socket.h +++ b/trunk/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_FIN diff --git a/trunk/net/socket.c b/trunk/net/socket.c index 769c386bd428..f55ffe9f8c87 100644 --- a/trunk/net/socket.c +++ b/trunk/net/socket.c @@ -2135,6 +2135,10 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, break; ++datagrams; + /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */ + if (flags & MSG_WAITFORONE) + flags |= MSG_DONTWAIT; + if (timeout) { ktime_get_ts(timeout); *timeout = timespec_sub(end_time, *timeout);