netlink-socket: Do not make flow_dump block on netlink socket.
authorAlex Wang <alexw@nicira.com>
Fri, 18 Jul 2014 21:27:36 +0000 (14:27 -0700)
committerAlex Wang <alexw@nicira.com>
Sat, 19 Jul 2014 00:30:17 +0000 (17:30 -0700)
Commit 93295354 (netlink-socket: Simplify multithreaded dumping
to match Linux reality.) makes the call to recvmsg() block if no
messages are available.  This can cause revalidator threads hanging
for long time or even deadlock when main thread tries to stop the
revalidator threads.

This commit fixes the issue by enabling the MSG_DONTWAIT flag in
the call to recvmsg().

Signed-off-by: Alex Wang <alexw@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/netlink-socket.c

index b1e6804..09d3a61 100644 (file)
@@ -724,9 +724,15 @@ nl_dump_refill(struct nl_dump *dump, struct ofpbuf *buffer)
     int error;
 
     while (!ofpbuf_size(buffer)) {
-        error = nl_sock_recv__(dump->sock, buffer, true);
+        error = nl_sock_recv__(dump->sock, buffer, false);
         if (error) {
-            /* The kernel shouldn't return EAGAIN while there's data left. */
+            /* The kernel never blocks providing the results of a dump, so
+             * error == EAGAIN means that we've read the whole thing, and
+             * therefore transform it into EOF.  (The kernel always provides
+             * NLMSG_DONE as a sentinel.  Some other thread must have received
+             * that already but not yet signaled it in 'status'.)
+             *
+             * Any other error is just an error. */
             return error == EAGAIN ? EOF : error;
         }